• 【Codeforces 475F】—Meta-universe(Set)


    传送门

    考虑从x,yx,y一起从外向内扫
    找到第一个可以分开的地方就分开
    复杂度是O(nlog2n)O(nlog^2n)

    开始手写了个结构体莫名一直RERE
    换成pairpair重写了一次就过了

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<20|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ob==ib)?EOF:*ib++;
    }
    #define gc getchar
    inline int read(){
        char ch=gc();
        int res=0,f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    #define ll long long
    #define re register
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    #define cs const
    #define bg begin
    #define rbg rbegin
    cs int N=100005;
    pii p[N];
    inline pii swp(cs pii &fi){
    	return pii(fi.se,fi.fi);
    }
    #define IT set<pii>::iterator
    #define rIT set<pii>::reverse_iterator
    inline int solve(set<pii> &st1,set<pii> &st2){
    	if(st1.size()==1)return 1;
    	IT lx=st1.bg();rIT rx=st1.rbg();
    	IT ly=st2.bg();rIT ry=st2.rbg();
    	IT End=st1.end();End--;
    	while(lx!=End){
    		int pre=(*lx).fi,now;
    		lx++,now=(*lx).fi;
    		if(now-pre>1){
    			set<pii> st3,st4;
    			while((*st1.bg()).fi<=pre){
    				pii xx=*st1.bg();
    				st3.insert(xx),st4.insert(swp(xx));
    				st1.erase(xx),st2.erase(swp(xx));
    			}
    			return solve(st3,st4)+solve(st1,st2);
    		}
    		pre=(*rx).fi;
    		rx++,now=(*rx).fi;
    		if(pre-now>1){
    			set<pii> st3,st4;
    			while((*st1.rbg()).fi>=pre){
    				pii xx=*st1.rbg();
    				st3.insert(xx),st4.insert(swp(xx));
    				st1.erase(xx),st2.erase(swp(xx));
    			}
    			return solve(st3,st4)+solve(st1,st2);
    		}
    		pre=(*ly).fi;
    		ly++,now=(*ly).fi;
    		if(now-pre>1){
    			set<pii> st3,st4;
    			while((*st2.bg()).fi<=pre){
    				pii xx=*st2.bg();
    				st3.insert(swp(xx)),st4.insert(xx);
    				st1.erase(swp(xx)),st2.erase(xx);
    			}
    			return solve(st3,st4)+solve(st1,st2);
    		}
    		pre=(*ry).fi;
    		ry++,now=(*ry).fi;
    		if(pre-now>1){
    			set<pii> st3,st4;
    			while((*st2.rbg()).fi>=pre){
    				pii xx=(*st2.rbg());
    				st3.insert(swp(xx)),st4.insert(xx);
    				st1.erase(swp(xx)),st2.erase(xx);
    			}
    			return solve(st3,st4)+solve(st1,st2);
    		}
    	};
    	return 1;
    }
    set<pii> st1;
    set<pii> st2;
    int n;
    int main(){
    	n=read();
    	for(int i=1;i<=n;i++){
    		p[i].fi=read(),p[i].se=read();
    		st1.insert(p[i]);
    		st2.insert(swp(p[i]));
    	}
    	cout<<solve(st1,st2)<<'
    ';
    }
    
  • 相关阅读:
    pug模板引擎(原jade)之 分支条件
    pug模板引擎(原jade)之 属性
    hosts的作用
    typeScript 之 (7) 构造函数和this
    typeScript 之 (8) 继承,重写,super
    typeScript 之(6) 类的简介
    MySQL:一条更新语句是如何执行的
    Centos7 使用 Kubeadm 搭建 k8s 集群
    HTTP Keep-Alive模式客户端与服务器如何判定传输完成
    MySQL:一条SQL是如何执行的
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328556.html
Copyright © 2020-2023  润新知