NOIP2017 赛前模拟 7.24

从CSP-S到NOIP:一个OIer的284天真实心路历程与避坑指南 本文分享了一位OIer从CSP-S到NOIP的284天真实心路历程与避坑指南,涵盖了竞赛与学业的平衡、Linux环境适应、心理韧性训练、健康管理等多个关键方面。特别适合正在备战信息学竞赛的选手参考,帮助他们在竞赛中避免常见错误,提升效率与心理素质。 阅读详情

本次考试三道题据出题人的意思都是模板题,T1单调队列模板,T2数位DP模板,T3线段树模板,但由于前两个模板都不熟悉,考试的时候不敢写,线段树也写炸了,最后只有50分。

T1:
题目描述:
在一个包含 n 个元素的数组上,有一个长度为 k 的窗户在从左向右滑动。窗户每滑动到一个位置,我们都可以看到 k 个元素在窗户中。如下的例子所示,假设数组为 [1 3 -1 -3 5 3 6 7],而 k 等于 3 :
这里写图片描述

输入格式
输入的第一行包括两个整数 n,k ,n 表示数组的长度,k 表示窗户的长度。
接下来一行包括 n 个整数,表示这个 n 个元素的数组。

输出格式
输出包含两行,每行包括 n-k+1 个整数。
第一行表示窗户从左到右滑动过程中的最小值。
第二行表示窗户从左到右滑动过程中的最大值。

备注
【数据范围】
对于 100% 的数据,3<=n<=1000000,1<=k<=n,数组中的每个元素均在 int 范围内。

题意:每次选k个数,统计最大值和最小值。所以在我无法打出正解时,想到线段树的区间查询,勉强得了50分,DZY也是线段树但A了,我也没办法。

正解:维护两个单调队列,里面存的是最小值和最大值的下标,一个是维护最小值,一个是维护最大值。每次打新的数压入队尾,先考虑维护最小值的队列,如果前面的数比他还大,说明这些数都无法对答案产生共贡献,就直接r- - (队尾的编号),就将其往前移,最大值也是如此

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<cctype>
using namespace std;
const int N =1e6+5;
int n,k,q1[N],q2[N],a[N],ans1[N],ans2[N],buf[1000];
//---------------------
inline int Readint()
{
    int i=0,f=1; char ch;
    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    if(ch=='-') f=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<1)+(i<<3)+ch-'0';
    return i*f;
}
//---------------------
inline void W(int x) //这道题因为数据比较大,输出优化
{
    if(!x){putchar('0');return;}
    if(x<0){putchar('-');x=-x;}
    while(x)buf[++buf[0]]=x%10,x/=10;
    while(buf[0])putchar('0'+buf[buf[0]--]);
}
//---------------------
int main()
{
    freopen("window.in","r",stdin);
    //freopen("window.out","w",stdout);

    n=Readint(),k=Readint();
    for(int i=1;i<=n;i++) a[i]=Readint();
    int l1=0,l2=0,r1=1,r2=1;
    for(int i=1;i<=n;i++){
        while(l1<=r1 && q1[l1]<=i-k) l1++; //最小值的队列
        while(l2<=r2 && q2[l2]<=i-k) l2++; //最大值的队列 
        while(l1<=r1 && a[i]<=a[q1[r1]]) r1--; //比他小就一直减
        q1[++r1]=i;
        while(l2<=r2 && a[i]>=a[q2[r2]]) r2--; //比他大就一直减
        q2[++r2]=i;
        ans1[i]=a[q1[l1]];
        ans2[i]=a[q2[l2]];
    }
    for(int i=k;i<=n;i++) W(ans1[i]),putchar(' ');
    cout<<endl;
    for(int i=k;i<=n;i++) W(ans2[i]),putchar(' ');
    return 0;
}

T2: 裸的数位DP
题目描述:
CLC NOIP2015 惨跪,他依稀记得他的准考证号是 37(其实是假的),现在CLC又将要面临一场比赛,他希望准考证号不出现 37(连续),同时他又十分讨厌 4 ,所以也不希望 4 出现在准考证号中。现在他想知道在 A 和 B 之间有多少合法的准考证号

