为了方便才用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]灵大会议的更多相关文章

  1. sharepoint 增删改查

    前端提交 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="MeetingOneW ...

  2. nodejs实现Websocket的数据接收发送

    在去年的时候,写过一篇关于websocket的博文:http://www.cnblogs.com/axes/p/3586132.html ,里面主要是借助了nodejs-websocket这个插件,后 ...

  3. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  4. HTML+CSS Day11产品网站

    1.佰亿首页 效果图: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  5. async和enterproxy控制并发数量

    聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...

  6. Selenium 4即将发布:每个QA都应该知道的

    阅读原文 Simon Stewart(Selenium的创始成员)在班加罗尔的Selenium大会议上正式确认了Selenium4.0的发布日期和一些主要更新.我们先来提前了解一下Selenium 4 ...

  7. ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文

    https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...

  8. 「About Blockchain(一)」达沃斯年会上的区块链

    「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...

  9. Teamwork#3,Week5,Scrum Meeting 11.20

    到目前为止,第一轮迭代已经基本完成.由于时间问题,多店比较的高级功能要放到第二轮迭代实现. 大部分任务已经完成,在alpha版本发布之前我们剩余需要解决的问题有两个: 服务器.校园网服务器不能满足我们 ...

随机推荐

  1. JQuery用鼠标选文字来发新浪微博

    最近注意到新浪博客有个小功能,就是当鼠标选中一段文字时会浮现一个小图片,点击这个图片可以把选中内容发送到新浪微博,一时兴起昨晚就写了一个Demo玩了一下,代码超简单,没优化,有兴趣的朋友可以自己改进. ...

  2. eclipse集成mybatis的generater插件

    mybatis也能方向生成代码,能方向生成实体类(po).mapper接口和Mapper接口映射文件,能减少我们代码的工作量.详细步骤如下 1.下载mybatis生成架包工具MyBatis_Gener ...

  3. cloudera manager 5.3完整卸载脚本

    service cloudera-scm-agent stop service cloudera-scm-agent stop umount /var/run/cloudera-scm-agent/p ...

  4. python异常之with

    1.基本语法 with expression [as target]: with_body 参数说明: expression:是一个需要执行的表达式: target:是一个变量或者元组,存储的是exp ...

  5. phpAdmin 修改密码后拒绝登陆

    phpMyadmin没配置正确,打开 phpMyadmin 目录找到config.inc.php文件,查找到$cfg['Servers'][$i]['password']='';这行,在''中输入你正 ...

  6. 04-plis属性列表

      源代码下载链接:04-plis属性列表.zip27.8 KB // MJPerson.h // //  MJPerson.h //  04-plis属性列表 // //  Created by a ...

  7. bzoj 1066 最大流

    将每个石柱拆成两个点,分别是进入的和出去的,两个点之间连石柱的高度 然后每个出去的点连别的石柱的进去的点, 源点连所有蜥蜴所在柱子,每个能跳出去的连汇点,然后最大流就行了 /************* ...

  8. 嵌入式上 iscsi实现

    前言 去年公司设备(haisi3516)上需要提供iscsi的功能,于是花了几天时间探究了下.linux内核(2.6.xx)支持iscsi,只是我发现当时我们设备的内核编译时没有选上,于是重新编译了内 ...

  9. BZOJ1003: [ZJOI2006] 物流运输 trans

    物流运输--看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么 dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i}) 就是从 ...

  10. mysql索引语法及示例

    注:本篇文章是对菜鸟教程中的mysql索引(http://www.runoob.com/mysql/mysql-index.html)的翻译版本:添加了示例,便于理解: 索引分单列索引和组合索引.单列 ...