[bzoj3351]Regions
这道题有一种较为暴力的做法,对于每个点枚举所有与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的更多相关文章
- bzoj3351:[ioi2009]Regions
思路:首先如果颜色相同直接利用以前的答案即可,可以离线排序或是在线hash,然后考虑怎么快速统计答案. 首先如果点a是点b的祖先,那么一定有点b在以点a为根的子树的dfs序区间内的,于是先搞出dfs序 ...
- BZOJ3351: [ioi2009]Regions(根号分治)
题意 题目链接 Sol 很神仙的题 我们考虑询问(a, b)(a是b的祖先),直接对b根号分治 如果b的出现次数\(< \sqrt{n}\),我们可以直接对每个b记录下与它有关的询问,这样每个询 ...
- 【dfs序】【二分】【主席树】【分块】bzoj3351 [ioi2009]Regions
http://dzy493941464.sinaapp.com/archives/96 那个SIZE貌似必须设成R*R/Q?不知为啥,自己算的不是这个的说. 本机AC,线上TLE. #include& ...
- [LeetCode] Surrounded Regions 包围区域
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- 验证LeetCode Surrounded Regions 包围区域的DFS方法
在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ ...
- Leetcode: Surrounded regions
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- LEETCODE —— Surrounded Regions
Total Accepted: 43584 Total Submissions: 284350 Difficulty: Medium Given a 2D board containing 'X' a ...
- [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 ...
- Leetcode 130. Surrounded Regions
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
随机推荐
- C# 类拓展方法
C#类拓展方法 要求: 扩展方法类必须为静态类: 拓展方法必须为静态方法,参数为this+需拓展类对象: 多个类拓展方法可以写在一个拓展类中: public class TestExtension { ...
- 字符串编码js第三方类库text-encoding
GITHUB地址:https://github.com/BCode001/text-encoding
- 浅谈一手MYSQL设计规范
前言: 最近牵头搞一个机场管理集团的项目,发现团队中的成员对于库表设计,有非常多的盲区.所以决定写一篇文章,总结一下最近工作的几年中,常用的一些数据库设计规范和思路. 目的 MySQL数据库与 Ora ...
- Python中字符串常用方法
capitalize() String.capitalize() 将字符串首字母变为大写 name = 'xiaoming' new_name = name.capitalize() print(ne ...
- MySQL灵魂拷问:36题带你面试通关!
大家好,我是大彬~ 今天给大家分享MySQL常考的面试题,看看你们能答对多少. 本期MySQL面试题的目录如下: 事务的四大特性? 事务隔离级别有哪些? 索引 什么是索引? 索引的优缺点? 索引的作用 ...
- fpic 和 fPIC
fpic 和 fPIC 区别 Code Gen Options (Using the GNU Compiler Collection (GCC)) 综下所述,生成适用于共享库的位置无关代码(PIC)时 ...
- javascript-jquery-更改jquery对象
在许多情况下,jquery代码所做的事情变成了:生成jquery对象A,操作对jquery象A:更改为jquery对象B,操作jquery对象B:更改为jqueryC,操作jquery对象C..... ...
- MIPI归纳---为什么阻抗为100欧姆
根据LVDS(Low Voltage Differential Signaling)电平定义的. LVDS差分信号PN两线最大幅度是350mV,内部一个恒流源电流是3.5mA.于是终端匹配电阻是100 ...
- 使用Egg改造订单系统展示效果,方便快速浏览
素材准备: 1.Egg.js Born to build better enterprise frameworks and apps with Node.js & Koa 为企业级框架和应用而 ...
- CF #749
A 题意 有个长度为n的序列, 每个数互不相同, 求总和最大的最长子序列, 并输出每个i: 题解 emmmmmm, 刚开始看到这个数据和题解被迷惑了, 以为有什么顺序, 并且一直在想一些复杂度较高的算 ...