NOI十连测 第六测 T1



思路:


用treap动态维护,记一个sum1,sum2,注意!,写treap如果有删除操作,千万不能把权值相同的分开来。。,这在删除的时候会进入死循环,这是一个惨痛的教训。。。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<time.h>
#define ll long long
struct edge{
int u,v;
ll w;
}e[];
struct node{
int l,r,rnd,size,w;
ll v,sum1,sum2;
}t[];
ll val[];
int tot,n,q,sz,vis[],root;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<='') {t=t*+ch-'';ch=getchar();}
return t*f;
}
ll Read(){
ll t=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<='') {t=t*+ch-'';ch=getchar();}
return t*f;
}
void updata(int k){
int l=t[k].l,r=t[k].r;
t[k].size=t[l].size+t[r].size+t[k].w;
int num1,num2;
if (t[k].w%==) num1=num2=t[k].w/;
else num2=t[k].w/,num1=num2+;
int Num=;
if (l==&&r==){
t[k].sum1=num1*t[k].v;
t[k].sum2=num2*t[k].v;
return;
}else
if (r==&&l!=){
t[k].sum1=t[l].sum1;
t[k].sum2=t[l].sum2;
if (t[l].size%) t[k].sum2+=t[k].v*num1,t[k].sum1+=t[k].v*num2;
else t[k].sum1+=t[k].v*num1,t[k].sum2+=t[k].v*num2;
return;
}else
if (l==&&r!=){
t[k].sum1=t[k].v*num1;
t[k].sum2=t[k].v*num2;
if (t[k].w%) t[k].sum2+=t[r].sum1,t[k].sum1+=t[r].sum2;
else t[k].sum1+=t[r].sum1,t[k].sum2+=t[r].sum2;
return;
}
t[k].sum1=t[l].sum1;Num=t[l].size;
t[k].sum2=t[l].sum2;
if (Num%){
t[k].sum2+=t[k].v*num1;
t[k].sum1+=t[k].v*num2;
}else{
t[k].sum2+=t[k].v*num2;
t[k].sum1+=t[k].v*num1;
}
Num+=t[k].w;
if (Num%){
t[k].sum2+=t[r].sum1;
t[k].sum1+=t[r].sum2;
}else{
t[k].sum1+=t[r].sum1;
t[k].sum2+=t[r].sum2;
}
}
void lturn(int &k){int T=t[k].r;t[k].r=t[T].l;t[T].l=k;t[T].size=t[k].size;updata(k);updata(T);k=T;}
void rturn(int &k){int T=t[k].l;t[k].l=t[T].r;t[T].r=k;t[T].size=t[k].size;updata(k);updata(T);k=T;}
void insert(int &k,int v){
if (!k){
k=++sz;
t[k].l=t[k].r=;
t[k].rnd=rand();
t[k].size=;
t[k].w=;
t[k].v=v;
t[k].sum1=v;
t[k].sum2=;
return;
}
t[k].size++;
if (t[k].v==v){
t[k].w++;
updata(k);
return;
}
else
if (t[k].v>v){
insert(t[k].r,v);
if (t[t[k].r].rnd<t[k].rnd) lturn(k);
}else{
insert(t[k].l,v);
if (t[t[k].l].rnd<t[k].rnd) rturn(k);
}
updata(k);
}
void del(int &k,int v){
if (!k) return;
if (t[k].v==v){
if (t[k].w>){
t[k].w--;
updata(k);
return;
}
if (t[k].l==||t[k].r==){
k=t[k].l+t[k].r;
return;
}
if (t[t[k].l].rnd<t[t[k].r].rnd){
rturn(k);
del(k,v);
}else{
lturn(k);
del(k,v);
}
updata(k);
return;
}
t[k].size--;
if (t[k].v>v){
del(t[k].r,v);
}else{
del(t[k].l,v);
}
updata(k);
}
int main(){
n=read();q=read();int o=read();ll ans=;
while (q--){
int opt=read();
if (opt==){
e[++tot].u=read();e[tot].v=read();e[tot].w=Read();
e[tot].u^=(o*ans);e[tot].v^=(o*ans);
if (val[e[tot].u]) del(root,val[e[tot].u]);vis[e[tot].u]=;
if (val[e[tot].v]&&e[tot].u!=e[tot].v) del(root,val[e[tot].v]);vis[e[tot].v]=;
val[e[tot].u]+=e[tot].w;
val[e[tot].v]+=e[tot].w;
insert(root,val[e[tot].u]);
if (e[tot].u!=e[tot].v)
insert(root,val[e[tot].v]);
ans=(t[root].sum1-t[root].sum2)/;
printf("%lld\n",ans);
}else{
int k=read();
k=k^(o*ans);
if (val[e[k].u])
del(root,val[e[k].u]);
if (val[e[k].v]&&e[k].u!=e[k].v)
del(root,val[e[k].v]);
val[e[k].u]-=e[k].w;
val[e[k].v]-=e[k].w;
if (val[e[k].u]!=)
insert(root,val[e[k].u]);
if (val[e[k].v]!=&&e[k].u!=e[k].v)
insert(root,val[e[k].v]);
ans=(t[root].sum1-t[root].sum2)/;
printf("%lld\n",ans);
}
}
return ;
}
NOI十连测 第六测 T1的更多相关文章
- NOI十连测 第六测 T3
思路:考试的时候我非常地**,写了圆并,然后还TM写了半平面交和三角剖分,虽然只有30分..但是看在我写了500行的份上还是挂着吧.. #include<cstdio> #include& ...
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- 「NOI十联测」深邃
「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...
- 「NOI十联测」奥义商店
「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...
- 「NOI十联测」黑暗
「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...
- NOI十连测 第五测 T1
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...
- NOI十连测 第四测 T1
思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...
- NOI十连测 第三测 T1
这么二逼的题考试的时候我想了好久,我真是太弱了... 首先,由于ans都乘上了i*(i-1)/2,实际上要求的就是每个数的所有可能出现次数*这个数的权值. 我们发现,每个数的本质是一样的,我们记一个s ...
随机推荐
- Delphi的核心优势:三快一多
快是指:开发快(RAD开发),编译快(好像是没有用到LL(1),从而避免了潜在的歧义),运行快(原生代码). 多是指:开发符合PME标准的可视化控件,易开发,易使用,所以第三方控件特别多,这个不用解释 ...
- 关于GC的意见
转载:http://tieba.baidu.com/p/3171732371?pid=53949564351&cid=#53949564351 0.这里的GC是指“垃圾回收”(garbage ...
- Jquery 概念性内容编辑器
概念性jQuery内容编辑器,这是一款非常有特色的jQuery编辑器,该编辑器支持文字.列表.视频.引用等功能,是一款小巧简洁,富有个性化的jQuery内容编辑器插件. 代码: <!doct ...
- Android声明和使用权限
Android定义了一种权限方案来保护设备上的资源和功能.例如,在默认情况下,应用程序无法访问联系人列表.拨打电话等.下面就以拨打电话为例介绍一下系统对权限的要求.一般在我们的应用中,如果要用到拨打电 ...
- 基础总结篇之九:Intent应用详解
看似尋常最奇崛,成如容易卻艱辛.北宋.王安石 看似普通的事情其实最不同寻常,并不是简简单单就可以做好的:成功看起来似乎很容易,而成功的过程却充满着艰辛. 对于我们认为很普通的事情,不屑一顾,就永远不会 ...
- (转) unity 在移动平台中,文件操作路径详解
http://www.unitymanual.com/thread-23491-1-1.html 今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够 ...
- 如何在编译内核时添加缺少的固件(随着intel wireless 5100 AGN的 iwlwifi 案例)
我不知道你在笔记本使用 Linux 在内核编译无线wifi 不能用.我的书"关联 Y450"一个足够的旧书,随着无线网卡: $ lspci | grep Wireless 06:0 ...
- Android资源管理框架(Asset Manager)简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分 ...
- Microsoft Visual C++ 不支持long long
Microsoft Visual C++ 不支持long long 在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说, ...
- My way to Python - Day02
版权声明: 本文中的资料均来自于互联网.将各路内容摘抄于此,作为学习笔记,方便用作后面翻阅查看.如果原作者对文中内容的引用有任何版权方面的问题,请随时联系,我将尽快处理. 特别鸣谢:武沛齐 <P ...