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 断罪者的更多相关文章
随机推荐
- 【codeforces 1109B】Sasha and One More Name
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 如果这个回文串的左半部分,字母全是一样的. 那么显然不可能再分出来了,因为不管怎么分怎么排列,最后肯定都只能和原串一样. 所以无解 其他情况下 ...
- [luoguP3390]【模板】矩阵快速幂
传送门 模板不解释. ——代码 #include <cstdio> #include <cstring> #define LL long long int n; LL k; ; ...
- [USACO5.3]巨大的牛棚Big Barn
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 【IntelliJ 】IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化 ...
- msp430入门编程0
msp430单片机最小系统 msp430入门学习 msp430入门编程
- Caocao's Bridges-HDU4738(Tarjin+求桥)
http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意: 给定n个点和m条边 和每条边的价值,求桥的最小价值(最小桥) 看着挺简单的但是有好多细节: ...
- P1614 爱与愁的心痛
洛谷——P1614 爱与愁的心痛 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第一章 <我为歌狂>当中伍思凯神曲<舞月 ...
- Servlet的HelloWorld实例
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/first-example.html: Servlets是Java类,服务于HTTP请求并实现了j ...
- some 算法
矩阵变换:: 请用一条语句将: arr = [[1, 2, 3, 'a'], [4, 5, 6, 'b'], [7, 8, 9, 'c']] 转换装置矩阵为: [[1, 4, 7], [2, 5, 8 ...
- paramiko错误信息:Paramiko error: size mismatch in put
在使用paramiko的put往远处服务器上传资源的时候,出现类似下面的错误信息 The code in paramiko's sftp_client.py:putfo() reads at the ...