题面在这里!

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. 深入分析Spring 与 Spring MVC容器(山东数漫江湖)

    1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...

  2. Network(POJ3694+边双连通分量+LCA)

    题目链接:http://poj.org/problem?id=3694 题目: 题意:给你一个n个点m条边的无向连通图,进行q次操作,每次操作在u和v之间加一条边,问每次操作之后“桥”的数量. 思路: ...

  3. python中requests库中文乱码问题

    当使用这个库的时候经常会出现各种乱码的情况. 首先要知道: text返回的是处理过的unicode的数据. content返回的是bytes的原始数据 也就是说r.content比r.text更加节省 ...

  4. [Leetcode Week12]Unique Paths II

    Unique Paths II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/unique-paths-ii/description/ Descrip ...

  5. Yii 1.1.17 三、数据库连接、定义模型、数据查询、验证登录、SESSION使用与URL生成

    一.数据库连接 1.配置连接参数 在database.php里面开启: 'db' => array( 'connectionString' => 'mysql:host=127.0.0.1 ...

  6. auth src

    https://github.com/jbeverly/pam_ssh_agent_auth https://github.com/aur-archive/pam-face-authenticatio ...

  7. eclipse快捷键及eclipse一直building处理

    1.输入Syso然后按 ALT+/      ------>System.out.println(); 2.CTRL+/      ------>添加或消除注释// 3.CTRL+SHIF ...

  8. C++中STL容器的比较

    基本参考 https://blog.csdn.net/qq_14898543/article/details/51381642 容器特性: vector:典型的序列容器,C++标准严格要求次容器的实现 ...

  9. HDU 6109 数据分割 并查集,SET

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6109 题意:中文题面 解法:每次都贪心地尝试将尽量多的条件放进当前这组,遇到第一个与已有条件冲突时,就 ...

  10. Cause: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.ibatis.mapping.MappedStatement

    我用的是pagehelper 4.2.0,利用其进行表单的分页处理并进行展示,在第一次执行的时候能够看到分页后的结果,刷新一下第二次就显示不出来,控制台出现: Cause: java.lang.Cla ...