LGP6773题解
阴间状态,出题人是怎么想到的。。。
为啥lg题解全部都是直接丢状态不说是怎么想的啊。要是以后遇到阴间状态题该怎么想.jpg
首先通过观察,我们可以形象地定义染色:边权为 \(1\) 的边相当于将此边割掉,边权为 \(0\) 的边相当于不割掉。(这个是为了方便思考)
我们要做的就是让祖先不能到达孙子。但是这样好像比较困难,因为实际上一个祖先可能有多个孙子。。。
所以我们考虑让孙子无法到达祖先。我们对孙子枚举一个不超过不超过指定祖先的祖先,表示割掉这个祖先到其父亲的边。
如果割掉这条边,那么这个祖先子树中的所有条件一定都会被满足。
我们先设计一个很傻逼的 DP:\(dp[u][S]\) 表示子树中还有 \(S\) 这些限制没有被满足。
然后我们可以判断自己的父亲是否是这些限制的祖先节点来进行转移。
你发现一件事情:如果我割掉了这条边,那么我子树中的所有限制都被满足了。并且我只需要判定我的父亲是否是这些节点的祖先。
也就是说,我只需要知道这些祖先中,最深的节点就足够判定了。管这么多干嘛?
所以,设 \(dp[u][k]\) 为 \(u\) 子树中,未被满足的限制中,祖先节点最深的那个的深度为 \(k\)。
我们可以根据这个写出转移:
\]
对于一个节点的初始值,假设所有限制的孙子节点为这个节点的集合为 \(S\),那么我们只需要找到 \(S\) 中祖先节点最深的深度 \(d\),让 \(dp[u][d]=1\) 就行了。
如果 \(S\) 为空,就让 \(dp[u][0]=1\)。因为到后面和其他信息合并的时候,是取一个 \(\max\),自身的深度信息肯定会被遗弃掉。
使用前缀和优化可以做到 \(O(nm)\)。
注意到,每个节点的初始有值的位置只可能有一个,并且满足 \(dp[u][k]=\sum_{\max(x,y)=k}f(dp[u][x],dp[v][y])\) 的模型,可以使用线段树合并来优化。
具体细节见代码:
#include<cstdio>
typedef unsigned ui;
const ui M=5e5+5,mod=998244353;
ui n,m,cnt,tot,d[M],f[M],up[M],h[M],root[M];
struct Edge{
ui v,nx;
}e[M<<1];
inline void Add(const ui&u,const ui&v){
e[++cnt]=(Edge){v,h[u]};h[u]=cnt;
e[++cnt]=(Edge){u,h[v]};h[v]=cnt;
}
struct Node{
ui L,R,sum;
ui tmul;
inline void update(const ui&cmul){
sum=1ull*cmul*sum%mod;
tmul=1ull*tmul*cmul%mod;
}
inline void clear(){
tmul=1;
}
}t[M*30];
inline void pushdown(const ui&u){
if(t[u].L)t[t[u].L].update(t[u].tmul);if(t[u].R)t[t[u].R].update(t[u].tmul);t[u].clear();
}
inline void update(const ui&u){
t[u].sum=(t[t[u].L].sum+t[t[u].R].sum)%mod;
}
inline void Insert(ui&u,const ui&x,const ui&L=0,const ui&R=n){
if(!u)t[u=++tot].clear();++t[u].sum;
if(L<R){
const ui mid=L+R>>1;
if(x<=mid)Insert(t[u].L,x,L,mid);
else Insert(t[u].R,x,mid+1,R);
}
}
inline ui Qid(const ui&u,const ui&x,const ui&L=0,const ui&R=n){
if(L==R)return t[u].sum;
const ui mid=L+R>>1;pushdown(u);
return x<=mid?Qid(t[u].L,x,L,mid):(t[t[u].L].sum+Qid(t[u].R,x,mid+1,R))%mod;
}
inline void Merge(ui&q,const ui&p,const ui&S1,const ui&S2,const ui&L=0,const ui&R=n){
if(!q||!p){
if(q)t[q].update(S1);
if(p)t[p].update(S2);
return void(q|=p);
}
if(L==R){
t[q].sum=(1ull*t[q].sum*(S1+t[p].sum)+1ull*t[p].sum*S2)%mod;
return;
}
const ui mid=L+R>>1;pushdown(q);pushdown(p);
Merge(t[q].R,t[p].R,(S1+t[t[p].L].sum)%mod,(S2+t[t[q].L].sum)%mod,mid+1,R);
Merge(t[q].L,t[p].L,S1,S2,L,mid);
update(q);
}
inline void init(const ui&u){
d[u]=d[f[u]]+1;
for(ui v,E=h[u];E;E=e[E].nx)if((v=e[E].v)^f[u])f[v]=u,init(v);
}
inline void DFS(const ui&u){
Insert(root[u],up[u]);
for(ui v,E=h[u];E;E=e[E].nx)if((v=e[E].v)^f[u]){
DFS(v);Merge(root[u],root[v],Qid(root[v],d[u]),0);
}
}
signed main(){
scanf("%u",&n);
for(ui i=1;i<n;++i){
ui u,v;scanf("%u%u",&u,&v);Add(u,v);
}
init(1);
scanf("%u",&m);
while(m--){
ui u,v;scanf("%u%u",&u,&v);if(d[u]>up[v])up[v]=d[u];
}
DFS(1);
printf("%u",Qid(root[1],0));
}
LGP6773题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Java 中使用正则表达式校检IP是否输入正确
感谢大佬案例:https://www.jb51.net/article/114671.htm 正则表达式学习:(待办)近期总结
- 让我一时不知所措 Linux 常用命令 爱情三部曲 下部
Linux目录与文件管理 我试着把你忘记,可总在夜里想你~ 1.linux目录结构 2.查看及检索文件 3.压缩及解压缩文件 4.vi文本编辑器 1.Linux目录结构:树形目录结构根目录:所有分区, ...
- nginx的优化和防盗链
nginx的优化和防盗链 目录 nginx的优化和防盗链 一.nginx的优化 1. 隐藏版本号 (1)隐藏版本号的原因 (2)查看版本号的方法 (3)隐藏方法一:修改配置文件 (4)隐藏方法二:修改 ...
- H5架构和原生架构的区别
1.App的3种开发方式 表面上看,手机App都是同样的东西,就是手机上的应用程序,点击图标就能运行,但是它们的底层技术不一样.按照开发技术,App可以分成三大类.原生应用(简称nativeApp), ...
- Java中File类的方法详解
File类也是Java中一个比较重要的类,通过他我们可以实现对文件的一系列操作,其内置了很多方法,下面我将按方法的功能分块,逐一讲解: 快速导航 构造方法 常用方法 创建目录 判断 `is...` t ...
- An incompatible version 1.1.1 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.17
[问题现象]: 启动Tomcat时报如下类似错误信息: An incompatible version 1.1.12 of the APR based Apache Tomcat Native lib ...
- treevalue——Master Nested Data Like Tensor
首先,请和我一起高呼--"treevalue--通用树形结构建模工具 + 极简树形结构编程模型". 咳咳,好久没更新了,这一次是真的好久不见,甚是想念.在之前的三期中,关于 tre ...
- PHP面试笔试宝典
PHP面试笔试宝典 来自<PHP程序员面试笔试宝典>,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书. PHP题目 一.单例模式是在应用程序中最多 ...
- 7、Linux基础--权限、查看用户信息
笔记 1.晨考 1.Linux系统中的文件"身份证号"是什么 index node 号码 2.什么是硬链接,什么是软连接 硬链接是文件的入口,软连接是快捷方式. 3.硬链接中保存的 ...
- 微服务从代码到k8s部署应有尽有系列(三、鉴权)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...