http://dzy493941464.sinaapp.com/archives/96

那个SIZE貌似必须设成R*R/Q?不知为啥,自己算的不是这个的说。

本机AC,线上TLE。

#include<cstdio>
#include<set>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int f,C;
void R(int &x){
C=0;f=1;
for(;C<'0'||C>'9';C=getchar())if(C=='-')f=-1;
for(x=0;C>='0'&&C<='9';C=getchar())(x*=10)+=(C-'0');
x*=f;
}
void P(int x){
if(x<10)putchar(x+'0');
else{P(x/10);putchar(x%10+'0');}
}
typedef double db;
#define N 200001
vector<int>Over,Nodes[N],col_in_sub[N];
typedef vector<int>::iterator ER;
int v[N],next[N],first[N],en,sz;
void AddEdge(int U,int V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
multiset<int>S;
int anss[701][701];
int n,K,m,a[N],Ls[N],Rs[N],pl[N];
int root[N],e;
struct Node{int v,lc,rc;}T[N*24];
void Insert(int pre,int cur,int p,int l,int r)
{
if(l==r)
{
T[cur].v=T[pre].v+1;
return;
}
int m=(l+r>>1);
if(p<=m)
{
T[cur].lc=++e; T[cur].rc=T[pre].rc;
Insert(T[pre].lc,T[cur].lc,p,l,m);
}
else
{
T[cur].rc=++e; T[cur].lc=T[pre].lc;
Insert(T[pre].rc,T[cur].rc,p,m+1,r);
}
T[cur].v=T[T[cur].lc].v+T[T[cur].rc].v;
}
int Query(int cur,int p,int l,int r)
{
if(l==r) return T[cur].v;
int m=(l+r>>1);
if(p<=m) return Query(T[cur].lc,p,l,m);
else return Query(T[cur].rc,p,m+1,r);
}
int fa[N],id[N];
void dfs(int U)
{
root[U]=++e;
Insert(root[fa[U]],root[U],a[U],1,K);
Ls[U]=++en;
if(pl[a[U]]>sz)
for(ER it=Over.begin();it!=Over.end();++it)
anss[id[*it]][id[a[U]]]+=S.count(*it);
S.insert(a[U]);
for(int i=first[U];i;i=next[i])
dfs(v[i]);
Rs[U]=en;
S.erase(S.find(a[U]));
}
int main()
{
int x,y;
R(n); R(K); R(m);
sz=K*K/m;
R(a[1]); ++pl[a[1]];
for(int i=2;i<=n;++i)
{
R(x); R(a[i]);
fa[i]=x;
++pl[a[i]];
AddEdge(x,i);
}
en=0;
for(int i=1;i<=n;++i)
{
if(pl[i]>sz)
{
if(!id[i]) id[i]=++en;
Over.push_back(i);
}
if(pl[a[i]]<=sz) Nodes[a[i]].push_back(i);
}
en=0; dfs(1);
for(int i=1;i<=n;++i) col_in_sub[a[i]].push_back(Ls[i]);
for(int i=1;i<=n;++i) sort(col_in_sub[i].begin(),col_in_sub[i].end());
for(;m;--m)
{
R(x); R(y);
if(pl[x]>sz&&pl[y]>sz) P(anss[id[x]][id[y]]),puts("");
else if(pl[x]<=sz)
{
int ans=0;
for(ER it=Nodes[x].begin();it!=Nodes[x].end();++it) if(Ls[*it]!=Rs[*it])
ans+=(upper_bound(col_in_sub[y].begin(),col_in_sub[y].end(),Rs[*it])-
lower_bound(col_in_sub[y].begin(),col_in_sub[y].end(),Ls[*it]+1));
P(ans); puts("");
}
else
{
int ans=0;
for(ER it=Nodes[y].begin();it!=Nodes[y].end();++it)
ans+=Query(root[fa[*it]],x,1,K);
P(ans); puts("");
}
}
return 0;
}

【dfs序】【二分】【主席树】【分块】bzoj3351 [ioi2009]Regions的更多相关文章

  1. 【BZOJ 4556】[Tjoi2016&Heoi2016]字符串 SAM+二分+主席树

    这道题市面上就两种法:一种是SA+二分+主席树,一种是SAM+二分+主席树(有不少人打线段树合并???)(除此之外还有一种利用炒鸡水的数据的暴力SA,贼快.....)(当时学SA的时候没做这道题,现在 ...

  2. BZOJ2653 middle 【二分 + 主席树】

    题目 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c ...

  3. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  4. bzoj3306: 树(dfs序+倍增+线段树)

    比较傻逼的一道题... 显然求子树最小值就是求出dfs序用线段树维护嘛 换根的时候树的形态不会改变,所以我们可以根据相对于根的位置分类讨论. 如果询问的x是根就直接输出整棵树的最小值. 如果询问的x是 ...

  5. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  6. [bzoj2653][middle] (二分 + 主席树)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  7. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

  8. Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)

    思路: dfs序其实是很水的东西.  和树链剖分一样, 都是对树链的hash. 该题做法是:每次对子树全部赋值为1,对一个点赋值为0,查询子树最小值. 该题需要注意的是:当我们对一棵子树全都赋值为1的 ...

  9. Codeforces Round #276 (Div. 1) E. Sign on Fence 二分+主席树

    E. Sign on Fence   Bizon the Champion has recently finished painting his wood fence. The fence consi ...

  10. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

随机推荐

  1. The 13th Zhejiang Provincial Collegiate Programming Contest - D

    The Lucky Week Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward, the headmaster of the Marja ...

  2. SICAU-OJ: 三角关系

    三角关系 题意: 给出两个数n和k,统计(a,b,c)三元组满足(a+b)%k=0,(b+c)%k=0,(a+c)%k=0且1<=a,b,c<=n的数量. 题解: 由(a+b)%k=0,( ...

  3. C++ 中 string, char*, int 类型的相互转换

    一.int 1.int 转换成 string 1) to_string函数 —— c++11标准增加了全局函数std::to_string: string to_string (int val); s ...

  4. jquery教程-Jquery 获取标签个数 size()函数用法

    jquery教程-Jquery 获取标签个数 size()函数用法,size() 方法返回被 jQuery 选择器匹配的元素的数量. 语法 $(selector).size()     jQuery ...

  5. 【数据结构】bzoj2957楼房重建

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  6. 【BZOJ2330】【SCOI2011】糖果 [差分约束]

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 幼儿园 ...

  7. 【BZOJ2663】灵魂宝石 [二分]

    灵魂宝石 Time Limit: 5 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description “作为你们本体的灵魂,为了能够更好的 ...

  8. 全局axios默认值 和 自定义实例默认值

    首先说了一下情况, 登录后成功返回token 然后在带着token去继续下面的请求, 奇怪的是都是当前页面起作用,刷新和跳转之后就token 就消失了. 查了 axios文档发现 被自己坑了 我设置了 ...

  9. Python学习笔记 - day6 - 函数

    函数 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多次执行(这叫函数的调用).函数在编程语言中有基本分为:预 ...

  10. MySQL 查询语句练习2

    创建表 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50719 Sour ...