http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261
先把不需要destroy的边连上 然后逆序寻找答案 遇到destroy 的边就连上
过程中用并查集维护答案
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<set> #include<map> #include<string> #include<queue> #include<stack> #include <iomanip> using namespace std; #define LL long long const double eps=1e-6; const int INF=0x3f3f3f3f; const int N=10005; const int M=50005; int a[N],f[N]; struct node { int l,r; }edge[M],Q[M]; int had[M]; typedef pair< int , int >pairedge; set<pairedge>st; int fx( int x) { if (f[x]!=x) f[x]=fx(f[x]); return f[x]; } void toge( int l, int r) { int L=fx(l); int R=fx(r); if (L!=R) { if (a[L]>a[R]||(a[L]==a[R]&&L<R)) f[R]=L; else f[L]=R; } } int main() { //freopen("data.in","r",stdin); int n; int I=0; while ( scanf ( "%d" ,&n)!=EOF) { if (I++>0) printf ( "\n" ); for ( int i=0;i<n;++i) scanf ( "%d" ,&a[i]); int m; scanf ( "%d" ,&m); for ( int i=0;i<m;++i) { scanf ( "%d %d" ,&edge[i].l,&edge[i].r); if (edge[i].l>edge[i].r) swap(edge[i].l,edge[i].r); } int q; scanf ( "%d" ,&q); st.clear(); for ( int i=0;i<q;++i) { getchar (); char s[10]; scanf ( "%s" ,s); if (s[0]== 'q' ) Q[i].l=-1; else scanf ( "%d" ,&Q[i].l); scanf ( "%d" ,&Q[i].r); if (Q[i].l!=-1) { if (Q[i].l>Q[i].r) swap(Q[i].l,Q[i].r); st.insert(pairedge(Q[i].l,Q[i].r)); } } for ( int i=0;i<n;++i) f[i]=i; for ( int i=0;i<m;++i) { if (st.find(pairedge(edge[i].l,edge[i].r))==st.end()) { toge(edge[i].l,edge[i].r); } } memset (had,0, sizeof (had)); for ( int i=q-1;i>=0;--i) { if (Q[i].l!=-1) toge(Q[i].l,Q[i].r); else { Q[i].l=fx(Q[i].r); if (a[Q[i].l]>a[Q[i].r]) had[i]=1; else had[i]=-1; } } for ( int i=0;i<q;++i) { if (had[i]==0) continue ; if (had[i]==1) printf ( "%d\n" ,Q[i].l); else printf ( "-1\n" ); } } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步