这道题有一种较为暴力的做法,对于每个点枚举所有与r2为该属性的询问并加以修改,最坏时间复杂度为o(nq),然而是可过的(97s)

发现只有当r2相同的询问数特别多时才会达到最坏时间复杂度,因此如果删除重复询问,时间复杂度降为o(nr),然而并没有显著优化(81s)

接着考虑当同一种r2的询问特别多时(大于K),可以从r1考虑,分析一下时间复杂度发现是$o(n\cdot max(K,R/K))\ge o(n\sqrt{R})$,即取$K=\sqrt{R}$,此时只要13s

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 vector<int>v1[N],v2[N];
5 struct ji{
6 int nex,to;
7 }edge[N];
8 map<pair<int,int> ,int>mat;
9 int E,n,m,q,x,y,sum[N],a[N],b[N],f[N],ans[N],tot[N],head[N];
10 void add(int x,int y){
11 edge[E].nex=head[x];
12 edge[E].to=y;
13 head[x]=E++;
14 }
15 void dfs(int k,int fa){
16 tot[a[k]]++;
17 for(int i=0;i<v2[a[k]].size();i++){
18 x=v2[a[k]][i];
19 ans[x]+=tot[b[x]];
20 }
21 for(int i=head[k];i!=-1;i=edge[i].nex)
22 if (edge[i].to!=fa)dfs(edge[i].to,k);
23 tot[a[k]]--;
24 }
25 void dfs2(int k,int fa){
26 tot[a[k]]++;
27 for(int i=0;i<v1[a[k]].size();i++){
28 x=v1[a[k]][i];
29 ans[x]-=tot[b[x]];
30 }
31 for(int i=head[k];i!=-1;i=edge[i].nex)
32 if (edge[i].to!=fa)dfs2(edge[i].to,k);
33 for(int i=0;i<v1[a[k]].size();i++){
34 x=v1[a[k]][i];
35 ans[x]+=tot[b[x]];
36 }
37 }
38 int main(){
39 scanf("%d%d%d",&n,&m,&q);
40 memset(head,-1,sizeof(head));
41 for(int i=1;i<=n;i++){
42 if (i!=1){
43 scanf("%d",&x);
44 add(x,i);
45 }
46 scanf("%d",&a[i]);
47 sum[a[i]]++;
48 }
49 for(int i=1;i<=q;i++){
50 scanf("%d%d",&x,&y);
51 if (mat[make_pair(x,y)])f[i]=mat[make_pair(x,y)];
52 else{
53 f[i]=mat[make_pair(x,y)]=i;
54 if (sum[y]>500){
55 v1[x].push_back(i);
56 b[i]=y;
57 }
58 else{
59 v2[y].push_back(i);
60 b[i]=x;
61 }
62 }
63 }
64 dfs(1,0);
65 dfs2(1,0);
66 for(int i=1;i<=q;i++)printf("%d\n",ans[f[i]]);
67 }

[bzoj3351]Regions的更多相关文章

  1. bzoj3351:[ioi2009]Regions

    思路:首先如果颜色相同直接利用以前的答案即可,可以离线排序或是在线hash,然后考虑怎么快速统计答案. 首先如果点a是点b的祖先,那么一定有点b在以点a为根的子树的dfs序区间内的,于是先搞出dfs序 ...

  2. BZOJ3351: [ioi2009]Regions(根号分治)

    题意 题目链接 Sol 很神仙的题 我们考虑询问(a, b)(a是b的祖先),直接对b根号分治 如果b的出现次数\(< \sqrt{n}\),我们可以直接对每个b记录下与它有关的询问,这样每个询 ...

  3. 【dfs序】【二分】【主席树】【分块】bzoj3351 [ioi2009]Regions

    http://dzy493941464.sinaapp.com/archives/96 那个SIZE貌似必须设成R*R/Q?不知为啥,自己算的不是这个的说. 本机AC,线上TLE. #include& ...

  4. [LeetCode] Surrounded Regions 包围区域

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...

  5. 验证LeetCode Surrounded Regions 包围区域的DFS方法

    在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ ...

  6. Leetcode: Surrounded regions

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...

  7. LEETCODE —— Surrounded Regions

    Total Accepted: 43584 Total Submissions: 284350 Difficulty: Medium Given a 2D board containing 'X' a ...

  8. [REP]AWS Regions and Availability Zones: the simplest explanation you will ever find around

    When it comes to Amazon Web Services, there are two concepts that are extremely important and spanni ...

  9. Leetcode 130. Surrounded Regions

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

随机推荐

  1. JVM堆内存泄露分析

      一.背景 公司有一个中间的系统A可以对接多个后端业务系统B,一个业务系统以一个Namespace代表, Namespace中包含多个FrameChannel(用holder保存),表示A连接到业务 ...

  2. 教你 4 步搭建弹性可扩展的 WebAPI

    作者 | 萧起  阿里云云原生团队 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 Se ...

  3. 洛谷2408不同字串个数/SPOJ 694/705 (后缀数组SA)

    真是一个三倍经验好题啊. 我们来观察这个题目,首先如果直接整体计算,怕是不太好计算. 首先,我们可以将每个子串都看成一个后缀的的前缀.那我们就可以考虑一个一个后缀来计算了. 为了方便起见,我们选择按照 ...

  4. 洛谷3769[CH弱省胡策R2]TATT (KDTree)(四维LIS)

    真是一个自闭的题目(调了一个上午+大半个下午) 从\(WA\)到\(WA+TLE\)到\(TLE\)到\(AC\) 真的艰辛. 首先,这个题,我们可以考虑直接上四维KDTree来解决. 对于kdtre ...

  5. pycharm设置文件中显示模板内容

    pycharm中设置自己的文件模板  File>>Settings>>Editor>>File and Code Templates 选择文件类型或者输入文件类型 ...

  6. Golang通脉之指针

    指针的概念 指针是存储另一个变量的内存地址的变量. 变量是一种使用方便的占位符,用于引用计算机内存地址. 一个指针变量可以指向任何一个值的内存地址. 在上面的图中,变量b的值为156,存储在内存地址0 ...

  7. SingleR如何使用自定义的参考集

    在我之前的帖子单细胞分析实录(7): 差异表达分析/细胞类型注释里面,我已经介绍了如何使用SingleR给单细胞数据做注释,当时只讲了SingleR配套的参考集.这次就讲讲如何使用自己定义/找到的基因 ...

  8. AIApe问答机器人Scrum Meeting 4.29

    Scrum Meeting 4 日期:2021年4月29日 会议主要内容概述:汇报两日工作,讨论任务优先级. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明 ...

  9. [no code][scrum meeting] Beta 9

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月23日15:30,主持者:肖思炀 下次例会时间:5月25日11:30,主持者:伦泽标 一.工作 ...

  10. 关于linux下编译的几点知识

    1.-L.-rpath 和 rpath_link的区别 参考博客文章:https://www.cnblogs.com/candl/p/7358384.html (1)-rpath和-rpath-lin ...