传送门

分析

我们设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月赛]路径统计相关推荐

  1. 点分治——树上路径统计

    点分治: 一种分治的方法,一般用于(在不修改情况下),处理两点树上的两点之间的路径的问题. 每次从当前的子图中找到重心,即点分治"点"的含义. 以重心为当前的根节点,查找一切经过重 ...

  2. 洛谷 1608 路径统计

    [题解] 最短路计数的模板题吧..要把重边判掉.. 1 #include<cstdio> 2 #include<algorithm> 3 #define N 2010 4 #d ...

  3. [Lydsy1806月赛] 最长公共子序列

    首先可以证明,只由一种字符构成的串总会是最优解中的一种... 考虑随便一个T与S的LIS都至少是出现次数最少的字符个数(考虑反证法,如果要更短,那么T中每种字符的个数都至多是 S 中最少的字符个数-1 ...

  4. 统计各个函数的耗时_Prometheus 常用函数 histogram_quantile 的若干“反直觉”问题...

    作者:disksing histogram_quantile 是 Prometheus 特别常用的一个函数,比如经常把某个服务的 P99 响应时间来衡量服务质量.不过它到底是什么意思很难解释得清,特别 ...

  5. leetcode257. 二叉树的所有路径(两种做法)

    一:题目 二:上码 1:DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left ...

  6. webstorm代码行数统计_来测试下 2019 你一共写了多少行代码?

    写啊写代码,2019 你都写了多少行代码呢 自己动手实现一个代码统计工具 导入所需的库 这个程序需要用到的库有:os,time 这两个库都是 Python 自带的,所以我们直接 import 就行 i ...

  7. java实现floyd统计天津地铁的网站距离

    一:说明 (1)使用floyd实现各个网站的计算记录和路径 (2)网站获取和初始距离依据外部文件得到 (3)结果以外部文件的形式存储 (4)网站间转乘,觉得初始值也为1 (5)代码凝视比較具体,如有疑 ...

  8. Android产品研发(八)--App数据统计

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了Android社区中比较火的热修复功能,并介绍了目前的几个比较流行的热修复框架,以及各自的优缺点,同时也介绍了一下自身项目中对热修复功能的实践.目 ...

  9. java实现floyd统计天津地铁的站点距离

    一:说明 (1)使用floyd实现各个站点的计算记录和路径 (2)站点获取和初始距离根据外部文件得到 (3)结果以外部文件的形式存储 (4)站点间转乘,认为初始值也为1 (5)代码注释比较详细,如有疑 ...

  10. 信标组的比赛路径设计

    简 介: 本文给出了第十七届全国大学生智能车竞赛信标比赛路径设计.路径参数: 亮灯个数为18盏灯: 路径难易程度定位 5975 ~ 5990:待选的路径总共6888条,本文给出了其中50条路径的. 关 ...

最新文章

  1. 产品经理刷题2020.09.20
  2. Hystrix 熔断器01—— 概述 || Hystrix 重要概念
  3. sdut 2136 数据结构实验之二叉树的建立与遍历
  4. 有望取代Spark,Michael Jordan和Ion Stoica提出下一代分布式实时机器学习框架Ray牛在哪?...
  5. 《Effective C#》读书笔记——条目10:使用可选参数减少方法重载的数量C#语言习惯...
  6. php闭包 回调函数,PHP|PHP实践-闭包
  7. python行业缺口_根据缺口的模式选股买股票,python 学习代码
  8. Netty工作笔记0074---handler链调用机制实例1
  9. 转:为 setuptools 开路搭桥
  10. ***编程DIY (Delphi版) - 第2篇 单实例运行
  11. sketch 3.8.1(破解版涵盖3.0,3.7,3.8.0以上版本) 安装and使用指南(20160524)更新)
  12. java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org
  13. 【大数据存储】Java操作jena练习
  14. 苹果新款笔记本_微软承诺将在iPhone上提供流媒体游戏服务(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...
  15. 入木三分学网络第一篇--VRRP协议详解-----(1)
  16. windows下的ubuntu盘符问题
  17. 解决华为手机不能用USB链接电脑的问题
  18. 皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
  19. bat ren命令修改文件后缀名
  20. 用csc.exe和记事本写一个C#应用程序

热门文章

  1. 算法:翻转链表 Reverse Linked List 三种方法实现,迭代解决人类思维,递归解决机器思维 reverse node
  2. echarts graph图重叠_借官方关系图尝试下屏蔽鼠标浮在 links 上弹出的提示框
  3. python求数的绝对值一定是正数_Python变量运算符和位运算
  4. 2021-09-07218. 天际线问题
  5. 102 二叉树层序遍历Binary Tree Level Order Traversal @ Python
  6. numpy.squeeze()的用法
  7. Some of the operators in the model are not supported by the standard TensorFlow Lite runtime.
  8. No Need for Genius Envy
  9. numpy flatten
  10. 【机器学习系列】变分推断第二讲:基于Mean Field的变分推断解法