Regions

题解

题目相当于让我们求颜色为r1r1r1的点uuu与颜色为r2r2r2的点vvv之间是祖先儿子关系的这样的(u,v)(u,v)(u,v)的对数。
我们可以先考虑将数据离线下来,如果每次只处理两个颜色之间的就太浪费时间了,题目的RRR明明比QQQ小这么多。
我们可以进行一次dfsdfsdfs,到达每个节点时,记录下它的祖先链上的每种颜色的点的个数,对于询问(r1,r2)(r1,r2)(r1,r2),我们就在枚举到颜色为r2r2r2的节点时将它祖先中颜色为r1r1r1的节点的数量加入答案。

但很明显,如果我们大部分询问都在问一种颜色的节点,而这个颜色的节点数量又比较多,那么这种操作就会执行很多次,然后,就TTT了。
所以我们可以考虑按查询的次数进行分块,对于颜色iii,如果它在询问中从当r2r2r2的次数不超过SSS次,那么我们就使用上面的方法统计答案。
这样下来,我们在dfsdfsdfs遍历树时每个节点最多会进行SSS次操作,这个部分时间复杂度是O(nS)O\left(nS\right)O(nS)的。

而对于出现次数大于SSS的颜色,它们最多会有qS\frac{q}{S}Sq​个,我们可以对这些颜色都进行一次dfsdfsdfs。dfsdfsdfs颜色colcolcol时,对于每个节点,统计它的子节点中颜色colcolcol的出现次数。
对于询问(r1,r2)(r1,r2)(r1,r2)就将所有颜色为r1r1r1的点的和计入答案。
由于每个颜色都会进行一次dfsdfsdfs,所以容易发现这个的时间复杂度是O(nqS)O\left(n\frac{q}{S}\right)O(nSq​)。

总时间复杂度O(nS+nqS+q)O\left(nS+n\frac{q}{S}+q\right)O(nS+nSq​+q),容易发现这个在S=qS=\sqrt{q}S=q​时取最小值,时间复杂度O(nq+q)O\left(n\sqrt{q}+q\right)O(nq​+q)。
实测当SSS稍微大一点时跑得快一点。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 200005
#define MAXM 25005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long LL;
typedef unsigned long long uLL;
const LL INF=1000000000000000000LL;
const int mo=1e9+7;
const int n1=800;
const int inv2=499122177;
const int jzm=2333;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-7;
typedef pair<int,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1LL)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1LL;}return t;}
int n,R,q,head[MAXN],tot,val[MAXN],dp[MAXM],ans[MAXN],gp[MAXN],sum[MAXM];
vector<int>vec[MAXM];
struct ming{int r1,r2;}s[MAXN];
struct edge{int to,nxt;}e[MAXN<<1];
void addEdge(int u,int v){e[++tot]=(edge){v,head[u]};head[u]=tot;}
void dosaka(int u,int fa){if(vec[val[u]].size()<n1)for(int i=0;i<vec[val[u]].size();i++){int id=vec[val[u]][i];ans[id]+=dp[s[id].r1];}dp[val[u]]++;for(int i=head[u];i;i=e[i].nxt)if(e[i].to!=fa)dosaka(e[i].to,u);dp[val[u]]--;
}
void dosaka2(int u,int fa,int col){gp[u]=0;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa)continue;dosaka2(v,u,col);gp[u]+=gp[v];}sum[val[u]]+=gp[u];if(val[u]==col)gp[u]++;
}
signed main(){read(n);read(R);read(q);read(val[1]);for(int i=2;i<=n;i++){int fa;read(fa);read(val[i]);addEdge(i,fa);addEdge(fa,i);}for(int i=1;i<=q;i++){read(s[i].r1);read(s[i].r2);vec[s[i].r2].push_back(i);}dosaka(1,0);for(int i=1;i<=R;i++){if(vec[i].size()<n1)continue;dosaka2(1,0,i);for(int j=0;j<vec[i].size();j++){int id=vec[i][j];ans[id]=sum[s[id].r1];}for(int j=1;j<=R;j++)sum[j]=0;}for(int i=1;i<=q;i++)printf("%d\n",ans[i]);return 0;
}

