[ncw7] 小睿睿的方案
考虑一对情侣(x,y)x<y的贡献,设in[x],out[x]为数的dfs序。
强制从x走向y方向
当in[x]<in[y]且out[y]<=out[x] 矩形{1,in[x],in[y],out[y]},{out[x]+1,n,in[y],out[y]},{(in[x]+1,in[z]-1,in[y],out[y]},{out[z]+1,out[x],in[y],out[y]},z是x所在的y的儿子子树的根
当in[y]<in[x]且out[x]<=out[y] 情况类似
其余情况 矩形{in[x],out[x],in[y],out[y]}
这样平面上所有落在矩形内的点P(x,y)x<=y是不合法的。
但是这样并不好算。
于是干脆算出有序点对数,及忽略走向,因为点(x,x)一定不被包含在矩形内,所以答案为(n^2-不合法的有序点对-n)/2。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int head[N],to[N<<1],last[N<<1];
int fa[N][20],dep[N],in[N],out[N];
void add_edge(int x,int y) {
static int cnt=0;
to[++cnt]=y,last[cnt]=head[x],head[x]=cnt;
}
void dfs(int x,int pa) {
static int cnt=0;
in[x]=++cnt;
dep[x]=dep[fa[x][0]=pa]+1;
for(int i=1; (1<<i)<dep[x]; ++i)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=head[x]; i; i=last[i])
if(to[i]!=pa) dfs(to[i],x);
out[x]=cnt;
}
struct tree {
int cover,len;
} t[N<<2];
#define ls (x<<1)
#define rs (x<<1|1)
void update(int x,int l,int r) {
if(t[x].cover) t[x].len=r-l+1;
else if(l==r) t[x].len=0;
else t[x].len=t[ls].len+t[rs].len;
}
void modify(int x,int l,int r,int L,int R,int w) {
if(L<=l&&r<=R) {
t[x].cover+=w;
update(x,l,r);
return;
}
int mid=(l+r)>>1;
if(L<=mid) modify(ls,l,mid,L,R,w);
if(mid<R) modify(rs,mid+1,r,L,R,w);
update(x,l,r);
}
#undef ls
#undef rs
struct seg {
int type,h,l,r;
bool operator<(const seg&d) const {
return h!=d.h?h<d.h:type<d.type;
}
} s[N<<3];
int n,m,cnt;
void add_matrix(int a,int b,int c,int d) {
if(a>b||c>d) return;
s[++cnt]=(seg){1,c,a,b};
s[++cnt]=(seg){-1,d+1,a,b};
}
long long get_area() {
long long ret=0;
sort(s+1,s+cnt+1);
for(int i=1; i<cnt; ++i) {
modify(1,1,n,s[i].l,s[i].r,s[i].type);
ret+=1LL*(s[i+1].h-s[i].h)*t[1].len;
}
return ret;
}
void insert(int x,int y) {
if(in[x]<in[y]&&out[y]<=out[x]) {
add_matrix(1,in[x],in[y],out[y]);
add_matrix(out[x]+1,n,in[y],out[y]);
int dif=dep[y]-dep[x]-1,z=y;
for(int i=19; ~i; --i) if((dif>>i)&1) z=fa[z][i];
add_matrix(in[x]+1,in[z]-1,in[y],out[y]);
add_matrix(out[z]+1,out[x],in[y],out[y]);
return;
}
if(in[y]<in[x]&&out[x]<=out[y]) {
add_matrix(in[x],out[x],1,in[y]);
add_matrix(in[x],out[x],out[y]+1,n);
int dif=dep[x]-dep[y]-1,z=x;
for(int i=19; ~i; --i) if((dif>>i)&1) z=fa[z][i];
add_matrix(in[x],out[x],in[y]+1,in[z]-1);
add_matrix(in[x],out[x],out[z]+1,out[y]);
return;
}
add_matrix(in[x],out[x],in[y],out[y]);
}
int main() {
scanf("%d%d",&n,&m);
for(int x,y,i=n; --i; ) {
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
dfs(1,0);
for(int x,y,i=1; i<=m; ++i) {
scanf("%d%d",&x,&y);
insert(x,y);
insert(y,x);
}
printf("%lld\n",(1LL*n*n-get_area()-n)/2);
return 0;
}
突然想到一道以前的题,直接扔下思路好了(可能有点锅)
rb有一棵树,树的每个节点有个颜色。给一个长度为\(n\)的颜色序列,定义\(s(i,j)\) 为\(i\) 到\(j\) 的颜色数量。以及
\[sum_i=\sum_{j=1}^ns(i,j)
\]现在他想让你求出所有的\(sum_i\) 。(\(1\le n,c[i]\le 10^5\))
预处理出树的DFS序(\(in[]\)和\(out[]\))对于树上的一个点 \(v\) ,设其颜色是 \(c\) 。令 \((i,j)\) 对应二维平面上的一个点。则 \(v\) 会对以下两类 \(s(i,j)\) 产生贡献:
- \(i\) 和 \(j\) 一个在\(v\) 的子树外,一个在子树内。
- \(i\in[1,in_v]\) ,\(j\in[in_v,out_v]\)
- \(i\in[in_v,out_v]\) ,\(j\in(out_v,n]\) 。
- \(i\in[in_v,out_v]\) ,\(j\in[1,in_v]\) 。
- \(i\in(out_v,n]\) ,\(j\in[in_v,out_v]\) 。
- \(i\) 和 \(j\) 分别位于以 \(v\) 的不同儿子为根的两个子树中。枚举一个儿子\(s\)
- \(i\in[in_v,in_s)\),\(j\in[in_s,out_s]\)。
- \(i\in[in_s,out_s]\),\(j\in(out_s,out_v]\)。
- \(i\in[in_s,out_s]\),\(j\in[in_v,in_s)\)。
- \(i\in(out_s,out_v]\),\(j\in[in_s,out_s]\)。
把 \(\{i\in\dots,j\in\dots\}\) 看作覆盖在二维平面上的一个矩形。把同是颜色\(c\) 的点的相关矩形单独讨论,若\((i,j)\) 被某个矩形覆盖,则表示\(i\rightarrow j\) 路径上存在颜色\(c\) 。
我们考虑进行扫描线,对线所在位置的点进行差分记录位置上被覆盖的点有几个(相应地有一个消除标记),在颜色讨论完后求一个前缀和,那么答案就出来了。
[ncw7] 小睿睿的方案的更多相关文章
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...
- C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案
在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...
- 微信小程序初步运营方案
小程序的运营方案有很多种,目前我们遇到两个事情需要解决:1.问答的内容,这块也是大家比较关心的话题.内容的定位和细节. 2.预热与推广,就这两个问题,我列出了一些自己的想法和小程序初步运营方案,有不足 ...
- Vijos 1025 小飞侠的游园方案 0-1背包
描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...
- P1025小飞侠的游园方案
描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:……(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...
- Ubuntu分区小知识与分区方案
Most PC operating systems still work with an ancient disk partition scheme that historically makes d ...
- EasyNVR结合阿里云/腾讯云CDN实现微信/小程序直播的方案
背景需求: 许多客户有这样的需求:微信公众号做为平台来对摄像机进行直播:可以让用户随时随地打开公共号就可以观看:保证画面的流畅性:保证视频的并发访问量等. 问题分析: 虽然需求看似很简单,其实真正实现 ...
- MaxCompute小文件问题优化方案
小文件背景知识 小文件定义 分布式文件系统按块Block存放,文件大小比块大小小的文件(默认块大小为64M),叫做小文件. 如何判断存在小文件数量多的问题 查看文件数量 desc extended + ...
随机推荐
- idea实现热部署并且开启自动编译
[注]本文转自https://blog.csdn.net/z15732621582/article/details/79439359博文,如有冒犯,请联系博主: 问题描述: 最近在调试代码并进行本地测 ...
- #error "OpenCV 4.x+ requires enabled C++11 support"解决方法
报错的本质是需要c++11的支持,顾名思义,当前的编译环境是c++11以下的版本.我用的cmake编译,因此再cmakelists文件内添加设置c++标准为14就可以编译通过. )
- C#将结构体和指针互转的方法
. 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库 命名空间:System.Runtime.InteropServices 程序集:mscorlib(在 msc ...
- js中的原型对象链
由于原型对象也是一个对象,它也有自己的原型对象并继承对象中的属性,这就是原型对象链:对象继承其原型对象,而原型对象继承它的原型对象,以此类推. 我们创建的每一个函数都有一个prototype(原型)属 ...
- hprose for php
1.客户端和服务器简单DEMO 通过工厂方法 create 创建客户端 $client = \Hprose\Client::create($uriList = null[, $async = true ...
- Django项目及应用的创建
一.url解释 1url是全球资源定位符,网上的每个文件都有唯一的url地址,组成:协议.服务器名称(或IP地址).路径和文件名. 2有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,U ...
- Win7 VS2017 NASM编译FFMPEG(2018.12.22)
今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...
- fiddler抓包工具总结
Fiddler 抓包工具总结 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也 ...
- 《vue.js快跑》总结:为什么选择VUE
2019-3-31 为什么选择Vue 有这个一个需求,我们需要根据后端数据接口请求返回的数组在页面中按列表展示? 传统上我们使用jQuery的Ajax发送http请求,获取数据.判断列表数据是否存在, ...
- 自定义react-navigation的TabBar
在某些情况下,默认的react-navigation的tab bar无法满足开发者的要求.这个时候就需要自定义一个tab bar了.本文就基于react-navigtion v2来演示如何实现一个自定 ...