bzoj5392 [Lydsy1806月赛]路径统计
分析
我们设sum[x]为小于等于x的点现在有多少联通
于是一个序列合法当且只当sum[R]-sum[L-1]=len且所有点度数不大于2
我们知道如果对于序列[L,R]满足条件则[L+1,R]一定满足
如果[L,R]不满足则[L-1,R]一定不满足
所以我们可以枚举R然后找最靠左的满足度数都小于2的L
用线段树维护信息查询区间内最大值是R的数的个数就是贡献
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int n,L,R,num,Max,cnt,col[],d[],sum[],du[];
long long Ans;
vector<int>high[],low[];
inline void build(int le,int ri,int wh){
sum[wh]=;
d[wh]=ri;
if(le==ri)return;
int mid=(le+ri)>>;
build(le,mid,wh<<);
build(mid+,ri,wh<<|);
}
inline void pd(int wh){
if(col[wh]){
d[wh<<]+=col[wh];
col[wh<<]+=col[wh];
d[wh<<|]+=col[wh];
col[wh<<|]+=col[wh];
col[wh]=;
}
}
inline void up(int wh){
d[wh]=max(d[wh<<],d[wh<<|]);
sum[wh]=(d[wh<<]==d[wh]?sum[wh<<]:)+(d[wh<<|]==d[wh]?sum[wh<<|]:);
}
inline void update(int le,int ri,int wh,int x,int y){
if(le>=x&&ri<=y){
col[wh]++;
d[wh]++;
return;
}
pd(wh);
int mid=(le+ri)>>;
if(mid>=x)update(le,mid,wh<<,x,y);
if(mid<y)update(mid+,ri,wh<<|,x,y);
up(wh);
}
inline void que(int le,int ri,int wh,int x,int y){
if(le>=x&&ri<=y){
if(d[wh]>Max)Max=d[wh],cnt=sum[wh];
else if(d[wh]==Max)cnt+=sum[wh];
return;
}
pd(wh);
int mid=(le+ri)>>;
if(mid>=x)que(le,mid,wh<<,x,y);
if(mid<y)que(mid+,ri,wh<<|,x,y);
up(wh);
}
inline void add(int x){
for(int i=;i<low[x].size();i++){
update(,n,,,low[x][i]);
if(low[x][i]>=L)num+=((++du[x])==)+((++du[low[x][i]])==);
}
}
inline void deal(int x){
for(int i=;i<high[x].size();i++){
if(high[x][i]<=R)num-=((--du[x])==)+((--du[high[x][i]])==);
}
}
int main(){
int i,j,k;
scanf("%d",&n);
for(i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);
high[x].push_back(y);
low[y].push_back(x);
}
L=;
build(,n,);
for(i=;i<=n;i++){
R=i;
add(i);
while(num)deal(L),L++;
Max=;
que(,n,,L,i);
if(Max==i)Ans+=1ll*cnt;
}
cout<<Ans;
return ;
}
bzoj5392 [Lydsy1806月赛]路径统计的更多相关文章
- [Lydsy1806月赛] 路径统计
题面在这里! xjb想的做法竟然不小心把std艹爆了qwq,我也很无奈啊.... 那接下来就说一下我的神奇做法qwq 如果是经常读我博客的童鞋会发现其实我以前就想要做这个题啦,只不过当时读错题啦... ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- 洛谷——P1608 路径统计
P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...
- 洛谷 P1608 路径统计
P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...
- bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)
5204: [CodePlus 2018 3 月赛]投票统计 题目:传送门 题解: 谢谢niang老师的一道sui题 离散化之后直接搞啊(打完之后还错了...) 代码: #include<cst ...
- 某模拟赛C题 树上路径统计 (点分治)
题意 给定一棵有n个节点的无根树,树上的每个点有一个非负整数点权.定义一条路径的价值为路径上的点权和-路径上的点权最大值. 给定参数P,我!=们想知道,有多少不同的树上简单路径,满足它的价值恰好是P的 ...
- luogu1608 路径统计 (spfa)
题意:给一个有向图(无零边),要求找出最短路的数量(重边只计算一次) 做spfa的时候,记一个cnt对于u-w->v如果dis[u]+w=dis[v],cnt[v]+=cnt[u] 如果dis[ ...
- [Lydsy1806月赛] 超速摄像头
题面在这里! 可以证明只要叶子两两路径满足条件即可,于是便可以贪心啦,从最外圈(叶子)开始一层一层选,选出前 k/2 层. 如果k是奇数的话,还可以多选一个不是前 k/2 层的点. #include& ...
- luogu P1608 路径统计
题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...
随机推荐
- [BZOJ5290][HNOI2018]道路
bzoj luogu sol 考场上普及\(dp\)都做不来,果然是思想僵化了. 设\(f[u][i][j]\)表示在\(u\)点,上方有\(i\)条未修复的公路和\(j\)条未修复的铁路的最小花费. ...
- #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap
题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...
- DD测磁盘读写性能
1.测试磁盘的纯写入性能 dd if=/dev/zero of=/file [oracle@11g ~]$ touch ddTest[oracle@11g ~]$ time dd if=/dev/ze ...
- spark-shell与scala生成parquet文件
spark-shell用户 spark-shell只能spark用户来进行初始化,如果用hdfs或者root将会卡在spark-shell的初始化那个地方.可以用这两个用户来验证spark安装时成功地 ...
- Tair 分布式K-V存储方案
tair 是淘宝的一个开源项目,它是一个分布式的key/value结构数据的解决方案. 作为一个分布式系统,Tair由一个中心控制节点(config server)和一系列的服务节点(data ser ...
- ssh-copy-id:/usr/bin/ssh-copy-id: ERROR: No identities found
$ ssh-copy-id remote-machine 公钥,私钥已经生成,执行上述命令完毕出现如下错误: /usr/bin/ssh-copy-id: ERROR: No identities fo ...
- java代码初学者适用,输入学生成绩,符合要求的过~~~~注意数据范围
总结:没有基础,我从点滴开始, package com.aaa; import java.util.Scanner; //输入“repate ”次数,输入学生成绩,低于60分,输出fail.否则输入p ...
- 浏览器访问IPv6地址
http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...
- NAS网络存储
NAS(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据 ...
- oracle10g Error in invoking target 'install' of makefile
oracle10g series error error in invoking target 'install' of makefile /u01/app/oracle/oracle/product ...