专栏文章
题解:CF1980F1 Field Division (easy version)
CF1980F1题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min0ywax
- 此快照首次捕获于
- 2025/12/01 18:47 3 个月前
- 此快照最后确认于
- 2025/12/01 18:47 3 个月前
首先可以发现只有两种边界:延续之前的填法,或者顶着当前喷泉选。这一点是好证的,从样例解释也可看出。
考虑哪些喷泉会被顶着选:不存在 比它大的喷泉, 比它小。这说明如果按 排序,他的 一定是后缀最小值。
知道怎么填这个题就做完了,第二问 说明它是严格后缀最小值。
code
CPP#include <bits/stdc++.h>
#define int long long
#define umap unordered_map
#define vint vector<int>
#define ll long long
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define ull unsigned long long
#define uint unsigned int
#define rg register
#define il inline
#define db double
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define sqr(x) ((x)*(x))
using namespace std;
const int INF=0x3f3f3f3f,mod=1e9+7;
const long long INFL=0x3f3f3f3f3f3f3f3f;
const double eps=1e-8;
il int read(){
int w=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
w=(w<<1)+(w<<3)+(ch^48);
ch=getchar();
}
return w*f;
}
il void chkmax(pii &x,pii y){x=(x<y)?y:x;}
il void chkmin(pii &x,pii y){x=(x>y)?y:x;}
const int N=2e5+10;
int n,m,K;
int r[N],c[N],tmp[N],p;
bool flag[N];
pii a[N];
void solve(){
cin>>n>>m>>K;
fill(flag+1,flag+K+1,0),fill(a+1,a+K+1,make_pair(INF,INF));
p=K;
rep(i,1,K){
tmp[i]=r[i]=read(),c[i]=read();
}
sort(tmp+1,tmp+p+1);
p=unique(tmp+1,tmp+p+1)-tmp-1;
rep(i,1,K){
int v=lower_bound(tmp+1,tmp+p+1,r[i])-tmp;
chkmin(a[v],make_pair(c[i],i));
}
int ans=0,x=n,minn=m+1,pos=0;
per(i,p,1){
if(a[i].first<minn){
ans+=(x-tmp[i])*(minn-1);
minn=a[i].first,pos=a[i].second;
flag[pos]=1,x=tmp[i];
}
else ans+=(x-tmp[i])*(minn-1),x=tmp[i];
}
ans+=(minn-1)*x;
cout<<ans<<"\n";
rep(i,1,K) cout<<flag[i]<<" ";
puts("");
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T=read();
while(T--){
solve();
}
#ifndef ONLINE_JUDGE
fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...