LOJ #6119. 「2017 山东二轮集训 Day7」国王
Description
在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当这条路径上的工业城市和农业城市数目相等。现在国王想把城市分给他的两个儿子,大儿子想知道,他选择一段标号连续的城市作为自己的领地,并把剩下的给弟弟,能够满足两端都是自己城市的 exciting 路径比两端都是弟弟的城市的 exciting 路径数目多的方案数。
Solution
我们分析一下:
要求的是满足 两端点全在 \([l,r]\) 之间的路径-两端点全在 \([l,r]\) 外的路径>0 的方案数 .....①
我们两个端点都在某个位置会不好算,如果只有一个端点在区间内就比较好算
求出至少一个有端点在 \([l,r]\) 的方案数=两个端点都在 \([l,r]\) 的方案数+有一个在内另一个在外的方案数,
我们发现如果另一个端点在 \([l,r]\) 内,另一端点在外的情况在①式中相减之后抵消了,所以根本不需要考虑这种情况
所以只需要求出 \(w[x]\) 表示以 \(x\) 为其中一个端点的合法的路径的方案数,\(\sum_{i=l}^{r}w[i]\) 就是至少有一个端点在 \([l,r]\) 内的方案数,设为 \(cnt\)
设总合法的路径为 \(tot\)
我们维护两个单调指针,当 \(cnt>tot-cnt\) 时,移动指针 \(l\) 就行了,
至于 \(w[x]\) 的求法就是一个基本的点分治了,值得注意的是合并子树的统计方法仿佛在这题不能用,需要用容斥
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,a[N],son[N]={N},sz[N],head[N],nxt[N<<1],to[N<<1],num=0;
int sum,rt=0;bool vis[N];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void getroot(int x,int last){
sz[x]=1;son[x]=0;
for(int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==last || vis[u])continue;
getroot(u,x);
sz[x]+=sz[u];son[x]=max(son[x],sz[u]);
}
son[x]=max(son[x],sum-sz[x]);
if(son[x]<son[rt])rt=x;
}
int st[N],top=0,id[N],dis[N],w[N],t[N*2];
inline void dfs(int x,int last,int val){
st[++top]=x;dis[x]=val;t[val+N]++;
for(int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==last || vis[u])continue;
dfs(u,x,val+a[u]);
}
}
inline void calc(int r,int x,int op,int sta){
top=0;dfs(x,x,sta+a[x]);
for(int i=1;i<=top;i++)
w[st[i]]+=op*t[N-dis[st[i]]+a[r]];
for(int i=1;i<=top;i++)t[N+dis[st[i]]]--;
}
inline void solve(int x){
vis[x]=1;calc(x,x,1,0);
for(int i=head[x];i;i=nxt[i]){
int u=to[i];if(vis[u])continue;
calc(x,u,-1,a[x]);
rt=0;sum=sz[u];getroot(u,x);solve(rt);
}
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int x,y;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]?a[i]=1:a[i]=-1;
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
link(x,y);link(y,x);
}
rt=0;sum=n;getroot(1,1);
solve(rt);
long long ans=0,cnt=0,tot=0;
for(int i=1;i<=n;i++)tot+=w[i];
for(int i=1,l=1;i<=n;i++){
cnt+=w[i];
while(l<i && cnt>tot-cnt)cnt-=w[l++];
ans+=l-1;
}
cout<<ans<<endl;
return 0;
}
LOJ #6119. 「2017 山东二轮集训 Day7」国王的更多相关文章
- loj6119 「2017 山东二轮集训 Day7」国王
题目描述 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当这条路径上的工 ...
- loj #6077. 「2017 山东一轮集训 Day7」逆序对
#6077. 「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...
- loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】
首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i-k+1~k这一段的和,连接(i,i+k,1,e[i]-s[i]),表示把i改成吃饭,能对i~i+k-1这一段的点产生影响:然后 ...
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
- Loj #6073.「2017 山东一轮集训 Day5」距离
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
- Loj 6068. 「2017 山东一轮集训 Day4」棋盘
Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...
- 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP
[LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...
- LOJ #6074. 「2017 山东一轮集训 Day6」子序列
#6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...
- loj6102 「2017 山东二轮集训 Day1」第三题
传送门:https://loj.ac/problem/6102 [题解] 贴一份zyz在知乎的回答吧 https://www.zhihu.com/question/61218881 其实是经典问题 # ...
随机推荐
- 团队作业7——第二次项目冲刺(Beta版本12.08)
项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:完成了排行榜的测试.上传头像功能的原型设计.界面优化 计划完成的内容:上传头像功能开发.测试.头像裁剪原型设计 每个人的工作 (有wor ...
- Scrum 冲刺 第六日
Scrum 冲刺 第六日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...
- IE浏览器支持响应式网站设计
目前响应式网站设计比较流行, 下面是摘自百度百科有关响应式设计的定义. 响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的 ...
- 新手入门 git
Git是目前世界上最先进的分布式版本控制系统 特点:高端大气上档次 什么是版本控制系统 系统自动记录文件改动 方便同事协作管理 不用自己管理一堆类似的文件了,也不需要把文件传来传去.如果想查看某次改动 ...
- Python之旅.第三章.函数3.26
一.函数: 1.为什么要有函数?什么是函数? 1.组织结构不清晰,可读性差 2.代码冗余 3.管理维护的难度极大,扩展性 具备某一个功能的工具就是程序的中函数 事先准备工具的过程---->函数的 ...
- 【原创】公司各个阶段 CTO 需要做什么?(上篇)
CTO 是企业内技术最高负责人,对企业的发展起到至关重要的作用.但随着公司的不断发展,CTO 的工作重心也会不断变化.只有在正确的阶段做正确的事,才能更好地为公司做出贡献.我是空中金融 CTO ,TG ...
- hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(1)安装jdk
一.文件准备 下载jdk-8u131-linux-x64.tar.gz 二.工具准备 2.1 Xshell 2.2 Xftp 三.操作步骤 3.1 解压文件: $ tar zxvf jdk-8u131 ...
- 2017年Unity游戏开发视频教程(入门到精通)
本文是我发布的一个Unity游戏开发的学习目录,以后我会持续发布一系列的游戏开发教程,都会更新在这个页面上,适合人群有下面的几种: 想要做独立游戏的人 想要找游戏开发相关工作的人 对游戏开发感兴趣的人 ...
- 高级控件 popwindow 与gridview的组合应用
Gridview 的布局设置 <GridView android:layout_width="wrap_content" android:layout_height=&quo ...
- 生成git私钥
在git已经安装的情况下,输入命令: 一.设置git的user name和email git config —(此处两个横杠)global user.name “XXX” git config —(此 ...