题解:P13959 [ICPC 2023 Nanjing R] 计数器
题解:P13959 [ICPC 2023 Nanjing R] 计数器
挺好的思维题。
利用结构体排序,使 \(a_i \ge a_{i-1}\),即使数列单调递增。
首先,必定不存在 \(a_i=a_{i-1}\) 且 \(b_i \neq b_{i-1}\)。此时必定无解。
然后考虑清空操作。清空操作之后必定有足够的 + 操作达到下一个 \(b_i\)。因为每一次 + 操作的贡献值为 \(1\),所以有:
\[a_{i}-a_{i-1}-1 \ge b_i
\]
接下来考虑不清空的操作。根据 + 的贡献和 c 的贡献的性质,又因为数列单调递增,所以操作序号的差值等于结果的差值。所以有:
\[a_{i}-a_{i-1}=b_{i}-b_{i-1}
\]
所以无解当且仅当如下情况:
- \(a_i=a_{i-1}\) 且 \(b_i \neq b_{i-1}\)。
- \(a_{i}-a_{i-1}-1 < b_i\)
- \(a_{i}-a_{i-1} \neq b_{i}-b_{i-1}\)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll T;
struct Node{
ll f;
ll s;
}c[N];
bool cmp(Node a,Node b){
return a.f<b.f;
}
void slove(){
ll n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>c[i].f>>c[i].s;
}
sort(c+1,c+1+m,cmp);
for(int i=1;i<=m;i++){
if(c[i].f==c[i-1].f&&c[i].s!=c[i-1].s){
cout<<"No"<<endl;
return;
}
else if(c[i].f-c[i-1].f-1<c[i].s&&c[i].f-c[i-1].f!=c[i].s-c[i-1].s){
cout<<"No"<<endl;
return;
}
}
cout<<"Yes"<<endl;
}
int main(){
cin>>T;
while(T--){
slove();
}
return 0;
}

浙公网安备 33010602011771号