数位Dp 不解释了

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iomanip>
#include<iostream>
#include<cmath>
#include<ctime>
#include<cctype>
using namespace std;
int x,y,a[20],dp[20][2];
//---------------------
inline int Readint()
{
    int i=0,f=1; char ch;
    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    if(ch=='-') f=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<1)+(i<<3)+ch-'0';
    return i*f;
}
//---------------------
/*
pos是当前枚举到的位数,pre为前一位的数,为了判断是否为3,sta为当前的状态,limit是判断最大能不能枚举到9;
*/
//---------------------
inline int dfs(int pos,int pre,int sta,int limit) 
{
    if(pos==-1) return 1;
    if(!limit && dp[pos][sta]!=-1) return dp[pos][sta];
    int up= limit ? a[pos] : 9;
    int tmp=0;
    for(int i=0;i<=up;i++){
        if(pre==3 && i==7) continue;
        if(i==4) continue;
        tmp+=dfs(pos-1,i,i==3,limit && i==a[pos]);
    }
    if(!limit) dp[pos][sta]=tmp;
    return tmp;
}
//---------------------
inline int solve(int x)
{
    int pos=0;
    while(x) //算出每一位数
    {
        a[pos++]=x%10;
        x=x/10;
    }
    return dfs(pos-1,-1,0,true);
}
//---------------------
int main()
{
    x=Readint(),y=Readint();
    memset(dp,-1,sizeof(dp));
    cout<<solve(y)-solve(x-1); //统计[0,y]和[0,x-1]的值相减
    return 0;
}

T3:
题目描述:
万恶的大头又出现了!他正在玩一个智障游戏:打怪兽。

现在大头的屏幕上出现了一排怪兽,每只怪兽头上有一个血条,每次大头可以选择一个区间进行攻击,攻击值为 K ,这个区间中血量小于 K 的怪兽都会被大头无情地干掉,当然怪兽不会坐以待毙,对于一个区间的怪兽,他们会在某个时刻血量同时加 X 。

头头虽然很大,但是 IQ 并不高,在座的各位选手都不知道比他高到哪里去了。这个时候大头使出了大招——作弊器,然而大头的作弊器并不高级只能将选择的区间内血量为 7 的倍数的怪兽干掉,问:他能干掉多少怪兽?

输入格式
第一行一个正整数 n ;
接下来 n 行 n 个整数;
再接下来一个正整数 Q ,表示操作的个数;
接下来 Q 行每行若干个整数。如果第一个数是 add ,后接 3 个正整数 a,b,X,表示在区间 [a,b] 内每个数增加 X,如果是 count,表示统计区间 [a,b] 能被 7 整除的个数。

