結果
問題 | No.416 旅行会社 |
ユーザー |
![]() |
提出日時 | 2016-08-26 22:43:27 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1,519 ms / 4,000 ms |
コード長 | 4,514 bytes |
コンパイル時間 | 790 ms |
コンパイル使用メモリ | 70,652 KB |
実行使用メモリ | 68,852 KB |
最終ジャッジ日時 | 2024-12-14 19:44:35 |
合計ジャッジ時間 | 12,231 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:163:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 163 | scanf("%d%d%d",&n,&m,&q); | ~~~~~^~~~~~~~~~~~~~~~~~~ main.cpp:166:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 166 | scanf("%d%d",&a,&b); | ~~~~~^~~~~~~~~~~~~~ main.cpp:172:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 172 | scanf("%d%d",&a,&b); | ~~~~~^~~~~~~~~~~~~~
ソースコード
// AGC002// http://agc002.contest.atcoder.jp/submissions/828130// #include <bits/stdc++.h>#include <cstdio>#include <cstdlib>#include <vector>#include <set>#include <iostream>using namespace std;typedef pair<int,int> pii;typedef int _loop_int;#define DEBUG(x) cout<<#x<<": "<<(x)<<endl#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)// 永続配列struct node{int lch,rch;int val,version;};node *nodes;int nodehead;void nodesinit(){nodehead = 0;nodes = (node*)calloc(8000000,sizeof(node));}int mynew(int val,int version){nodes[nodehead].val = val;nodes[nodehead].version = version;nodes[nodehead].lch = nodes[nodehead].rch = -1;return nodehead++;}#define SIZE 262144#define VMAX 200002#define DEFAULT -1struct myarray{int now;int *rootid;myarray():now(0){rootid = (int*)calloc(VMAX,sizeof(int));rootid[0] = mynew(DEFAULT,0);}int getat(int v,int k){int l=0,r=SIZE;int curid = rootid[v];while(l+1<r){int c = (l+r)>>1;if(k<c){if(nodes[curid].lch==-1)return DEFAULT;r = c;curid = nodes[curid].lch;}else{if(nodes[curid].rch==-1)return DEFAULT;l = c;curid = nodes[curid].rch;}}return nodes[curid].val;}int setat_rec(int curid,int v,int k,int x,int l,int r,int id){if(l+1==r){if(nodes[curid].version == v){nodes[curid].val = x;return curid;}else{return mynew(x,v);}}else{int c = (l+r)>>1;if(k<c){int nxt=0;if(nodes[curid].lch==-1){int lch = mynew(DEFAULT,v);nxt = setat_rec(lch,v,k,x,l,c,(id<<1)+1);}else{nxt = setat_rec(nodes[curid].lch,v,k,x,l,c,(id<<1)+1);}if(nodes[curid].version == v){nodes[curid].lch = nxt;return curid;}else{int ret = mynew(DEFAULT,v);nodes[ret].rch = nodes[curid].rch;nodes[ret].lch = nxt;return ret;}}else{int nxt = 0;if(nodes[curid].rch==-1){int rch = mynew(DEFAULT,v);nxt = setat_rec(rch,v,k,x,c,r,(id<<1)+2);}else{nxt = setat_rec(nodes[curid].rch,v,k,x,c,r,(id<<1)+2);}if(nodes[curid].version == v){nodes[curid].rch = nxt;return curid;}else{int ret = mynew(DEFAULT,v);nodes[ret].lch = nodes[curid].lch;nodes[ret].rch = nxt;return ret;}}}}void setat(int v,int k,int x){rootid[v] = setat_rec(rootid[v],v,k,x,0,SIZE,0);}void record(){rootid[now+1] = mynew(DEFAULT,now+1);nodes[rootid[now+1]].lch = nodes[rootid[now]].lch;nodes[rootid[now+1]].rch = nodes[rootid[now]].rch;now += 1;}};int uf_root(myarray *uf,int v,int x){int r = uf->getat(v,x);if(r<0){return x;}else{return uf_root(uf,v,r);}}void uf_unite(myarray *uf,int v,int a,int b){a = uf_root(uf,v,a);b = uf_root(uf,v,b);if(a!=b){int sa = uf->getat(v,a);int sb = uf->getat(v,b);if(sa<=sb){uf->setat(v,a,sa+sb);uf->setat(v,b,a);}else{uf->setat(v,b,sa+sb);uf->setat(v,a,b);}}}int uf_same(myarray *uf,int v,int a,int b){return uf_root(uf,v,a)==uf_root(uf,v,b);}int uf_size(myarray *uf,int v,int a){return -uf->getat(v,uf_root(uf,v,a));}int n,m;int q;set<pii> ori;vector<pii> del;int main(){nodesinit();myarray *uf = new myarray();scanf("%d%d%d",&n,&m,&q);REP(i,m){int a,b;scanf("%d%d",&a,&b);--a;--b;ori.insert(pii(a,b));}REP(i,q){int a,b;scanf("%d%d",&a,&b);--a;--b;del.push_back(pii(a,b));ori.erase(ori.find(pii(a,b)));}for(pii P:ori){int a=P.first, b=P.second;uf_unite(uf,0,a,b);}uf->record();REP(i,q){pii P = del[q-1-i];int a=P.first, b=P.second;uf_unite(uf,i+1,a,b);uf->record();}FOR(i,1,n){int x=0, y=i;int low=-1,high=q+1;while(low+1<high){int mid = (low+high)>>1;int rx = uf_root(uf,mid,x);int ry = uf_root(uf,mid,y);if(rx!=ry){low = mid;}else{high = mid;}}printf("%d\n",low==-1 ? low : q-low);}return 0;}