洛谷题目传送门

ZJOI的考场上最弱外省选手T2 10分成功滚粗。。。。。。

首先要想到30分的结论

说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点

想到了又有什么用?反正想不到最大的贡献是怎么推出来的

然后晚上心中怀着九条CNM看完了Solution.pdf

貌似对我这个蒟蒻来说也只有这一题可做了。。。。。。

已知书上每个点access的总次数,构造出一个顺序,最大化虚实边的切换总次数

其实如果能发现最优顺序的构造是没有后效性的话,问题便可以进一步简化

考虑每个点的子树。假设已经对所有子树中的点构造出了一个最优顺序(一个序列),那么一定不会和它的所有祖先的子树中的最优序列产生冲突。这个并不好证明,仔细想一想应该能发现。

于是就可以单独考虑每个点\(x\)。能对\(x\)的实子边产生影响的是x的所有子树和\(x\)本身(access(x)会使\(x\)没有实子边),每切换一次都会使答案\(+1\)。显然同一个子树中产生的影响是相同的。于是我们要让来自不同子树(或\(x\)本身)尽可能交替access。当没有某个子树(或\(x\)本身)的\(a\)总和过大时,可以构造出使得(除了第一次)每一次access都有贡献的方案。如果某个子树(或\(x\)本身)的\(a\)总和过大,大于所有子树总和的一半时,是不可以的,那个子树(或\(x\)本身)的某几次操作肯定不会有贡献。用数学公式大概表示每个点的贡献为(\(S\)为子树的\(a\)之和,\(c\)为\(x\)的每个子树)

\[\min\{S_x-1,2*(S_x-\max\{a_x,\forall S_c\})\}\]

当\(\max\{a_x,\forall S_c\}\gt {S_x+1\over2}\)时\(\min\)取后者

用树形DP算出来就有30分了

那么怎样快速修改呢?

首先,对某个点的\(a\)加上一个值\(w\),只可能会影响该点到根的路径上的点的贡献。

因为是加一个值,所以假如这些点中某些点的子树\(S\)大于它父亲子树\(S\)的一半,那么\(S_x+w\),\(\max\{a_x,\forall S_c\}\)也会\(+w\),带入上式发现贡献是不变的!

