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 ...
随机推荐
- IC封装图片认识(二):TO封装图
TO-18 TO-220 TO-247 TO-264 TO-52 TO-71 TO-72 TO-78 TO-8 TO-92 TO-93 TO-99 TO-263&268 FTO-220 ITO ...
- 转:C# 定时任务实现
原文地址:http://blog.csdn.net/Netself/article/details/5766398 C#实现的定时任务类,核心代码如下: 以下代码可直接封装成 TimerTask.dl ...
- bootargs中的环境变量说明和一些常用的uboot命令
bootargs中的环境变量说明和一些常用的uboot命令 一些常见的uboot命令:Help [command]在屏幕上打印命令的说明Boom [addr]启动在内存储器的内核Tftpboot通过t ...
- 利用autoit自动关闭指定标题窗口
最近使用PL/SQL Developer 比较两个数据库数据差异,因部分表上没有主键,PL/SQL 就会弹出一个确认框提示某某表没有主键.因为有很多表没有主键,就不停的弹出确认窗口,得不停的点击 ...
- 关于链表的一些重要操作(Important operations on a Linked List)
上篇博文中讨论了链表的一些基本操作: 链表的基本操作(Basic Operations on a Linked List) 然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作. ...
- <转载>构造函数与拷贝构造函数
原文地址http://www.cnblogs.com/waynelu/archive/2012/07/01/2572264.html 构造函数 构造函数.析构函数与赋值函数是每个类最基本的函数. 对于 ...
- hadoop的thriftserver配置
说明:hadoop版本:hadoop-1.2.1.tar.gz.linux系统12.04,不过这里跟系统无关,可能安装软件的命令有差别. 一.概述 默认的hbase安装包已经有了thrift服务,使用 ...
- c++中经常需要访问对象中的成员的三种方式
可以有3种方法: 通过对象名和成员运算符访问对象中的成员; 通过指向对象的指针访问对象中的成员; 通过对象的引用变量访问对象中的成员. 一.通过对象名和成员运算符访问对象中的成员 例如在程序中可以写出 ...
- 图的遍历(DFS、BFS)
理论: 深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广: 广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程: ...
- [Git] --no-verify
Somtimes, the project might set the commit message guide line, if your commit doesn't meet the requi ...