[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版本发布之前我们剩余需要解决的问题有两个: 服务器.校园网服务器不能满足我们 ...
随机推荐
- PHP设计模式-代理模式
概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...
- SQL性能分析
MySQL常见瓶颈: CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据的时候. IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候. 服务器硬件的性能瓶颈:top.free.io ...
- SpringMVC学习 -- 使用 POJO 对象绑定请求参数值
Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配 , 自动为该对象填充属性值 , 支持级联属性.如:address.province. package com.itdoc.spri ...
- JavaScript 页面间传值
转自:http://blog.csdn.net/qq380107165/article/details/7330612 一:JavaScript静态页面值传递之URL篇 能过URL进行传值,把要传递的 ...
- IOS 上传项目到github 终端操作
1.创建github账号 2.创建秘钥 3.Github配置秘钥 4.上传文件 复制保存网址 终端操作,如果没有ssh,自行安装 GitHub配置秘钥 克隆github上创建的项目 将自己的本地项目, ...
- python中orm框架学习
安装sqlalchemy pip3 install sqlalchemy 创建表结构: from sqlalchemy import Column,String,create_engine from ...
- [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树
Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...
- 多表查询与pymysql
一.子查询 #1:子查询是将一个查询语句嵌套在另一个查询语句中. #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件. #3:子查询中可以包含:IN.NOT IN.ANY.ALL.EXIST ...
- 用maven创建第一个SpringMVC
首先创建一个maven项目,然后依次完成如下配置: 在pom.xml加入如下基础配置,利用maven加载我们所需要的jar: <project xmlns="http://maven. ...
- servlet(1) - 手写第一个servlet程序 - 小易Java笔记
声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...