Pluto_Rabbit's Blog

蒟蒻妹纸一枚,轻拍

BZOJ 2333: [SCOI2011]棘手的操作

Jacinth posted @ 2016年4月20日 10:02 in BZOJ-LYDSY with tags Learning 学习 BZOJ 可并堆 算法 , 736 阅读

一道可并堆和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;
}

这真是一个神奇的题号

Avatar_small
TBSE Question Paper 说:
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.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter