P13959 [ICPC 2023 Nanjing R] 计数器 题解
题目传送门
前置知识:STL。
为了方便,我们使用 set 和 map 进行存储。
这样,set 让 aaa 数组的元素有序,要取某个元素使用 map 访问即可,避免了开桶被 nnn 卡,并且不用另外开数组保存了。
这一部分的代码:
for(int i=1;i<=m;i++){a=read(),b=read();mp[a]=b;s.insert(a);
}
枚举每一个 aia_iai,容易发现,能够进行操作的次数是 ai−ai−1a_i - a_{i-1}ai−ai−1,a0=0a_{0} = 0a0=0,那么我们发现这些操作分两大类,第一类:先变 000,再更改;第二类:直接累加。当我们发现现在不能够操作时,直接输出。这样避免枚举 nnn 超时。
代码:
#include<bits/stdc++.h>
using namespace std;
int read() {int x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') {f=-1;}c=getchar();}while(isdigit(c)) {x=x*10+c-'0';c=getchar();}return x*f;
}
int main(){int _=read(),n,m,a,b,now,tmp;while(_--){n=read(),m=read();bool f=1;map<int,int> mp;set<int> s;for(int i=1;i<=m;i++){a=read(),b=read();mp[a]=b;s.insert(a);}now=tmp=0;mp[0]=0;for(auto i:s){if(mp[i]==0){now=tmp=0;continue;}if(now+(i-tmp)!=mp[i]&&i-tmp-1<mp[i]){putchar('N'),putchar('o'),putchar('\n');f=0;break;}tmp=i;now=mp[i];}if(f) putchar('Y'),putchar('e'),putchar('s'),putchar('\n');}return 0;
}