当前位置: 首页 > news >正文

[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);
		}
	}
}

转载于:https://www.cnblogs.com/jefflyy/p/8556888.html

相关文章:

  • Windows Developer Day - Adaptive Cards
  • 乘法逆元模板(Orz尧神)
  • 贪吃蛇
  • Logstash教程
  • JS 正则表达式
  • Linux 下修改Tomcat使用的JVM内存大小
  • ie中placeholder字体颜色兼容问题
  • jQuery多媒体播放器插件jQuery Media Plugin
  • https原理
  • [AR]Vumark(下一代条形码)
  • 实现前端MD5加密与记住用户名密码功能
  • 软件测试方法
  • Java EE作业(二)
  • SignalR Core尝鲜
  • MPAndroidChart绘制曲线图、柱状图总结
  • Brief introduction of how to 'Call, Apply and Bind'
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript设计模式与开发实践系列之策略模式
  • java概述
  • storm drpc实例
  • vue总结
  • 关于字符编码你应该知道的事情
  • 前端面试题总结
  • 如何利用MongoDB打造TOP榜小程序
  • 如何实现 font-size 的响应式
  • 想写好前端,先练好内功
  • 消息队列系列二(IOT中消息队列的应用)
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​flutter 代码混淆
  • ​io --- 处理流的核心工具​
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • $refs 、$nextTic、动态组件、name的使用
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)Thymeleaf用法——Thymeleaf简介
  • (译)计算距离、方位和更多经纬度之间的点
  • (转载)(官方)UE4--图像编程----着色器开发
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .gitignore
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Framework杂记
  • .NET MVC第三章、三种传值方式
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • []串口通信 零星笔记
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [C/C++随笔] char与unsigned char区别
  • [CSS]浮动
  • [iOS]-NSTimer与循环引用的理解
  • [iOS]中字体样式设置 API
  • [JavaWeb]—Spring入门
  • [Machine Learning][Part 8]神经网络的学习训练过程
  • [PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4