这道题有一种较为暴力的做法,对于每个点枚举所有与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. 10.6.2 sendfile

    1.传统Linux中 I/O 的问题 2.传统的 Linux 系统的标准 I/O 接口( read. write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_ ...

  2. SpringBoot之日志注解和缓存优化

    SpringBoot之日志注解和缓存优化 日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+Aop的方式来实现日志的输出: 首先需要定义一个注解类: @ ...

  3. 2.3 Core Building Blocks 核心构件

    Core Building Blocks 核心构件 DDD mostly focuses on the Domain & Application Layers and ignores the ...

  4. Java继承、重写与重载

    1.java继承 1.1概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 继承可以使用extends和implem ...

  5. '\r'(回车符),'\n'(换行符)与"\r\n"

    一.'\n','\r'和"\r\n" 回车\r本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return(回车,carriage有&q ...

  6. win10安装git fatal: open /dev/null or dup failed: No such file or directory错误解决方法

    原因看大家意思应该是 非即插即用驱动文件null.sys问题. 网上有很多方案.最后试了一个可行的. 替换  windows/system32/drivers/null.sys为网盘中的文件即可. 链 ...

  7. 混合开发框架Flutter

    Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...

  8. 攻防世界 杂项 3.神奇的Modbus

    [目标] 了解modbus协议 [工具] Wireshark [分析过程] 在数据包中寻找flag就行,flag是明文形式存储. 工业设备消息传输使用modbus协议.所以我就采集了modbus的通信 ...

  9. 密码学基础:AES加密算法

    [原创]密码学基础:AES加密算法-密码应用-看雪论坛-安全社区|安全招聘|bbs.pediy.com 目录 基础部分概述: 第一节:AES算法简介 第二节:AES算法相关数学知识 素域简介 扩展域简 ...

  10. AXI总线简介、ID分析、DMA、Vivado烧录、系统集成

    转载:https://blog.csdn.net/CrazyUncle/article/details/89918030?depth_1-utm_source=distribute.pc_releva ...