考虑一对情侣(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。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+10;
  4. int head[N],to[N<<1],last[N<<1];
  5. int fa[N][20],dep[N],in[N],out[N];
  6. void add_edge(int x,int y) {
  7. static int cnt=0;
  8. to[++cnt]=y,last[cnt]=head[x],head[x]=cnt;
  9. }
  10. void dfs(int x,int pa) {
  11. static int cnt=0;
  12. in[x]=++cnt;
  13. dep[x]=dep[fa[x][0]=pa]+1;
  14. for(int i=1; (1<<i)<dep[x]; ++i)
  15. fa[x][i]=fa[fa[x][i-1]][i-1];
  16. for(int i=head[x]; i; i=last[i])
  17. if(to[i]!=pa) dfs(to[i],x);
  18. out[x]=cnt;
  19. }
  20. struct tree {
  21. int cover,len;
  22. } t[N<<2];
  23. #define ls (x<<1)
  24. #define rs (x<<1|1)
  25. void update(int x,int l,int r) {
  26. if(t[x].cover) t[x].len=r-l+1;
  27. else if(l==r) t[x].len=0;
  28. else t[x].len=t[ls].len+t[rs].len;
  29. }
  30. void modify(int x,int l,int r,int L,int R,int w) {
  31. if(L<=l&&r<=R) {
  32. t[x].cover+=w;
  33. update(x,l,r);
  34. return;
  35. }
  36. int mid=(l+r)>>1;
  37. if(L<=mid) modify(ls,l,mid,L,R,w);
  38. if(mid<R) modify(rs,mid+1,r,L,R,w);
  39. update(x,l,r);
  40. }
  41. #undef ls
  42. #undef rs
  43. struct seg {
  44. int type,h,l,r;
  45. bool operator<(const seg&d) const {
  46. return h!=d.h?h<d.h:type<d.type;
  47. }
  48. } s[N<<3];
  49. int n,m,cnt;
  50. void add_matrix(int a,int b,int c,int d) {
  51. if(a>b||c>d) return;
  52. s[++cnt]=(seg){1,c,a,b};
  53. s[++cnt]=(seg){-1,d+1,a,b};
  54. }
  55. long long get_area() {
  56. long long ret=0;
  57. sort(s+1,s+cnt+1);
  58. for(int i=1; i<cnt; ++i) {
  59. modify(1,1,n,s[i].l,s[i].r,s[i].type);
  60. ret+=1LL*(s[i+1].h-s[i].h)*t[1].len;
  61. }
  62. return ret;
  63. }
  64. void insert(int x,int y) {
  65. if(in[x]<in[y]&&out[y]<=out[x]) {
  66. add_matrix(1,in[x],in[y],out[y]);
  67. add_matrix(out[x]+1,n,in[y],out[y]);
  68. int dif=dep[y]-dep[x]-1,z=y;
  69. for(int i=19; ~i; --i) if((dif>>i)&1) z=fa[z][i];
  70. add_matrix(in[x]+1,in[z]-1,in[y],out[y]);
  71. add_matrix(out[z]+1,out[x],in[y],out[y]);
  72. return;
  73. }
  74. if(in[y]<in[x]&&out[x]<=out[y]) {
  75. add_matrix(in[x],out[x],1,in[y]);
  76. add_matrix(in[x],out[x],out[y]+1,n);
  77. int dif=dep[x]-dep[y]-1,z=x;
  78. for(int i=19; ~i; --i) if((dif>>i)&1) z=fa[z][i];
  79. add_matrix(in[x],out[x],in[y]+1,in[z]-1);
  80. add_matrix(in[x],out[x],out[z]+1,out[y]);
  81. return;
  82. }
  83. add_matrix(in[x],out[x],in[y],out[y]);
  84. }
  85. int main() {
  86. scanf("%d%d",&n,&m);
  87. for(int x,y,i=n; --i; ) {
  88. scanf("%d%d",&x,&y);
  89. add_edge(x,y);
  90. add_edge(y,x);
  91. }
  92. dfs(1,0);
  93. for(int x,y,i=1; i<=m; ++i) {
  94. scanf("%d%d",&x,&y);
  95. insert(x,y);
  96. insert(y,x);
  97. }
  98. printf("%lld\n",(1LL*n*n-get_area()-n)/2);
  99. return 0;
  100. }

突然想到一道以前的题,直接扔下思路好了(可能有点锅)

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\) 的子树外,一个在子树内。

    1. \(i\in[1,in_v]\) ,\(j\in[in_v,out_v]\)
    2. \(i\in[in_v,out_v]\) ,\(j\in(out_v,n]\) 。
    3. \(i\in[in_v,out_v]\) ,\(j\in[1,in_v]\) 。
    4. \(i\in(out_v,n]\) ,\(j\in[in_v,out_v]\) 。
  • \(i\) 和 \(j\) 分别位于以 \(v\) 的不同儿子为根的两个子树中。枚举一个儿子\(s\)
    1. \(i\in[in_v,in_s)\),\(j\in[in_s,out_s]\)。
    2. \(i\in[in_s,out_s]\),\(j\in(out_s,out_v]\)。
    3. \(i\in[in_s,out_s]\),\(j\in[in_v,in_s)\)。
    4. \(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] 小睿睿的方案的更多相关文章

  1. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...

  2. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...

  3. C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

    在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...

  4. 微信小程序初步运营方案

    小程序的运营方案有很多种,目前我们遇到两个事情需要解决:1.问答的内容,这块也是大家比较关心的话题.内容的定位和细节. 2.预热与推广,就这两个问题,我列出了一些自己的想法和小程序初步运营方案,有不足 ...

  5. Vijos 1025 小飞侠的游园方案 0-1背包

    描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...

  6. P1025小飞侠的游园方案

    描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:……(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...

  7. Ubuntu分区小知识与分区方案

    Most PC operating systems still work with an ancient disk partition scheme that historically makes d ...

  8. EasyNVR结合阿里云/腾讯云CDN实现微信/小程序直播的方案

    背景需求: 许多客户有这样的需求:微信公众号做为平台来对摄像机进行直播:可以让用户随时随地打开公共号就可以观看:保证画面的流畅性:保证视频的并发访问量等. 问题分析: 虽然需求看似很简单,其实真正实现 ...

  9. MaxCompute小文件问题优化方案

    小文件背景知识 小文件定义 分布式文件系统按块Block存放,文件大小比块大小小的文件(默认块大小为64M),叫做小文件. 如何判断存在小文件数量多的问题 查看文件数量 desc extended + ...

随机推荐

  1. OO学期总结

    一.测试与正确性论证差异对比 测试,顾名思义,就是用一些有意义或无意义的输入去检测程序的正确性或鲁棒性,因其直观明了所以在写简单的程序时我们能迅速找出bug并加以解决.并且,这种方式是绝对客观的,只要 ...

  2. 【mysql】:mysql性能优化总结

    一.Mysql引擎概述 1.MyISAM存储引擎 MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器:每当我们建立一个MyISAM引擎的表时,就会在本地 ...

  3. SHELL脚本学习-练习写一个脚本3

    #通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...

  4. thymelead入门 git地址在文档最后

    流程:##### 流程###### 1:pom添加依赖 <dependency> <groupId>org.springframework.boot</groupId&g ...

  5. 异步async与await的简单探究

    在学习.net core的过程中,到处见到异步的使用,Task.async.await随处可见.有点疑惑,就去了解了下这个过程是怎样的. 下面是一段代码,去看看是怎么执行的吧. 一.看看异步执行的方式 ...

  6. There is no getter for xxx 或者 will not be managed by Spring 解决

    今天使用mysql 的sql查询语句的时候(我是用的是ssm框架) 下面是我的查询语句,条件是根据business_id 和card_status 两个参数获取值 select  * from tb_ ...

  7. Mac更改PHP默认目录

    在Mac上搭建了PHP服务器以后,默认的路径为/Library/WebServer/Documents下面,但这让人很不爽,我想修改到自己定义的路径下.经过好一番折腾,终于成功了. PHPEclips ...

  8. Codeforces 888 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意简述:给一个数列,问有多少个峰值点(同时比两边都大/小的点) 思路:按照题意模拟. 代码: #include<bit ...

  9. Python的条件判断语句------if/else语句

    计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户的年龄,根据年龄打印不同的内容... Python程序中,能让计算机自己作出判断的语句就是if语句: 例: age = 25 ...

  10. Buffer.h

    #ifndef __NOXIMBUFFER_H__ #define __NOXIMBUFFER_H__ #include <cassert> #include <queue> ...