CodeForces 22D Segments 排序水题

来源:互联网 发布:广州恒大淘宝队 编辑:程序博客网 时间:2024/05/16 06:34

题目链接:点击打开链接

右端点升序,取右端点

暴力删边

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <iostream>#include <map>#include <set>#include <math.h>using namespace std;#define inf 10000000#define ll int#define N 2105#define L(x) (x<<1)#define R(x) (x<<1|1)inline ll Mid(ll a,ll b){return (a+b)>>1;}ll n;struct node{ll x,y;}a[N];bool cmp(node a,node b){if(a.y==b.y)return a.x<b.x;return a.y<b.y;}vector<ll>ans;ll h[N];int main(){ll i, j;while(~scanf("%d",&n)){for(i=1;i<=n;i++){cin>>a[i].x>>a[i].y;if(a[i].x>a[i].y)swap(a[i].x,a[i].y);}memset(h, 0, sizeof h);sort(a+1,a+n+1,cmp);ans.clear();for(i = 1; i <=n;i++)if(!h[i]){ans.push_back(a[i].y);for(j=i;j<=n;j++){if(a[j].x<=a[i].y && a[i].y<=a[j].y)h[j] = 1;}}cout<<ans.size()<<endl;for(i=0;i<ans.size();i++)printf("%d%c",ans[i],i==((ll)ans.size()-1)?'\n':' ');}return 0;}/*340 -8352 -80-21 -4*//*struct node{ll l, r, id;ll maxx,val,lmaxx;}tree[N];void push_down(ll id){if(tree[id].l==tree[id].r)return ;if(tree[id].val){tree[L(id)].val += tree[id].val;tree[R(id)].val += tree[id].val;tree[L(id)].lmaxx += tree[id].val;tree[L(id)].maxx += tree[id].val;tree[R(id)].lmaxx += tree[id].val;tree[R(id)].maxx += tree[id].val;tree[id].val = 0;}}void build(ll l, ll r, ll id){tree[id].l = l, tree[id].r = r;tree[id].maxx = tree[id].val = 0;tree[id].lmaxx = 0;if(l==r)return ;ll mid = Mid(l,r);build(l,mid,L(id)); build(mid+1,r,R(id));}void updata(ll l, ll r, ll val, ll id){push_down(id);if(l == tree[id].l && tree[id].r == r){tree[id].val += val;tree[id].maxx += val;tree[id].lmaxx += val;return;}ll mid = Mid(tree[id].l, tree[id].r);if(mid<l)updata(l,r,val,R(id));else if(r<=mid)updata(l,r,val,L(id));else {updata(l,mid,val,L(id));updata(mid+1,r,val,R(id));}tree[id].maxx = max(tree[L(id)].maxx, tree[R(id)].maxx);tree[id].lmaxx = tree[L(id)].lmaxx;}struct hehe{ll val, x;hehe(ll a=0,ll b=0):val(a),x(b){}bool operator<(const hehe&a)const{if(a.val==val)return a.x<x;return a.val>val;}};hehe query(ll l, ll r, ll id){push_down(id);if(l == tree[id].l && tree[id].r == r && tree[id].lmaxx==tree[id].maxx)return hehe(tree[id].maxx, tree[id].l);ll mid = Mid(tree[id].l, tree[id].r);if(mid<l)return query(l,r,R(id));else if(r<=mid)return query(l,r,L(id));else return max(query(l,mid,L(id)),query(mid+1,r,R(id)));}set<ll>myset;set<ll>::iterator p;map<ll,ll>mp;ll pos[N]; vector<ll>ans;int use[N];int main(){ll i, j, u, v;while(cin>>n){myset.clear();mp.clear();ans.clear();for(i=1;i<=n;i++){cin>>x[i]>>y[i];if(x[i]>y[i])swap(x[i],y[i]);myset.insert(x[i]);myset.insert(y[i]);use[i] = true;}ll siz = 1;for(p=myset.begin(); p!=myset.end(); p++, siz++) {pos[siz] = *p;mp.insert(pair<ll,ll>(*p,siz));}for(i=1;i<=n;i++) {x[i] = mp.find(x[i])->second;y[i] = mp.find(y[i])->second;}build(1,siz-1,1);for(i=1;i<=n;i++)updata(x[i],y[i],1,1);while(tree[1].maxx){hehe now = query(1,siz-1,1);ans.push_back(pos[now.x]);for(i=1;i<=n;i++)if(x[i]<=now.x&&now.x<=y[i] && use[i])updata(x[i],y[i],-1,1), use[i] = false;}cout<<ans.size()<<endl;for(i=0;i<ans.size();i++)printf("%d%c",ans[i],i==((ll)ans.size()-1)?'\n':' ');}return 0;}/**/


0 0
原创粉丝点击