ZJU 3261 逆向考虑,并查集
2014-02-19 00:55
204 查看
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <set> #define M 10000 using namespace std; struct Node { int p; int x; }node[10010]; struct Op { int o,n; }op[50010]; int tun[20010],n,m,q,ans[50010]; int find(int p) { if(node[p].p<0) return p; return node[p].p=find(node[p].p); } void merge(int a,int b) { a=find(a); b=find(b); if(a>b) swap(a,b); if(a==b) return; if(node[a].x>=node[b].x) node[b].p=a; else node[a].p=b; } int main() { //freopen("in.txt","r",stdin); //freopen("out2.txt","w",stdout); int pri=0; while(cin>>n) { int i,j,k; char s[10]; set<int> st; for(i=0;i<n;i++) { cin>>node[i].x; node[i].p=-1; } cin>>m; for(i=0;i<m;i++) { cin>>j>>k; if(j>k) swap(j,k); tun[i]=j*M+k; } cin>>q; for(i=0;i<q;i++) { cin>>s; if(s[0]=='q') { op[i].o=0; cin>>op[i].n; } else { op[i].o=1; cin>>j>>k; if(j>k) swap(j,k); op[i].n=j*M+k; st.insert(op[i].n); } } for(i=0;i<m;i++) if(!st.count(tun[i])) { merge(tun[i]/M,tun[i]%M); } i=q; while(i--) { if(op[i].o) { merge(op[i].n/M,op[i].n%M); ans[i]=-2; } else { j=find(op[i].n); if(node[j].x<=node[op[i].n].x) ans[i]=-1; else ans[i]=j; } } if(pri) cout<<endl; pri=1; for(i=0;i<q;i++) if(ans[i]>=-1) cout<<ans[i]<<endl; } return 0; }
相关文章推荐
- zoj 3261 逆向并查集+离线处理
- zoj 3261 逆向并查集
- ZOJ 3261 Connections in Galaxy War 【并查集 + 离线逆向处理】好题!!
- 逆向并查集(ZOJ 3261)
- ZOJ 3261 Connections in Galaxy War (离线处理+逆向并查集)
- ZOJ - 3261 逆向并查集
- ZOJ-3261-Connections in Galaxy War [逆向并查集]
- ZOJ 3261 /哈理工OJ 1913 Connection in War(逆向并查集)(STL应用)
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
- Zoj 3261 Connections in Galaxy War (逆向并查集)
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
- hdu 4496 并查集 逆向 并查集删边
- HDOJ2419-逆向处理操作,并查集,set
- zoj Connections in Galaxy War(逆向并查集)
- 51nod 1448 二染色问题 (逆向考虑)
- zoj 3261 Connections in Galaxy War 删边并查集模板
- ZOJ 3261 Connections in Galaxy War 并查集
- zoj 3261 Connections in Galaxy War(并查集+离线逆向操作)
- hdu 4496 并查集 逆向 并查集删边
- ZOJ 3261 Connections in Galaxy War【并查集】