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[1200000],d[1200000],sum[1200000],du[260000]; long long Ans; vector<int>high[260000],low[260000]; inline void build(int le,int ri,int wh){sum[wh]=1;d[wh]=ri;if(le==ri)return;int mid=(le+ri)>>1;build(le,mid,wh<<1);build(mid+1,ri,wh<<1|1); } inline void pd(int wh){if(col[wh]){d[wh<<1]+=col[wh];col[wh<<1]+=col[wh];d[wh<<1|1]+=col[wh];col[wh<<1|1]+=col[wh];col[wh]=0;} } inline void up(int wh){d[wh]=max(d[wh<<1],d[wh<<1|1]);sum[wh]=(d[wh<<1]==d[wh]?sum[wh<<1]:0)+(d[wh<<1|1]==d[wh]?sum[wh<<1|1]:0); } 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)>>1;if(mid>=x)update(le,mid,wh<<1,x,y);if(mid<y)update(mid+1,ri,wh<<1|1,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)>>1;if(mid>=x)que(le,mid,wh<<1,x,y);if(mid<y)que(mid+1,ri,wh<<1|1,x,y);up(wh); } inline void add(int x){for(int i=0;i<low[x].size();i++){update(1,n,1,1,low[x][i]);if(low[x][i]>=L)num+=((++du[x])==3)+((++du[low[x][i]])==3);} } inline void deal(int x){for(int i=0;i<high[x].size();i++){if(high[x][i]<=R)num-=((--du[x])==2)+((--du[high[x][i]])==2);} } int main(){int i,j,k;scanf("%d",&n);for(i=1;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=1;build(1,n,1);for(i=1;i<=n;i++){R=i;add(i);while(num)deal(L),L++;Max=0;que(1,n,1,L,i);if(Max==i)Ans+=1ll*cnt;}cout<<Ans;return 0; }
转载于:https://www.cnblogs.com/yzxverygood/p/10406329.html
bzoj5392 [Lydsy1806月赛]路径统计相关推荐
- 点分治——树上路径统计
点分治: 一种分治的方法,一般用于(在不修改情况下),处理两点树上的两点之间的路径的问题. 每次从当前的子图中找到重心,即点分治"点"的含义. 以重心为当前的根节点,查找一切经过重 ...
- 洛谷 1608 路径统计
[题解] 最短路计数的模板题吧..要把重边判掉.. 1 #include<cstdio> 2 #include<algorithm> 3 #define N 2010 4 #d ...
- [Lydsy1806月赛] 最长公共子序列
首先可以证明,只由一种字符构成的串总会是最优解中的一种... 考虑随便一个T与S的LIS都至少是出现次数最少的字符个数(考虑反证法,如果要更短,那么T中每种字符的个数都至多是 S 中最少的字符个数-1 ...
- 统计各个函数的耗时_Prometheus 常用函数 histogram_quantile 的若干“反直觉”问题...
作者:disksing histogram_quantile 是 Prometheus 特别常用的一个函数,比如经常把某个服务的 P99 响应时间来衡量服务质量.不过它到底是什么意思很难解释得清,特别 ...
- leetcode257. 二叉树的所有路径(两种做法)
一:题目 二:上码 1:DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left ...
- webstorm代码行数统计_来测试下 2019 你一共写了多少行代码?
写啊写代码,2019 你都写了多少行代码呢 自己动手实现一个代码统计工具 导入所需的库 这个程序需要用到的库有:os,time 这两个库都是 Python 自带的,所以我们直接 import 就行 i ...
- java实现floyd统计天津地铁的网站距离
一:说明 (1)使用floyd实现各个网站的计算记录和路径 (2)网站获取和初始距离依据外部文件得到 (3)结果以外部文件的形式存储 (4)网站间转乘,觉得初始值也为1 (5)代码凝视比較具体,如有疑 ...
- Android产品研发(八)--App数据统计
转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了Android社区中比较火的热修复功能,并介绍了目前的几个比较流行的热修复框架,以及各自的优缺点,同时也介绍了一下自身项目中对热修复功能的实践.目 ...
- java实现floyd统计天津地铁的站点距离
一:说明 (1)使用floyd实现各个站点的计算记录和路径 (2)站点获取和初始距离根据外部文件得到 (3)结果以外部文件的形式存储 (4)站点间转乘,认为初始值也为1 (5)代码注释比较详细,如有疑 ...
- 信标组的比赛路径设计
简 介: 本文给出了第十七届全国大学生智能车竞赛信标比赛路径设计.路径参数: 亮灯个数为18盏灯: 路径难易程度定位 5975 ~ 5990:待选的路径总共6888条,本文给出了其中50条路径的. 关 ...
最新文章
- 产品经理刷题2020.09.20
- Hystrix 熔断器01—— 概述 || Hystrix 重要概念
- sdut 2136 数据结构实验之二叉树的建立与遍历
- 有望取代Spark,Michael Jordan和Ion Stoica提出下一代分布式实时机器学习框架Ray牛在哪?...
- 《Effective C#》读书笔记——条目10:使用可选参数减少方法重载的数量C#语言习惯...
- php闭包 回调函数,PHP|PHP实践-闭包
- python行业缺口_根据缺口的模式选股买股票,python 学习代码
- Netty工作笔记0074---handler链调用机制实例1
- 转:为 setuptools 开路搭桥
- ***编程DIY (Delphi版) - 第2篇 单实例运行
- sketch 3.8.1(破解版涵盖3.0,3.7,3.8.0以上版本) 安装and使用指南(20160524)更新)
- java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org
- 【大数据存储】Java操作jena练习
- 苹果新款笔记本_微软承诺将在iPhone上提供流媒体游戏服务(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...
- 入木三分学网络第一篇--VRRP协议详解-----(1)
- windows下的ubuntu盘符问题
- 解决华为手机不能用USB链接电脑的问题
- 皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
- bat ren命令修改文件后缀名
- 用csc.exe和记事本写一个C#应用程序
热门文章
- 算法:翻转链表 Reverse Linked List 三种方法实现,迭代解决人类思维,递归解决机器思维 reverse node
- echarts graph图重叠_借官方关系图尝试下屏蔽鼠标浮在 links 上弹出的提示框
- python求数的绝对值一定是正数_Python变量运算符和位运算
- 2021-09-07218. 天际线问题
- 102 二叉树层序遍历Binary Tree Level Order Traversal @ Python
- numpy.squeeze()的用法
- Some of the operators in the model are not supported by the standard TensorFlow Lite runtime.
- No Need for Genius Envy
- numpy flatten
- 【机器学习系列】变分推断第二讲:基于Mean Field的变分推断解法