专栏文章

题解:CF1980F1 Field Division (easy version)

CF1980F1题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min0ywax
此快照首次捕获于
2025/12/01 18:47
3 个月前
此快照最后确认于
2025/12/01 18:47
3 个月前
查看原文
首先可以发现只有两种边界:延续之前的填法,或者顶着当前喷泉选。这一点是好证的,从样例解释也可看出。
考虑哪些喷泉会被顶着选:不存在 xx 比它大的喷泉,yy 比它小。这说明如果按 xx 排序,他的 yy 一定是后缀最小值。
知道怎么填这个题就做完了,第二问 ai=1a_i = 1 说明它是严格后缀最小值。
codeCPP
#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 条评论,欢迎与作者交流。

正在加载评论...