P4971 断罪者
首先,不难看出可以给每个集合开一个可并堆,然后乱搞就可以了
主要的问题就是将罪恶值清零和减少罪恶值该怎么搞
罪恶值清零可以直接找到这个节点然后把值变为零,再把它的左右儿子分别并到这个节点所在的根节点的可并堆里
减少罪恶值可以直接把根节点减去这个值,然后把左右儿子重新合并上去就好了
明明完全不会指针却为了卡常白花了一个小时最后只好妥协用结构体
//minamoto
#include<bits/stdc++.h>
#define ll long long
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
inline int max(const int &x,const int &y){return x>y?x:y;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
ll res,f=1;char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2e6+5;
struct node{int v,l,r,d;}p[N];int fa[N],rt;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int merge(int x,int y){
if(!x||!y)return x|y;if(p[x].v<p[y].v)swap(x,y);
p[x].r=merge(p[x].r,y),fa[p[x].r]=x;
if(p[p[x].l].d<p[p[x].r].d)swap(p[x].l,p[x].r);p[x].d=p[p[x].r].d+1;
return x;
}
void dec(int x,int val,bool typ){
p[x].v-=val;if(p[x].v<0)p[x].v=0;
int l=p[x].l,r=p[x].r;fa[l]=l,fa[r]=r;
p[x].l=p[x].r=p[x].d=0,rt=merge(l,r);
typ?merge(find(x),rt):merge(rt,x);
}
int n,m,T,w,typ,x,y,sum;bool vis[N];ll k;
void solve(){
n=read(),m=read();
fp(i,1,n)fa[i]=i,vis[i]=0,p[i].v=read(),p[i].l=p[i].r=p[i].d=0;
while(m--){
typ=read(),x=read();
switch(typ){
case 2:dec(x,p[x].v,1);break;
case 3:y=read(),dec(find(x),y,0);break;
case 4:y=read(),merge(find(x),find(y));break;
}
}
y=0,sum=0;fp(i,1,n)if(!vis[x=find(i)])vis[x]=1,sum+=p[x].v,y=max(y,p[x].v);
if(w==2)sum-=y;if(w==3)sum+=y;
if(!sum)printf("Gensokyo ");
else if(sum<=k)printf("Heaven ");
else printf("Hell ");
printf("%d\n",sum);
}
int main(){
// freopen("testdata.in","r",stdin);
T=read(),w=read(),k=read();
while(T--)solve();
return 0;
}
P4971 断罪者的更多相关文章
随机推荐
- 解方程(codevs 3732)
题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...
- android开发里跳过的坑——android studio 错误Error:Execution failed for task ':processDebugManifest'. > Manifest merger failed with multiple errors, see logs
使用AS在gradle里配置了多个定制版本,发现在编译版本切换时,会出现错误: Error:Execution failed for task ':processDebugManifest'.> ...
- zoj2853 Evolution
给定一个进化的矩阵图,问在m次之后最终的物种有多少个,实际上这和线性代数及其应用里的一个例题是一样的...总之就相当于煞笔的套个矩阵不断去乘m次,然后每次都会根据得到进化后各物种的个数,矩阵快速幂求一 ...
- mac idea快捷键(部分常用)
shift+F6重命名 shift+enter 换到下一行 shift+F8等同eclipse的f8跳到下一个断点,也等同eclipse的F7跳出函数 F8等同eclipse的f6跳到下一步F7等同e ...
- Eclipse错误:Syntax error on tokens, delete these tokens问题解决
错误:Syntax error on tokens, delete these tokens 出现这样的错误一般是括号.中英文字符.中英文标点.代码前面的空格,尤其是复制粘贴的代码,去掉即可.
- sql 按中文排序
sql server:select * from [表名]order by [字段],[字段] collate Chinese_PRC_CS_AS_KS_WS mysql:select * from ...
- Tutorial: Synchronizing State with Mutexes in Go
go语言中用mutex实现状态同步. 原文:https://kylewbanks.com/blog/tutorial-synchronizing-state-with-mutexes-golang - ...
- PowerDesinger15设置字体大小
使用PowerDesigner时,它默认table的字体大小颜色等很难看: 假设通过 Symbol ---> Format进行设置.仅仅能对选中的最改动,新建的Table无效. 能够通过例如以下 ...
- AE After Effect 如何替换和修改素材
替换素材:如图所示,相框外的人是成双成对的,相框里面的却只有一个人,我们想要把这个素材替换成两个人的.我们鼠标放到视频预览框的任何一个元素上面底部都会提示这是什么素材.比如我放到一个人的上面,则该人物 ...
- HDU 5407 CRB and Candies(LCM +最大素因子求逆元)
[题目链接]pid=5407">click here~~ [题目大意]求LCM(Cn0,Cn1,Cn2....Cnn)%MOD 的值 [思路]来图更直观: 这个究竟是怎样推出的.说实话 ...