BZOJ

表示非常爽2333


\(Description\)

给定一棵\(n\)个点的树,每个点有一个属性\(1\leq r_i\leq R\)。

\(Q\)次询问,每次询问给定\(r1,r2\),求有多少点对\((x,y)\)满足,\(r_x=r1,\ r_y=r2\),且\(x\)是\(y\)的祖先。

\(n,q\leq2\times10^5,\ R\leq25000\)。

\(Solution\)

对属性为\(r2\)的有多少个点分类讨论。

若\(\leq\sqrt n\),在每个点处暴力统计它祖先的贡献;

若\(\gt\sqrt n\),则这样的属性不超过\(\sqrt n\)种,在属性为\(r1\)的点上暴力枚举这些\(r2\)更新答案(这里可以差分:进入子树前与访问完子树后)。

显然对于第二种情况,在每个点上,要对询问的\(r2\)去重才能保证复杂度(然而数据没卡不去重好像也能过...)。

关于如何去重,自己想的是,对\(r2\)相同的一些询问,要同时更新它们。大概以\(r2\)为关键字sort下,就可以差分了?

事实上对询问点对\((r1,r2)\)判一下重就可以了...如果出现够询问\((r1,r2)\),就直接用之前的作答案。

复杂度\(O(n\sqrt n+q\sqrt n)\)。

树分块做法,然而懒得看。


//28360kb	7720ms
#include <map>
#include <cmath>
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define mp std::make_pair
#define pr std::pair<int,int>
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=2e5+5,M=25005; int Enum,H[N],nxt[N],A[N],Ans[N];
std::vector<pr> v1[M],v2[M];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void AE(int u,int v)
{
nxt[v]=H[u], H[u]=v;
}
void DFS(int x)
{
static int sum1[N],sum2[N]; const std::vector<pr> &vec2=v2[A[x]];//一开始&忘了写...我说怎么MLE=-=
for(int i=0,l=vec2.size(); i<l; ++i)
Ans[vec2[i].second]+=sum2[vec2[i].first]; ++sum1[A[x]], ++sum2[A[x]];
const std::vector<pr> &vec1=v1[A[x]];
for(int i=0,l=vec1.size(); i<l; ++i)
Ans[vec1[i].second]-=sum1[vec1[i].first]; for(int v=H[x]; v; v=nxt[v]) DFS(v); for(int i=0,l=vec1.size(); i<l; ++i)
Ans[vec1[i].second]+=sum1[vec1[i].first];
--sum2[A[x]];
} int main()
{
static int pos[N],cnt[M]; const int n=read(),R=read(),Q=read(),size=sqrt(n);
++cnt[A[1]=read()];
for(int i=2; i<=n; ++i) AE(read(),i), ++cnt[A[i]=read()]; std::map<pr,int> f;
std::map<pr,int>::iterator it;
for(int i=1; i<=Q; ++i)
{
int r1=read(),r2=read();
if((it=f.find(mp(r1,r2)))==f.end())
{
f[mp(r1,r2)]=pos[i]=i;
if(cnt[r2]<=size) v2[r2].push_back(mp(r1,i));
else v1[r1].push_back(mp(r2,i));
}
else pos[i]=it->second;
}
DFS(1);
for(int i=1; i<=Q; ++i) printf("%d\n",Ans[pos[i]]);//其实应该用long long的=v= return 0;
}

BZOJ.3351.[IOI2009]Regions(根号分治 差分)的更多相关文章

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

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

  2. BZOJ 3351: [ioi2009]Regions

    对于一个询问(x,y)对y出现次数分类,若<=lim,在儿子处统计答案,若>lim则y的种类肯定<lim,在祖先处统计(仿佛要去重?但是没去重也过了,那个时限仿佛怎么做都能过) #i ...

  3. BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)

    BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...

  4. [CF587F]Duff is Mad[AC自动机+根号分治+分块]

    题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...

  5. CF587F-Duff is Mad【AC自动机,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出\(n\)个字符串\(s\).\(q\)次询问给出\(l,r,k\)要求输出\(s_{l. ...

  6. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  7. Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]

    洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...

  8. CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表

    传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...

  9. CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表

    CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...

随机推荐

  1. 解决npm install过程中报错:unable to verify the first certificate

    今天使用npm安装开发包时遇到“unable to verify the first certificate”(无法验证第一证书)这个问题 原因:2014年2月27日,npm不再支持自签名证书.因为n ...

  2. Gson将字符串转map时,int默认为double类型

      gson能够将json字符串转换成map, 但是在转成map时, 会默认将字符串中的int , long型的数字, 转换成double类型 , 数字会多一个小数点 , 如 1 会转成 1.0 Gs ...

  3. js基本类型和字符串的具体应用

    变量 JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 'var' var a = 123; var b = 'asd'; //同时定义多个 ...

  4. settings.py常见配置项

    settings.py常见配置项 1. 配置Django_Admin依照中文界面显示 LANGUAGE_CODE = 'zh-hans' 2. 数据库配置(默认使用sqlite3) 1 .默认使用的s ...

  5. jxoi2017

    题解: 并不知道题目顺序就按照难度排序了 [JXOI2017]加法 这是一道很简单的贪心 最小值最大二分答案 然后我们可以从左向右考虑每一个位置 如果他还需要+A 我们就从能覆盖它的区间中挑一个最右的 ...

  6. UICollectionViewController的用法1

    UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableVie ...

  7. Summary of continuous function spaces

    In general differential calculus, we have learned the definitions of function continuity, such as fu ...

  8. 通过impala更改Kudu表属性

    开发人员可以通过更改表的属性来更改 Impala 与给定 Kudu 表相关的元数据.这些属性包括表名, Kudu 主地址列表,以及表是否由 Impala (内部)或外部管理. Rename an Im ...

  9. LVM管理之减少LV的大小

    LVM管理之减少LV的大小 规定动作 1.umount filesystem 2.e2fsck filesystem 3.resize2fs filesystem 4.lvredure 实例演示——— ...

  10. Codeforces 609F Frogs and mosquitoes 线段树

    Frogs and mosquitoes 用线段树维护每个点覆盖的最小id, 用multiset维护没有吃的蚊子. #include<bits/stdc++.h> #define LL l ...