[IOI2009]Regions相关推荐

  1. 专题突破一之分块——Untitled Problem II,Balanced Lineup,[ioi2009]Regions

    文章目录 SP2940 UNTITLE1 - Untitled Problem II source solution code Balanced Lineup source code Count on ...

  2. BZOJ3351 [ioi2009]Regions

    首先是关于这道题的扯淡:早上闲来无事开始orz 2015年的集训队论文,然后发现里面有讲这题--然后就照着邹逍遥神犇讲的分块方法写写写,结果写完交上去发现MLE了,尼玛128MB n根号n内存根本过不 ...

  3. 【Luogu】P5901 [IOI2009] regions

    题目链接 点击打开链接 题目解法 这道题在线不好做,所以我们考虑把问题离线下来 考虑把询问挂在地区上 现在有两种计算的方式 把询问挂在 e1 上 题意转化成询问在 e1 的子树中,有多少颜色是 r2 ...

  4. [LeetCode] 130. Surrounded Regions Java

    题目:Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A ...

  5. [leetcode]Surrounded Regions @ Python

    原题地址:https://oj.leetcode.com/problems/surrounded-regions/ 题意: Given a 2D board containing 'X' and 'O ...

  6. Reconstructing complex regions of genomes using long-read sequencingtechnology

    Reconstructing complex regions of genomes using long-read sequencingtechnology 对复杂区域大片段重复序列的组装仍然是基因组 ...

  7. RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础

    RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础 Abstract: 贡献主要有两点1:可以将卷积神经网络应用region proposal的策略,自底下上训练可以 ...

  8. LeetCode: Surrounded Regions [130]

    [题目] Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is cap ...

  9. RCNN (Regions with CNN) 目标物检测

    转载自: RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础 - 楼燚航的blog - 博客园 http://www.cnblogs.com/louyihang-lo ...

  10. 04_05_06:设置线型风格(设置线型风格)、区域着色 (Shading Regions)、设置Spines

    4.设置线型风格 4.1.设置线型风格 5.区域着色 (Shading Regions) 6.设置Spines 4.设置线型风格 4.1.设置线型风格 可以使用绘图函数的linestyle或ls参数来 ...

最新文章

  1. Shell-06 函数
  2. 人工智能:第二章 知识表示方法
  3. React 之 高阶组件的理解
  4. 天气预报今天几点下雨_今天,秦皇岛多家景区临时闭园!最新天气预报发布
  5. 最新25个高质量PSD素材免费下载
  6. Rust 升级成微软第一梯队语言;“熊孩子”乱敲键盘攻破 Linux 桌面;500 个值得学习的 AI 开源项目| 开发者周刊...
  7. GJB 软件质量保证计划(模板)
  8. java lbp_LBP特征提取原理及代码实现
  9. JEB2.2.7闪退
  10. MATLAB遗传算法求函数最值
  11. 内网代理——常用工具
  12. HTTP协议和TCP/IP协议与Socket之间的区别
  13. 建设工程施工合同系列一建工合同的范围(未完待续)
  14. linux下安装虚拟天文馆,如何在Ubuntu 18.04/17.10/16.04中安装Stellarium 0.17.0 虚拟天文馆...
  15. 被人盗用身份证复印件办了信用卡的后续处理
  16. MongoDB面试问题
  17. 给国外教授发邮件_如何给您的教授发送电子邮件并获得快速回复
  18. 100多个flash常见问题大收集
  19. 【wechat】微信开发——OAuth2.0网页授权
  20. 微信第三方登录接口开发

热门文章

  1. matlab中abs( )函数
  2. C#加密Excel文件
  3. C#针式打印机自定义纸张连续打印爬坑过程
  4. Android超炫图片浏览器代码
  5. 暴风影音下载|暴风影音播放器下载
  6. 【E类】Linux视频课程集
  7. java跳转到ie_ie跳转chrome(ie浏览器点击链接跳转谷歌浏览器)
  8. 国家图书馆认证中国长峰制定的《婴幼儿血管瘤临床路径》
  9. 制作京东快报页面html,仿京东首页的京东快报,自动向上滚动的广告条
  10. Cisco Aironet系列AP的瘦胖转换