小睿睿的方案

链接:

https://ac.nowcoder.com/acm/contest/371/C

来源:牛客网

题目描述

小睿睿虽然已经是人生赢家了,但当他看见学校里其他人秀恩爱时仍旧会十分不满。他的学校有\(n\)个教室,教室间有\(n-1\)条路径且任意教室互相联通,每天他和小熙熙会选择在两个不同的教室\((i,j)\)间的简单路径上秀恩爱。学校里一共有\(m\)对情侣,每对情侣中的两个人分别在教室\(A,B(A\not=B)\),如果他们秀恩爱时经过的教室里存在任意一对情侣,这种秀恩爱的方案就是不合法的,求合法的无序点对数

无序点对:\((i,j)\)与\((j,i)\)视作同一对

输入描述:

第\(1\)行,\(2\)个整数\(n,m\)

第\(2\)至\(n\)行,每行两个整数\(a,b\),表示\(a,b\)间存在一条边

之后\(m\)行,每行两个整数\(a,b\),表示有一对情侣分别在教室\(a\)和教室\(b\)

输出描述:

一行一个整数,表示答案

说明

对于\(30\%\)的数据,\(n,m\le 100\)

另有\(20\%\)的数据,\(n,m\le 100000\)且图的形态为一条链

对于\(100\%\)的数据,\(n,m\le 100000\)

输入数据较大,建议使用较快的读入方式


看了前两个题,发现很水,就来写这个题,然后最后5分钟的时候写出来了,结果数组还开小了,爆的只有80分...前面两个题还没做qaq

统计不合法的点对

首先搞一个点分。

然后考虑遍历一颗儿子的子树时,可能激活前面的儿子的一个子树,把这个激活放到线段树上就是区间覆盖,然后处理一个区间覆盖和区间查询1的个数,但是从点退回父亲的时候需要撤回,我没找到别的方法,只好硬肛了一个可持久化上去。

然后还有一个细节,就是当前子树点到分治中心的路径上有一对,这个可以激活之前的全部点,相应的,之前的子树也可能包含这样的链,就差不多处理就好了。

复杂度\(O(n\log^2 n)\)

\(O(n\log n)\)正解

这个题感觉好像是个套路,和接水果那题有点像

就是 处理树上路径包含统计数量之类的题目可以用\(dfs\)搞成二维的,然后贡献搞成矩形之类的,扫描线一下。

这个题可以对点对是祖孙关系和两个子树关系的东西讨论,然后弄成矩形覆盖的贡献,直接扫描线就可以了。


Code:(点分)

