题面在这里!

xjb想的做法竟然不小心把std艹爆了qwq,我也很无奈啊....

那接下来就说一下我的神奇做法qwq

如果是经常读我博客的童鞋会发现其实我以前就想要做这个题啦,只不过当时读错题啦。。。以为[L,R]在树上只要形成联通块就可以了,于是就自己出了一个题

那个题的做法是直接扫描线,因为[L,R]合法当且仅当 R-L = sum[L] ,其中sum[L] 表示以L 为左端点,目前扫描线为右端点的区间中在树上相邻的点对数,而扫描线右端点右移一位造成的影响只会是一些前缀的sum[]区间加,用线段树动态维护一下就好啦。(维护 区间加,最大值和其数量)

于是那个题就这么做完了。。。。

但是这个题还得要求 在树上形成的联通块是一个链。。。。。

不过仔细想想,链无非就比联通块多一个限制:所有点的度数<=2

所以我们就可以对于每个扫描线右端点R,去动态维护一个L,使得区间 [L,R] 在树上是若干链(当然也可以是一条啦),但是 [L-1,R]的点构成的子图中就有至少一个点的度数>2了。

不难想到 L 关于 R 是具有单调性的,R增大L不会变小,并且 [L,R] 满足没有 >2的度数的点的话,[L+1,R]也满足;反之,[L,R]不满足的话那么 [L-1,R] 也不满足。。。。

所以就可以用度数的关系轻松的O(N)维护这个玩意,复杂度还是在扫描线线段树那里。

于是这个题也这么做完了23333

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
#define lc (o<<1)
#define mid (l+r>>1)
#define rc ((o<<1)|1)
const int N=250005; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} vector<int> g[N],h[N];
int mx[N*4],tag[N*4],n,m,le,ri;
int dg[N],num,L,sum[N*4],M,cnt,R;
ll ans=0; inline void mt(int o){
mx[o]=max(mx[lc],mx[rc]);
sum[o]=(mx[lc]==mx[o]?sum[lc]:0)+(mx[rc]==mx[o]?sum[rc]:0);
} inline void work(int o,int der){ tag[o]+=der,mx[o]+=der;} inline void pd(int o){
if(tag[o]){
work(lc,tag[o]),work(rc,tag[o]);
tag[o]=0;
}
} void build(int o,int l,int r){
sum[o]=1,mx[o]=r;
if(l==r) return;
build(lc,l,mid),build(rc,mid+1,r);
} void update(int o,int l,int r){
if(l>=le&&r<=ri){ work(o,1); return;}
pd(o);
if(le<=mid) update(lc,l,mid);
if(ri>mid) update(rc,mid+1,r);
mt(o);
} void query(int o,int l,int r){
if(l>=le&&r<=ri){
if(mx[o]>M) M=mx[o],cnt=sum[o];
else if(mx[o]==M) cnt+=sum[o];
return;
} pd(o); if(le<=mid) query(lc,l,mid);
if(ri>mid) query(rc,mid+1,r);
} inline void ADD(int x){
le=1;
for(int j=g[x].size()-1,i;j>=0;j--){
i=g[x][j],ri=i,update(1,1,n);
if(i>=L) num+=((++dg[x])==3)+((++dg[i])==3);
}
} inline void Del(int x){
for(int j=h[x].size()-1,i;j>=0;j--){
i=h[x][j];
if(i<=R) num-=((--dg[x])==2)+((--dg[i])==2);
}
} inline void solve(){
build(1,1,n),L=1; for(int i=1;i<=n;i++){
ADD(i),R=i;
for(;num;L++) Del(L); le=L,ri=i,M=0,query(1,1,n);
if(M==i) ans+=(ll)cnt;
}
} int main(){
n=read();
for(int i=1,uu,vv;i<n;i++){
uu=read(),vv=read();
if(uu<vv) g[vv].pb(uu),h[uu].pb(vv);
else g[uu].pb(vv),h[vv].pb(uu);
}
solve(),printf("%lld\n",ans);
return 0;
}

[Lydsy1806月赛] 路径统计的更多相关文章

  1. bzoj5392 [Lydsy1806月赛]路径统计

    传送门 分析 我们设sum[x]为小于等于x的点现在有多少联通 于是一个序列合法当且只当sum[R]-sum[L-1]=len且所有点度数不大于2 我们知道如果对于序列[L,R]满足条件则[L+1,R ...

  2. 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

  3. 洛谷——P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  4. 洛谷 P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  5. bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)

    5204: [CodePlus 2018 3 月赛]投票统计 题目:传送门 题解: 谢谢niang老师的一道sui题 离散化之后直接搞啊(打完之后还错了...) 代码: #include<cst ...

  6. 某模拟赛C题 树上路径统计 (点分治)

    题意 给定一棵有n个节点的无根树,树上的每个点有一个非负整数点权.定义一条路径的价值为路径上的点权和-路径上的点权最大值. 给定参数P,我!=们想知道,有多少不同的树上简单路径,满足它的价值恰好是P的 ...

  7. luogu1608 路径统计 (spfa)

    题意:给一个有向图(无零边),要求找出最短路的数量(重边只计算一次) 做spfa的时候,记一个cnt对于u-w->v如果dis[u]+w=dis[v],cnt[v]+=cnt[u] 如果dis[ ...

  8. [Lydsy1806月赛] 超速摄像头

    题面在这里! 可以证明只要叶子两两路径满足条件即可,于是便可以贪心啦,从最外圈(叶子)开始一层一层选,选出前 k/2 层. 如果k是奇数的话,还可以多选一个不是前 k/2 层的点. #include& ...

  9. luogu P1608 路径统计

    题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...

随机推荐

  1. LCA入门题集小结

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目: How far away ? Time Limit: 2000/1000 MS (Jav ...

  2. HDU 1180 诡异的楼梯 (广搜)

    题目链接 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一 ...

  3. flask_返回字节流错误

    # flask_返回字节流错误 def export_data(filename, fields, data, names=None, sheet='Sheet1'): # fields 为list ...

  4. mysql连接池优化笔记

    中间件mycat是一个高性能的分表分库读写分离的中间件,但配置不好的情况会出现很多性能问题. 1.mycat-web的监控的准确性有问题,1.6-RELEASE  ,1.0-SNAPSHOT (web ...

  5. 1438. Shopaholic

    Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Lindsay is a shopaholic. Whenever th ...

  6. C/C++——[01] 程序的基本框架

    我们以HelloWorld这个简单程序为例,该程序在终端打印一行文本: Hello World! 代码如下: #include <stdio.h> int main(){ printf(& ...

  7. seq和{ }生成序列

    基本用法 [root@C ~]# seq 5 1 2 3 4 5 [root@C ~]# echo {1..5} 1 2 3 4 5 #步进输出 [root@C ~]# seq 1 2 5 1 3 5 ...

  8. 数据库SQL实战(1)

    1.查找最晚入职员工的所有信息: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, ` ...

  9. 使用js创建select option

    var v_select = document.getElementById("selectA");  var v_option = document.createElement( ...

  10. XML、java解释XML、XML约束

    1.XML有什么用? (1)可以用来保存数据 (2)可以用来做配置文件 (3)数据传输载体 2.XML格式 XML 元素必须遵循以下命名规则: 名称可以含字母.数字以及其他的字符 名称不能以数字或者标 ...