正解:线段树打标记,统计每个区间内数值与7取模和 为 0,1,2,3,4,5,6 的个数 ,最后只用暑促余数为0的个数即可

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<cctype>
using namespace std;
const int N = 1e5+5;
int a[N],n,m,x,y,z,num;
int sum[N<<2][10],add[N<<2],tmp[10];
char s[10];
//---------------------
inline int Readint()
{
    int i=0,f=1; char ch;
    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    if(ch=='-') f=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<1)+(i<<3)+ch-'0';
    return i*f;
}
//---------------------
inline void update(int root)
{
    for(int i=0;i<=6;i++)
      sum[root][i]=sum[root<<1][i]+sum[root<<1|1][i];
}
//---------------------
inline void mode(int k,int x)
{
    memset(tmp,0,sizeof(tmp));
    for(int i=0;i<=6;i++) tmp[i]=sum[k][i];
    for(int i=0;i<=6;i++) sum[k][(i+x)%7]=tmp[i];
}
//---------------------
void Pushdown(int k)
{
    if(add[k])
    {
        add[k<<1]=(add[k<<1]+add[k])%7,mode(k<<1,add[k]);
        add[k<<1|1]=(add[k<<1|1]+add[k])%7,mode(k<<1|1,add[k]);
        add[k]=0;
    }
}
//---------------------
void build(int k,int l,int r)
{
    if(l==r)
    {
        sum[k][a[l]]++;
        return;
    }
    int mid=l+r>>1;
    build(k<<1,l,mid),build(k<<1|1,mid+1,r);
    update(k);
}
//---------------------
void modify(int k,int l,int r,int x,int y,int v)
{
    if(x<=l&&r<=y)
    {
        memset(tmp,0,sizeof(tmp));
        mode(k,v);
        add[k]=(add[k]+v)%7;
        return;
    }
    Pushdown(k);
    int mid=l+r>>1;
    if(y<=mid)modify(k<<1,l,mid,x,y,v);
    else if(x>mid)modify(k<<1|1,mid+1,r,x,y,v);
    else modify(k<<1,l,mid,x,mid,v),modify(k<<1|1,mid+1,r,mid+1,y,v);
    update(k);
}
//---------------------
inline int Query(int k,int l,int r,int x,int y)
{
    if(x<=l&&r<=y) return sum[k][0];
    Pushdown(k);
    int mid=(l+r)>>1;
    if(y<=mid)  return Query(k<<1,l,mid,x,y);
    else if(x>mid) return Query(k<<1|1,mid+1,r,x,y);
    else return Query(k<<1,l,mid,x,y)+Query(k<<1|1,mid+1,r,x,y);
}
//---------------------
int main()
{
    freopen("seg.in","r",stdin);
    //freopen("seg.out","w",stdout);

    n=Readint();
    for(int i=1;i<=n;i++) a[i]=Readint()%7;
    build(1,1,n);
    m=Readint();
    for(int i=1;i<=m;i++){
        scanf("%s",s);
        if(s[0]=='a'){
            x=Readint(),y=Readint(),z=Readint()%7;
            modify(1,1,n,x,y,z);
        }
        if(s[0]=='c') {
            x=Readint(),y=Readint();
            cout<<Query(1,1,n,x,y)<<endl;
        }
    }
    return 0;
}
从专利库到Zemax:一个6mm定焦镜头从零到交付的完整设计流程(含CodeV转换技巧) 本文详细介绍了6mm定焦镜头从专利库检索到最终交付的全流程设计,重点解析了CodeV与Zemax工具链的无缝衔接技巧。通过实际案例展示规格定义、专利筛选、结构适配、非球面优化等关键步骤,帮助光学设计工程师提升设计效率和制造良率。特别包含CodeV转换Zemax的实用技巧,适用于机器视觉和安防镜头开发。 阅读详情

相关推荐

MAX96717实战:如何选择Host-to-Peripheral和Pass-Through I2C模式?附配置代码

本文深入解析MAX96717芯片的两种关键I2C模式:Host-to-Peripheral与Pass-Through。通过对比其核心差异、硬件连接考量及软件配置代码,为嵌入式开发者提供了清晰的模式选择策略与实战指南,帮助优化系统设计并避免常见通信故障。

weixin_29190573的博客 461

Khronostasis Katharsis

n个气球被栓在水平地面上,初始高度均为0米,初始时刻记为第0秒。每个气球被剪断栓绳后会匀速上升,第i个气球每秒上升vi​米。现在已知第i个气球会在第ti​秒时被剪断栓绳,问第T秒时最高的气球中编号最小的一个的编号。

Pretty Boy Fox的博客 1736

电网渗透之终端安全

        电力系统安全不仅关系到电网的稳定运行,也关系到国家能源安全和国计民生,甚至关系到国家的安全和利益,电力系统由于结构复杂多样、分布广泛、重要性高,一旦系统瘫痪影响巨大,因此,极容易成为敌对势力攻击的首选目标。随着信息安全暴露面迅速增加,将给公司网络安全防线带来严峻挑战。       监控、保障这些电力系统安全运行变的尤为重要。内部安全防护产品有防火墙、纵向加密、反向隔离设备等...

guapi007008的博客 2722

【双端队列】滑动的窗户 window

