题解:P13959 [ICPC 2023 Nanjing R] 计数器

题解:P13959 [ICPC 2023 Nanjing R] 计数器

Link

挺好的思维题。

利用结构体排序,使 \(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;
}
posted @ 2025-09-07 21:42  M1_Byte  阅读(10)  评论(0)    收藏  举报