[Contest20180313]灵大会议

为了方便才用lct,没想到最后要加读入优化才能过...
有一个结论就是在一条链上,如果能找到一个点使得这个点划分链左右两边的树节点权值和最相近,那么这个点就是答案
用lct维护,每个splay节点存树节点权值$v_x$,树边权值$w_x$,splay中最左节点权值$lv_x$,最右节点权值$rv_x$,树节点权值和$sv_x$,树边权值和$sw_x$,这棵子树向左贡献的答案$pl_x$,这棵子树向右贡献的答案$pr_x$
对于每个询问,先把对应的链提取出来,然后在这棵splay上二分找到分两边点权和最平均的点(二分过程用$sv$和$lv$判断),找到点之后就可以直接输出答案了
修改直接修改
#include<stdio.h>
#define NUM(x) (48<=x&&x<=57)
char c[21000000]={0};
int ns=0;
inline int rd(){
while(!NUM(c[ns]))ns++;
int q=0;
while(NUM(c[ns]))q=(q<<3)+(q<<1)+c[ns++]-48;
return q;
}
#define ll long long
int fa[320010],ch[320010][2],r[320010];
ll v[320010],lv[320010],rv[320010],w[320010],sv[320010],sw[320010],pl[320010],pr[320010];
#define ls ch[x][0]
#define rs ch[x][1]
void pushup(int x){
lv[x]=ls?lv[ls]:v[x];
rv[x]=rs?rv[rs]:v[x];
sv[x]=sv[ls]+sv[rs]+v[x];
sw[x]=sw[ls]+sw[rs]+w[x];
pl[x]=pl[ls]+pl[rs]+v[x]*sw[ls]+(sw[ls]+w[x])*sv[rs];
pr[x]=pr[ls]+pr[rs]+v[x]*sw[rs]+(sw[rs]+w[x])*sv[ls];
}
templatevoid swap(C&a,C&b){
C c=a;
a=b;
b=c;
}
void rev(int x){
r[x]^=1;
swap(lv[x],rv[x]);
swap(pl[x],pr[x]);
swap(ls,rs);
}
void pushdown(int x){
if(r[x]){
if(ls)rev(ls);
if(rs)rev(rs);
r[x]=0;
}
}
void rot(int x){
int y,z,f,b;
y=fa[x];
z=fa[y];
f=ch[y][0]==x;
b=ch[x][f];
fa[x]=z;
fa[y]=x;
if(b)fa[b]=y;
ch[x][f]=y;
ch[y][f^1]=b;
if(ch[z][0]==y)ch[z][0]=x;
if(ch[z][1]==y)ch[z][1]=x;
pushup(y);
pushup(x);
}
bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
void gao(int x){
if(!isrt(x))gao(fa[x]);
pushdown(x);
}
void splay(int x){
int y,z;
gao(x);
while(!isrt(x)){
y=fa[x];
z=fa[y];
if(!isrt(y))rot((ch[z][0]==y&&ch[y][0]==x)||(ch[z][1]==y&&ch[y][1]==x)?y:x);
rot(x);
}
}
void access(int x){
int y=0;
while(x){
splay(x);
rs=y;
pushup(x);
y=x;
x=fa[x];
}
}
void makert(int x){
access(x);
splay(x);
rev(x);
}
void link(int x,int y){
makert(x);
fa[x]=y;
}
int find(int x,ll d){
pushdown(x);
if(sv[ls]+v[x]>d)return find(ls,d);
d-=sv[ls]+v[x];
if(rs&&lv[rs]<=d)return find(rs,d);
return x;
}
ll query(int x,int y){
makert(x);
access(y);
splay(x);
if(lv[x]<=sv[x]>>1){
x=find(x,sv[x]>>1);
splay(x);
x=rs;
}
pushdown(x);
while(ls){
x=ls;
pushdown(x);
}
splay(x);
return pr[ls]+pl[rs];
}
int main(){
int len=fread(c,1,21000000,stdin);
c[len]=0;
int n,q,i,x,y;
n=rd();
for(i=1;i<=n;i++){
v[i]=rd();
pushup(i);
}
for(i=1;i<n;i++){
x=rd();
y=rd();
w[n+i]=rd();
pushup(n+i);
link(x,n+i);
link(n+i,y);
}
q=rd();
while(q--){
i=rd();
x=rd();
y=rd();
if(i==1)
printf("%lld\n",query(x,y));
else{
splay(x);
v[x]=y;
pushup(x);
}
}
}
[Contest20180313]灵大会议的更多相关文章
- sharepoint 增删改查
前端提交 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="MeetingOneW ...
- nodejs实现Websocket的数据接收发送
在去年的时候,写过一篇关于websocket的博文:http://www.cnblogs.com/axes/p/3586132.html ,里面主要是借助了nodejs-websocket这个插件,后 ...
- 异步编程之Promise(2):探究原理
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- HTML+CSS Day11产品网站
1.佰亿首页 效果图: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- async和enterproxy控制并发数量
聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...
- Selenium 4即将发布:每个QA都应该知道的
阅读原文 Simon Stewart(Selenium的创始成员)在班加罗尔的Selenium大会议上正式确认了Selenium4.0的发布日期和一些主要更新.我们先来提前了解一下Selenium 4 ...
- ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文
https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...
- 「About Blockchain(一)」达沃斯年会上的区块链
「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...
- Teamwork#3,Week5,Scrum Meeting 11.20
到目前为止,第一轮迭代已经基本完成.由于时间问题,多店比较的高级功能要放到第二轮迭代实现. 大部分任务已经完成,在alpha版本发布之前我们剩余需要解决的问题有两个: 服务器.校园网服务器不能满足我们 ...
随机推荐
- POJ2912:Rochambeau(带权并查集)
Rochambeau Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5208 Accepted: 1778 题目链接:h ...
- lvm扩容
111 mkfs -t xfs /dev/sda3 112 pvcreate /dev/sda3 113 vgs 114 vgextend cl /dev/sda3 115 lvscan 116 vg ...
- DOM遍历查找结点
一.遍历API(2个) 1.深度优先原则遍历NodeIterator 节点迭代器 创建遍历API对象: var iterator=document.createNodeIterator(开始的父节点对 ...
- eclipse怎样快速的给代码段添加try catch
打开要进行异常处理的java代码页面. 选中要添加try..catch的代码段,然后点击鼠标右键,选择[Sourround With]选项. 然后选择[Try/Catch Block]或者[6 try ...
- bzoj1036: [ZJOI2008]树的统计Count link-cut-tree版
题目传送门 这 算是link-cut-tree裸题啊 不过以前好像没有写过单点修改.............. #include<cstdio> #include<cstring&g ...
- 【洛谷 P1337】[JSOI2004]平衡点 / 吊打XXX (模拟退火)
题目链接 正解就算了吧,谁叫我理生化 语数外 政史地都菜呢 模拟退火真玄学,不知道发生了什么就跑出答案了,原理就算了吧,能用(pianfen)就好. 当重物平衡时,势能一定是最小的,于是当我随机出一个 ...
- bzoj 2330 SCOI2011糖果 查分约束系统
就根据题目中给的约束条件建图就行了 需要注意的是,我们要做的是最长路,因为需要约束每个点都是大于0 那么可以建一个超级源指向所有点,超级源的dis是1,边长为0 那么这样做最长路就可以了 好了我们这么 ...
- Java相关框架
框架 类型 设计(个人理解) HK2 自动注入框架 Jersey RESTful Jetty HTTP服务 Retrofit HTTP客户端 ActiveMQ 消息组件 主题.队列 Redis K-V ...
- 怎么重启shell ubuntu
sunosfind . -type f | xargs grep count 怎么重启shell ubuntu方法一:退出,重新登录方法二:source /etc/profile
- 如何修改linux 的SSH的默认端口号?
http://blog.chinaunix.net/uid-7551698-id-1989086.html 在安装完毕linux,默认的情况下ssh是开放的,容易受到黑客攻击,简单,有效的操作之一 ...