看到某个子树S大于所有子树总和的一半,有没有想到树剖?树剖的轻重边就是这样划分的啊!(反正我这种蒟蒻就是想不到

同样对维护好每个点子树S的树进行轻重链剖分,某些点的子树a之和大于它父亲子树a之和的一半就连重边(否则连轻边),这样每个点至多有一个重儿子。类似树剖的证明,每个点到根的轻边总数(也就是我们可能会修改的点数)是\(\log\sum a\)级别的!

修改的复杂度也有保障啦!我们只要快速找到这些点就好了。用实链剖分维护子树信息即可(应该不能叫LCT吧,没有makeroot,link和cut,对于这个问题蒟蒻的LCT总结对LCT的概念也改了改,欢迎Julao们指正!)。全局保存ans,每次进行类access操作找到虚边,就让ans直接减去以前的贡献,加上w以后判断当前的情况决定是否要切换虚实边并让ans加上新的贡献即可。

为了方便计算以前的贡献,蒟蒻觉得可以保存一下以前贡献的类型(无非就三种,某子树过大、自己过大、都不是很大)算的时候就省去了一些判断的时间。

代码细节巨多,尤其是类access更新答案那部分。所以就算考场上想到了一些东西,我这种蒟蒻也未必写得出来吧!疯狂膜拜考场切T2的laofu爷Orzzzzzzzzzzzz!

#include<cstdio>
#define RG register
#define R RG int
#define I inline void
#define lc c[x][0]
#define rc c[x][1]
#define G ch=getchar()
typedef long long L;
const int N=400009,M=N<<1;
int f[N],c[N][2],he[N],ne[M],to[M];
L ans,a[N],si[N],s[N];
short tp[N];
bool r[N];
template<typename T>
I in(RG T&x){RG char G;while(ch<'-')G;x=ch&15;G;while(ch>'-')x*=10,x+=ch&15,G;
}
inline bool nroot(R x){return c[f[x]][0]==x||c[f[x]][1]==x;
}
I up(R x){s[x]=s[lc]+s[rc]+si[x]+a[x];
}
I rot(R x){R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];if(nroot(y))c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;up(f[w]=y);f[y]=x;f[x]=z;
}
I splay(R x){R y;while(nroot(x)){if(nroot(y=f[x]))rot((c[f[y]][0]==y)^(c[y][0]==x)?x:y);rot(x);}up(x);
}
void dp(R x){//dp预处理答案R y,i,mp=x;RG L mx=a[x];for(i=he[x];i;i=ne[i]){if(f[x]==(y=to[i]))continue;f[y]=x;dp(y);si[x]+=s[y];if(mx<s[y])mx=s[y],mp=y;}if(mx<<1>(s[x]=si[x]+a[x])){ans+=(s[x]-mx)<<1;if(x!=mp)si[x]-=s[rc=mp];//子树过大else tp[x]=1;//自己过大}else tp[x]=2,ans+=s[x]-1;//都不是很大
}
int main(){R n,m,i,p=0,x,y;RG L w,S;in(n);in(m);for(i=1;i<=n;++i)in(a[i]);for(i=1;i<n;++i){in(x);in(y);to[++p]=y;ne[p]=he[x];he[x]=p;to[++p]=x;ne[p]=he[y];he[y]=p;}dp(1);printf("%lld\n",ans);while(m--){in(x);in(w);for(y=0;x;x=f[y=x]){splay(x);S=s[x]-s[lc];//算原来子树a总和,注意减s[lc]ans-=tp[x]<2?(S-(tp[x]?a[x]:s[rc]))<<1:S-1;S+=w;s[x]+=w;(y?si:a)[x]+=w;if(s[y]<<1>S)si[x]+=s[rc],si[x]-=s[rc=y];//虚实切换if(s[rc]<<1>S)   tp[x]=0,ans+=(S-s[rc])<<1;//子树过大else{if(rc)si[x]+=s[rc],rc=0;//没有子树过大,一定变虚if(a[x]<<1>S)tp[x]=1,ans+=(S-a[x])<<1;//自己过大else         tp[x]=2,ans+=S-1,rc=0;//都不是很大}}printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/flashhu/p/8709637.html

洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)相关推荐

  1. P4338 [ZJOI2018]历史 LCT+树形DP

    \(\color{#0066ff}{ 题目描述 }\) 这个世界有 n 个城市,这 n 个城市被恰好 \(n-1\) 条双向道路联通,即任意两个城市都可以 互相到达.同时城市 1 坐落在世界的中心,占 ...

  2. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

    题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...

  3. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  4. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

  5. P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

    P3565 [POI2014]HOT-Hotels 参考题解 题目大意: 给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数. 三个点树上两两距离为d存在下面两种情况 某个点三个子树(保证该点 ...

  6. 洛谷2015 二叉苹果树 树形DP

    https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...

  7. 洛谷 2016 战略游戏(树形DP)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  8. 洛谷P1122 最大子树和 树形DP初步

    小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明就向老师提 ...

  9. 洛谷P2016 战略游戏【树形dp】

    P2016 战略游戏 时间限制 1.00s 内存限制 125.00MB 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡 ...

最新文章

  1. 2021计算机专业课考研大纲,2021考研计算机大纲原文:操作系统
  2. 「AI大牛」陶大程出任京东探索研究院院长!曾连续6年入选全球高被引科学家...
  3. HTTP将死?又拍云布局HTTPS 护航网页安全加速
  4. java 正方形字符串_java编程:怎么画一个正方形?
  5. 关于 redis、memcache、mongoDB 的对比
  6. python 读取文件_python读取docx文件,就是如此简单
  7. 11选5下期算法_11选5为什么你不中奖
  8. 深耕小而美的领域,也能过好一生
  9. 设计模式之创建型(1)-简单工厂
  10. mysql创建多个联合索引吗_高性能索引油画策略(二):多个索引是独立建立索引还是建联合索引?...
  11. HCIA-IoT V2.5物联网初级考试总结(附题库,历年真题,刷题软件)
  12. C语言课程设计超级万年历
  13. 答复: 关于用异常控制程序流程的看法
  14. 【Matlab MTSP】灰狼算法求解多旅行商问题(同始终点)【含源码 1564期】
  15. IIC总线最多能接几个设备
  16. win7磁盘管理分区,改变页面文件卷,删除卷就由灰变黑了!
  17. 月光女神Sarah Brightman 莎拉·布莱特曼视频集锦
  18. web绘图技术之Raphael
  19. 二十一世纪大学英语读写教程(第二册)学习笔记(原文)——8 - Unwritten Rules(不成文的规矩)
  20. 华硕vm510l最大支持多大内存_华硕vm510l与w519l区别

热门文章

  1. 叙述微型计算机系统组成,微型计算机系统的组成.doc
  2. 简单抽象的去理解 面向过程和面向对象 的区别
  3. viper4android mx760,下一个MX500?MX760详尽分析评测+多图。
  4. CDN产业发展现状分析报告
  5. 内部温度传感器和光敏传感器实验
  6. js php 实现日历签到_php+mysql+jquery实现日历签到功能的过程与步骤
  7. 定积分的计算(换元法)
  8. python爬虫爬今日头条_GitHub - striver-ing/headlines_today: 基于Python的爬取今日头条文章及视频...
  9. 机械臂 tcp 坐标 转旋转矩阵 (旋转向量转旋转矩阵)
  10. 如何设置路由路和连接WIFI