BZOJ 2333: [SCOI2011]棘手的操作
一道可并堆和set的题辣
BZOJ-2333
[SCOI2011]棘手的操作
Description |
有N个节点,标号从1到N,这N个节点一开始相互不连通。第i个节点的初始权值为a[i],接下来有如下一些操作:
U x y: 加一条边,连接第x个节点和第y个节点
A1 x v: 将第x个节点的权值增加v
A2 x v: 将第x个节点所在的连通块的所有节点的权值都增加v
A3 v: 将所有节点的权值都增加v
F1 x: 输出第x个节点当前的权值
F2 x: 输出第x个节点所在的连通块中,权值最大的节点的权值
F3: 输出所有节点中,权值最大的节点的权值
|
Input |
输入的第一行是一个整数N,代表节点个数。
接下来一行输入N个整数,a[1], a[2], …, a[N],代表N个节点的初始权值。
再下一行输入一个整数Q,代表接下来的操作数。
最后输入Q行,每行的格式如题目描述所示。
|
Output | 对于操作F1, F2, F3,输出对应的结果,每个结果占一行 |
Sample Input |
3
0 0 0
8
A1 3 -20
A1 2 20
U 1 3
A2 1 10
F1 3
F2 3
A3 -10
F3
|
Sample Output |
-10
10
10
|
Hint | 对于30%的数据,保证 N<=100,Q<=10000 |
A2 :给x的堆顶加个标记。
A3 :加个全局标记,输出神马乱七八糟的的时候加上去就好啦。
F1 :先把到堆顶的一串点的标记传下来,然后直接输出点权就好啦。
F2 :输出x的堆顶元素权值。
F3 :输出所有堆顶中的最大值(当然再写个堆多闹心,来个multiset搞一搞就行啦,题能过就行,时间什么的不要太在意啦。
U :删除其中一个,具体操作是最后看哪个依然是堆顶,就删除另一个。
multiset中是Heap.erase(Heap.find(val[]));
A1 :先把可并堆堆顶元素从裸堆中删掉,然后都处理完了再加回去。
加入是Heap.insert(val[]);
A2 :把堆顶元素权值删了再加,或者你写堆的话就把堆中每个点映射一下,然后修改这个点,向上向下分别比较大小维护一下堆性质就行了。
在multiset中的俩操作都一样了。
rand很重要啊。。。不用rand就T飞咯
Problem | Result | Memory | Time | Code_Length |
---|---|---|---|---|
2333 | Accepted | 17656 kb | 3616 ms | 3000 B |
2333 | Time_Limit_Exceed | 14680 kb | 11276 ms | 2938 B |
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <set> #include <ctime> #define NN 300100 #define INF 0x3f3f3f3f; using namespace std; multiset <int> H; int son[NN][3],val[NN],flag[NN],FLAG,root[NN],fa[NN],n,m,st[NN],top; char ch[10]; void read(int &xx) { bool f=0; char CH; for (CH=getchar();CH<'0'||CH>'9';CH=getchar()) if (CH=='-') f=1; for (xx=0;CH>='0';CH=getchar()) xx=xx*10+CH-'0'; if (f) xx=-xx; } void push_down(int x) { val[x]+=flag[x]; if (son[x][0]) flag[son[x][0]]+=flag[x]; if (son[x][1]) flag[son[x][1]]+=flag[x]; flag[x]=0; } int Merge(int x,int y) { push_down(x),push_down(y); if (val[x]<val[y]) swap(x,y); if ((x&&y)==0) return x; int d=rand()&1; son[x][d]=Merge(son[x][d],y); if (son[x][d]) fa[son[x][d]]=x; return x; } int Find(int xx){ return (xx==root[xx]?xx:(root[xx]=Find(root[xx]))); } void Init(int n) { val[0]=-INF; for (int i=1;i<=n;++i) read(val[i]), H.insert(val[i]), root[i]=i; } void U() { int x,y; read(x), read(y); int fx=Find(x), fy=Find(y); if (fx==fy) return; root[fx]=root[fy]=Merge(fx,fy); if (root[fx]==fx) H.erase(H.find(val[fy])); else H.erase(H.find(val[fx])); } void A1() { int x,V,L,R,y; read(x), read(V); for (st[top=1]=x,y=fa[x];y;y=fa[y]) st[++top]=y; int head=st[top]; H.erase(H.find(val[head])); while (top) push_down(st[top--]); val[x]+=V, y=fa[x]; int k=(x==son[y][1]); son[y][k]=fa[x]=0, L=son[x][0], R=son[x][1]; fa[L]=fa[R]=son[x][0]=son[x][1]=0; L=Merge(L,R); if (L) fa[L]=y; if (y) son[y][k]=L, L=head; root[L]=root[x]=root[head]=Merge(x,L), root[0]=0, push_down(root[x]), H.insert(val[root[x]]); } void A2() { int x,y; read(x), read(y), H.erase(H.find(val[Find(x)])); flag[Find(x)]+=y, push_down(root[x]), H.insert(val[root[x]]); } void A3() { int x; read(x), FLAG+=x;} void F1() { int x,y; read(x), push_down(x); if (x==root[x]) { printf("%d\n", val[x]+FLAG); return; } for (st[top=1]=x,y=fa[x];y;y=fa[y]) st[++top]=y; while (top) push_down(st[top--]); printf("%d\n",val[x]+FLAG); } void F2() { int x; read(x), push_down(Find(x)), printf("%d\n",val[root[x]]+FLAG); } void F3() { multiset<int>::iterator it=H.end(); printf("%d\n",(*(--it))+FLAG); } int main() { srand(598562895); read(n), Init(n), read(m); while (m--) { scanf("%s",ch); if (ch[0]=='U') U(); else if (ch[0]=='A' && ch[1]=='1') A1(); else if (ch[0]=='A' && ch[1]=='2') A2(); else if (ch[0]=='A' && ch[1]=='3') A3(); else if (ch[0]=='F' && ch[1]=='1') F1(); else if (ch[0]=='F' && ch[1]=='2') F2(); else if (ch[0]=='F' && ch[1]=='3') F3(); } return 0; }
这真是一个神奇的题号
2022年8月19日 15:18
Tripura Board Model Paper 2023 Class 4 Pdf Download with Answers for Bengali Medium, English Medium, Hindi Medium, Urdu Medium & Students for Small Answers, Long Answer, Very Long Answer Questions, and Essay Type Questions to Term1 & Term2 Exams at official website. TBSE Question Paper Class 4 New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.