#include <cstdio>
#include <cctype>
#include <vector>
#define ll long long
const int N=2e5+10;
template <class T>
void read(T &x)
{x=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
struct node
{int v,id;node(){}node(int V,int Id){v=V,id=Id;}
};
std::vector <node> yuu[N];
int n,m,Id[N];ll ans;
int head[N],to[N<<1],Next[N<<1],cnt;
void add(int u,int v)
{to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int tag[N*30],sum[N*30],ch[N*30][2],tot,T,root[N];
#define ls ch[now][0]
#define rs ch[now][1]
#define ols ch[las][0]
#define ors ch[las][1]
int New()
{tag[++tot]=0,sum[tot]=0,ch[tot][0]=ch[tot][1]=0;return tot;
}
void pushdown(int now,int L,int R)
{if(L==R) return;if(tag[now]){int Mid=L+R>>1;if(!ls) ls=New();tag[ls]=tag[now];sum[ls]=Mid+1-L;if(!rs) rs=New();tag[rs]=tag[now];sum[rs]=R-Mid;}
}
void change(int las,int &now,int L,int R,int l,int r)
{if(l>r) return;pushdown(las,L,R);now=New();if(l==L&&r==R){tag[now]=1;sum[now]=R+1-L;return;}int Mid=L+R>>1;if(r<=Mid) change(ols,ls,L,Mid,l,r),rs=ors;else if(l>Mid) ls=ols,change(ors,rs,Mid+1,R,l,r);else change(ols,ls,L,Mid,l,Mid),change(ors,rs,Mid+1,R,Mid+1,r);sum[now]=sum[ls]+sum[rs];
}
int query(int now,int L,int R,int l,int r)
{if(!now) return 0;if(l==L&&r==R) return sum[now];pushdown(now,L,R);int Mid=L+R>>1;if(r<=Mid) return query(ls,L,Mid,l,r);else if(l>Mid) return query(rs,Mid,R,l,r);else return query(ls,L,Mid,l,Mid)+query(rs,Mid+1,R,Mid+1,r);
}
int rt,si,mi,siz[N],del[N],buct[N],is[N],tim,key[N],tl;
int dfn[N],dfsclock;
void dfsrt(int now,int fa)
{int mx=0;siz[now]=1;for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=fa&&!del[v]){dfsrt(v,now);siz[now]+=siz[v];mx=mx>siz[v]?mx:siz[v];}mx=mx>si-siz[now]?mx:si-siz[now];if(mx<mi) mi=mx,rt=now;
}
void dfs0(int now,int fa)
{siz[now]=1;dfn[now]=++dfsclock;is[now]=tim;for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=fa&&!del[v]){dfs0(v,now);siz[now]+=siz[v];}
}
void dfs(int now,int fa)
{++T;root[T]=root[T-1];for(int i=0;i<yuu[now].size();i++){int v=yuu[now][i].v,id=yuu[now][i].id;++buct[id];if(buct[id]==2){key[++key[0]]=now;change(root[T],root[T],1,dfsclock,1,tl-1);}if(is[v]==tim&&dfn[v]<tl&&dfn[v]!=1)change(root[T],root[T],1,dfsclock,dfn[v],dfn[v]+siz[v]-1);}ans+=1ll*sum[root[T]];for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=fa&&!del[v])dfs(v,now);for(int i=0;i<yuu[now].size();i++) --buct[yuu[now][i].id];--T;
}
void Divide(int now)
{del[now]=1;key[0]=dfsclock=0;++tim;dfs0(now,0);root[T=0]=tot=0;for(int i=0;i<yuu[now].size();i++) ++buct[yuu[now][i].id];for(int v,i=head[now];i;i=Next[i])if(!del[v=to[i]]){T=0;//撤回到0但是东西前面树的东西还在for(int j=1;j<=key[0];j++)change(root[T],root[T],1,dfsclock,dfn[key[j]],dfn[key[j]]+siz[key[j]]-1);key[0]=0;tl=dfn[v];dfs(v,now);}for(int i=0;i<yuu[now].size();i++) --buct[yuu[now][i].id];for(int v,i=head[now];i;i=Next[i])if(!del[v=to[i]]){mi=si=siz[v];dfsrt(v,now);Divide(rt);}
}
int main()
{read(n),read(m);for(int u,v,i=1;i<n;i++)read(u),read(v),add(u,v),add(v,u);for(int a,b,i=1;i<=m;i++){read(a),read(b);yuu[a].push_back(node(b,i));yuu[b].push_back(node(a,i));}mi=si=n,dfsrt(1,0),Divide(rt);ans=1ll*n*(n-1)/2-ans;printf("%lld\n",ans);return 0;
}

扫描线有机会补


2019.2.22

转载于:https://www.cnblogs.com/butterflydew/p/10420934.html

牛客网 小睿睿的方案 解题报告相关推荐

  1. 【牛客网】清华大学 查找学生信息 解题报告

    题目描述 输入N个学生的信息,然后进行查询. 输入描述: 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息格式如下: 01 李江 男 21 02 刘唐 男 ...

  2. 牛客网-小周的曲射炮

    牛客网-小周的曲射炮(公式推导) 题目描述 小周最近在玩一款二战游戏,他因而对曲射炮的轨迹产生了很大的兴趣,但是在尝试计算后,小周发现这个问题并不是那么简单,他因而来请教你这位计算机高手,请你来帮帮他 ...

  3. 牛客网 - 小乐乐打游戏(BFS)

    链接:https://ac.nowcoder.com/acm/contest/301/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  4. 牛客网小bai月赛40

    牛客网小白月赛40 A 数字游戏 B 跳跳跳 D 优美字符串 E 分组 F 过桥 G 空调遥控 I 体操队形 牛客比赛页面跳转 这是一篇菜鸟的自我总结,大佬勿喷,轻点轻点~ A 数字游戏 题目意思: ...

  5. 牛客网小白二(2018.4.21)

    需要加强的内容:1.递归(尼姆堆) 2.字符与字符串的输入输出,有关其求长度或个数的的函数.语法等 3.有向图.无向图.树的遍历 一.数字方阵 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/ ...

  6. 牛客网 小A买彩票 (dp)

    题目链接:点此跳转 题目大意: 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富.已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可 ...

  7. 牛客网 OI 赛制测试赛

    比赛链接:这里写链接内容 A 斐波那契 链接:https://www.nowcoder.com/acm/contest/181/A 来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[ ...

  8. 牛客网 水题 递推找规律

    链接: https://www.nowcoder.com/acm/contest/91/E 来源:牛客网 小Y买了很多苹果,但他很贪吃,过了几天一下就吃剩一只了.每一天小Y会数出自己的苹果个数X,如果 ...

  9. 牛客网 15029 (栈)

    链接:https://ac.nowcoder.com/acm/problem/15029 来源:牛客网 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡&qu ...

最新文章

  1. CTFshow php特性 web104
  2. BEA WebLogic Server 10 查看和配置日志
  3. Breeze库API总结(Spark线性代数库)(转载)
  4. repeater中分页aspnetpager是遇到的问题
  5. linux内存源码分析 - 内存池
  6. 『网站设计』配色宝典
  7. atmega328p引脚图_atmega328p中文手册
  8. 2020软考软件设计师--基础知识培训视频-任铄(小任老师)-专题视频课程
  9. Ubuntu一些名词解释
  10. 基于java的条形码生成、读取和打印
  11. 如何让不给听得ge乖乖听话?python教你如何做...
  12. 测试四则运算2:Right-BICEP
  13. 详细指南!手把手教你上手Tableau软件!
  14. storj主网挖矿指南
  15. Minitab中的一些最常用的功能和任务。
  16. Gitlab-CI Runner缓存
  17. android 华为mate 获取定位权限,【严重安全问题】开启了定位权限,但是软件还是没权限...
  18. 江苏省2022年普通高校专转本选拔考试 计算机专业大类专业技能 试题卷
  19. RHEL iSCSI
  20. linux服务篇-Xinetd服务

热门文章

  1. 资源分享 | 仅需一个微软账号即可每天白嫖两小时Microsoft学习实验虚拟机云电脑...
  2. 项目时间管理的几种方法
  3. HT1622 驱动断码屏
  4. 关闭 transparent_hugepage 参数
  5. hiredis查询失败时出现key丢失问题定位
  6. C语言例题——输入两个正整数m和n,求其最大公约数和最小公倍数。
  7. python 基础练习 作文修改
  8. [渝粤教育] 中国地质大学 岩石学 复习题 (2)
  9. Bootstrap全局CSS样式之表格
  10. 黑马视频学习笔记-字符串