传送门

分析

我们设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 ;
}

最新文章

  1. Sql Server系列:通用表表达式CTE
  2. install sun java in ubuntu
  3. TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)
  4. pythonpython-eggs异常解决方法
  5. C#键盘钩子 鼠标钩子
  6. Java: arr==null vs arr.length==0
  7. DIY RazorEngine 的程序集生成方式
  8. js点击事件防止用户重复点击执行
  9. Oracle EBS-SQL (MRP-6):检查MRP计划运行报错原因之超大数据查询1.sql
  10. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.e3mall.search.mapper.ItemMapper.getItemList
  11. Python爬虫入门项目
  12. python多线程在渗透测试中的应用
  13. linux存储管理之文件系统
  14. GC垃圾回收机制,iOS内存管理。
  15. wx小程序使用模板消息
  16. 修改Visual Studio项目中程序集信息默认公司名称的两种方法
  17. 知识点查缺补漏贴02:Linux环境fork()函数详解
  18. 推荐一些我所用的firefox 附加组件。
  19. 【文智背后的奥秘】系列篇——基于CRF的人名识别
  20. #npm install# MSBUILD : error MSB4132: 无法识别工具版本“2.0”。可用的工具版本为 &quot;4.0&quot;。

热门文章

  1. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\....\App_Web_default.aspx.cdcab7d2.zii776dc.dll”--“拒绝访问。 ”
  2. LeetCode Degree of an Array
  3. 解决genymotion-arm-translation.zip无法拖拽安装的问题[转]
  4. 使用 ip 进行系统网络配置
  5. CENTOS7安装DOCKER步骤以及安装阿里镜像加速后无法正常启动服务的问题2018年1月
  6. (转)setTextColor()的参数设置方式
  7. 浅谈FPGA资源评估
  8. 你知道PORT吗?
  9. POJ1325(最小顶点覆盖)
  10. SpringMVC上传文件大小的设置