滑动的窗户 window.pas/c/cpp 3S/256MB 【题目描述】        在一个包含n个元素的数组上,有一个长度为k的窗户在从左向右滑动。窗户每滑动到一个位置,我们都可以看到k个元素在窗户中。如下的例子所示,假设数组为 [1 3 -1 -3 5 3 6 7],而k等于3:   窗户位置 最小值 最大值 [1  3

Jiangzh_MZOI 672

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

[STM32H750]HAL库下FMC驱动正点原子MCU屏的移植与优化

本文详细介绍了在STM32H750平台上使用HAL库移植与优化正点原子MCU屏幕驱动的完整过程。重点解析了FMC硬件配置、Cache一致性处理、精确延时实现等关键技术难点,提供了实用的移植方案和性能优化技巧,帮助开发者高效解决屏幕显示问题。

rock5的博客 286

[NOIP模拟][POJ 2823][单调队列]滑动的窗户(Sliding Window)

题目描述: 题目链接: POJ 2823 http://poj.org/problem?id=2823 在一个包含 n 个元素的数组上,有一个长度为 k 的窗户在从左向右滑动。窗户每滑动到一个位置,我们都可以看到 k 个元素在窗户中。如下的例子所示,假设数组为 [1 3 -1 -3 5 3 6 7],而 k 等于 3 : 对于窗户滑动过的每个位置,请给出窗户内 k 个元素的最小值和最大值

千古的博客 610

实战|mitmproxy+Playwright 拦截篡改Cloudflare验证流程,实现无感爬取(2026实测可用)

2026年对抗Cloudflare,别再死磕滑块、轨迹、算法。高伪装浏览器 + 中间层劫持篡改验证流程Playwright + mitmproxy = 无感过CF这篇是纯实战、无废话、可直接上线的方案。你只要把目标网站、cf_clearance填进去,就能跑通。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1284

模拟赛 滑动的窗户(时间限制:3s;空间限制256MB)

题目描述 在一个包含n个元素的数组上,有一个长度为k的窗户在从左向右滑动。窗户每滑动到一个位置,我们都可以看到k个元素在窗户中。如下的例子所示,假设数组为 [1 3 -1 -3 5 3 6 7],而k等于3: 窗户位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 3 1 3 [-1 -3 5] 3 6 7 -3 5

jjs98 867

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

MIKE的模拟结果dfsu文件的数据是可以导出的,导出格式为xyz,我们也可以将其改后缀改为txt文本格式,其中包含了某一时刻下所有网格坐标点的数据。

晏长街的博客 4410

CSP-J2019普及组复赛T4:加工零件

CSP-J2020普及组复赛T1:优秀的拆分,广度优先遍历求最短路。

少儿编程乔老师 1854

NOIP模拟题

NOIP模拟 字符串操作 并查集 树状数组 单调队列

Gvolv 1853

安卓手机强制清理数据恢复出厂设置后无法设置密码怎么办?(分享亲身经历的有效解决方案)

📱安卓手机强制清数据恢复出厂设置后,竟无法设置锁屏密码!本文将解析问题根源,分享亲测有效的解决方案,帮你快速摆脱困扰🎉

XiaoqiangClub的博客 242

NOIP赛前必看!!!

NOIP赛前必看!

Demilly123的博客 275

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

2018NOIP初赛体验

今天(其实已经是昨天了)刚结束NOIP初赛,这对大佬们来说只是走一个过场,但对本蒟蒻来说就事关生死了,毕竟去年身为高一大龄选手(其实刚学一个月)初赛没过的丢人经历仍历历在目,没办法,我JS省情如此。就趁热打铁(其实已经过了8个小时了)写篇博客记录一下吧。 一、赛前 其实虽然之前一直说担心初赛滚粗,要提前半个月开始复习balabala,但是按本人的颓性还是按照惯例,在初赛前两天才开始系统复习。 周四...

SoochowWzh的博客 3918

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

NOIP2021游记

NOIP2021游记 Day -? CSP 之后,NOIP 之前,常州爆发了单日新增 3 例的疫情,不过后来就一直没有新的病例,当然为此也实行了 1 周的在家学习。 这段时间参加了 nfls 的模拟赛,一直被吊打,也基本明白这次 NOIP 并不抱有太多希望。 短暂的居家学习结束离 NOIP 的开始也仅有 1 周的时间了。 这一周中,关于期中考试的假消息不断。开始说是 NOIP 前 2 天考,后来...

ZHK's blog 110

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NOIP2016游记&&OI再见

NOIP滚粗,OI再见

zhaoyh2000的博客 2170

NOIP前必须记住的30句话(有补充)

1.比赛前一天晚上请准备好你的各种证件,事先查好去往考场的路线。 2.比赛之前请先调整你的屏幕分辨率到你喜欢的大小。 3.比赛之前请把编译器的字体调为你平时惯用的字体,尤其是注意这种字体中的逗号,点,1,l 这种易混淆的字是不是区分明显。 4.在不影响视野的情况下,请将字号尽可能调大,方便查错. 压缩包或许还不能解压,但是文件名已经可以知道了,在选手目录下用代码模板建好所有文件,包 括.c/

XiaoZheng的博客 1万+

[NOIP补坑计划]NOIP2017 题解&做题心得

终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐*出题人 证明见这篇博客 1 #include<algorithm> 2 #include<iostream> 3 #include<cst...

weixin_30768175的博客 144

NOIp注意事项

1.比赛前一天晚上请准备好你的各种证件,事先查好去往考场的路线。 2.比赛之前请先调整你的屏幕分辨率到你喜欢的大小。 3.比赛之前请把编译器的字体调为你平时惯用的字体,尤其是注意这种字体中的逗号,点,1,l 这种易混淆的字是不是区分明显。 4.在不影响视野的情况下,请将字号尽可能调大,方便查错. 压缩包或许还不能解压,但是文件名已经可以知道了,在选手目录下用代码模板建好所有文件,包 括.c/...

岂曰无衣,与子同袍 998

NOIP模拟赛 篮球比赛1

篮球比赛1(basketball1.*) Czhou为了提高机房里各种神牛的身体素质,决定在每次训练后举行篮球比赛。为了保持比赛公平,Czhou要将神牛们分成两队。首先神牛们赛前都要排成固定的队伍;然后Czhou将队伍分成一半(前一半和后一半队伍人数可以不等),再分别从两个队伍中选出一些人进行篮球比赛。为了保持公平性,Czhou要求第一个队伍参加比赛的神牛能力的XOR值等于第二...

590

[NOIP赛前冲刺第一期]初赛基础知识归纳

关于计算机 1.CPU 中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心(Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。 中央处理器主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和高...

dcxa92155的博客 167

牛客网NOIP赛前集训营-普及组

第一场: A-绩点 题目描述 小A刚考完大学考试。现在已经出了n门课的成绩,他想自己先算一下这些课的绩点是多少。设第i门课的他拿到的绩点是gpai,而这门课的学分是sci,那么他的总绩点用下面的公式计算: , 换言之,设S为sci的和,T为gpai与sci的乘积的和。那么小A的绩点就是T除以S的值。 ...

weixin_30608503的博客 406

2020牛客NOIP赛前集训提高组#6-B-艰难睡眠(RMQ,单调队列)

题目描述 样例 input: 3 6 3 1 1 3 2 4 3 0 1 2 7 1 2 1 2 0 3 4 5 7 9 5 0 4 6 output: 4 PS: 本题需快读,若采用出题人给的快读,需要从文件读入,测试的时候要freopen,但是提交的时候不用。 分析 由于对于每个吵闹的人,可以算出从iii开始睡觉的情况下,这个吵闹的人需要被调到那个区间开始吵。设其他量与题目描述一致,lenlenlen表示吵闹的人可以开始吵闹的区间SSS的大小,则易得: len=m−k−bi+1len=m-k-b_i+1

ZCETHAN 的博客 259

NOIP2020前的准备&记录总结

CSP-S前的垂死挣扎 已经高一了…… 第三次打提高组了 还是要加油啊 10.6 这两天打算把初赛和文化课搞一搞 题目等初赛和一检后再写 文化课真好玩嘿嘿嘿

lahlah的博客 659

【XJOI-NOIP16提高模拟训练9】题解。

http://www.hzxjhs.com:83/contest/55 说实话这次比赛真的很水。。然而我只拿了140分,面壁反思。 第一题: 发现数位和sum最大就是9*18,k最大1000,那么sum*k最大不过2*10^5,若能被x整除,则x也不超过200000,暴力即可。 不知道学军OIlonglong用%I64d还是%lld输入,用了%I64d爆零。。改成lld就AC了。 ...

weixin_30651273的博客 93
上一篇: NOIP2017 7.17模拟 Minimum (最短路+最小生成树)
下一篇: 倍增法求 LCA
Amessal
博客等级 码龄10年 9粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值