BZOJ 3757 苹果树 ——莫队算法
挺好的一道题目,怎么就没有版权了呢?大数据拍过了,精神AC。。。。
发现几种颜色这性质比较垃圾,不可加,莫队硬上。
%了一发popoqqq大神的博客,
看了一波VFK关于糖果公园的博客,
又找了wjmzbmr的博客看了看块状树。
感觉看了很多,明白了:
还TM是抄代码舒服
同序列上的莫队算法,只需要分块,排序之后进行统计,但是要注意更新状态的方法。
根据VFK所说的,为了方便操作,(否则直接暴力维护会有四种情况需要讨论)
我们统计时,把两点间的lca统一去掉,然后类似方法去维护。查询答案时加上、统计、再删去即可。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define maxn 100005
int n,m,col[maxn],h[maxn],to[maxn],ne[maxn],en=0;
int f[maxn][20],dep[maxn],sta[maxn],top=0,blo,cnt;
int bel[maxn],dfsid[maxn],tot=0,hav[maxn],in[maxn];
int nowans,ans[maxn],siz[maxn];
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void add(int a,int b)
{to[en]=b;ne[en]=h[a];h[a]=en++;} void dfs(int x,int fa)
{
dfsid[x]=++tot;f[x][0]=fa;
if (siz[bel[fa]]==blo) bel[x]=++cnt;
else bel[x]=bel[fa];
siz[bel[x]]++;
for (int i=h[x];i>=0;i=ne[i])
if (to[i]!=fa){
dep[to[i]]=dep[x]+1;
dfs(to[i],x);
}
} struct Query{
int u,v,a,b,id;
void gett(){
u=read();v=read();a=read();b=read();
if (dfsid[u]>dfsid[v]) swap(u,v);
}
}b[maxn]; bool cmp(Query x,Query y)
{
return bel[x.u]==bel[y.u]?
bel[x.v]<bel[y.v]:bel[x.u]<bel[y.u];
} int lca(int a,int b)
{
if (dep[a]<dep[b]) swap(a,b);
if (a==b) return a;
int dist=dep[a]-dep[b];
D(i,15,0) if (dist&(1<<i)) a=f[a][i];
if (a==b) return a;
D(i,15,0) if (f[b][i]!=f[a][i])
{
b=f[b][i];
a=f[a][i];
}
return f[a][0];
} void rev(int x)
{
if (!x) return;
if (in[x])
{
in[x]^=1,hav[col[x]]--;
if (hav[col[x]]==0) nowans--;
}
else
{
in[x]^=1,hav[col[x]]++;
if (hav[col[x]]==1) nowans++;
}
} void rever(int x,int y)
{
int z=lca(x,y);
while (x!=z) rev(x),x=f[x][0];
while (y!=z) rev(y),y=f[y][0];
} int main()
{
memset(h,-1,sizeof h);
n=read();m=read();
blo=sqrt(n+1)+1e-5;
F(i,1,n)
col[i]=read();
F(i,1,n)
{
int a,b;
a=read();b=read();
add(a,b);add(b,a);
}
dfs(0,0); while(top)bel[sta[top--]]=cnt;
F(i,1,15) F(j,0,n) f[j][i]=f[f[j][i-1]][i-1];
F(i,1,m) b[i].gett(),b[i].id=i;
sort(b+1,b+m+1,cmp);
int nowu=0,nowv=0;
F(i,1,m)
{
rever(nowu,b[i].u);
rever(nowv,b[i].v);
nowu=b[i].u;nowv=b[i].v;
rev(lca(b[i].u,b[i].v));
ans[b[i].id]=nowans-(hav[b[i].a]&&hav[b[i].b]&&(b[i].a!=b[i].b));
rev(lca(b[i].u,b[i].v));
}
F(i,1,m) printf("%d\n",ans[i]);
}
BZOJ 3757 苹果树 ——莫队算法的更多相关文章
- bzoj 4358 Permu - 莫队算法 - 链表
题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...
- bzoj 2038(莫队算法)
2038: [2009国家集训队]小Z的袜子(hose) 时间限制: 20 Sec 内存限制: 259 MB 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来 ...
- bzoj 3757 树上莫队
感谢以下文章作者: http://blog.csdn.net/kuribohg/article/details/41458639 http://vfleaking.blog.163.com/blog/ ...
- BZOJ - 3757 树上莫队解决离线路径问题 & 学习心得
题意:给你一棵树,求u,v最短路径的XXX(本题是统计权值种类) 今天课上摸鱼学了一种有意思的处理路径方式(其实是链式块状树翻车了看别的),据说实际运行跑的比XX记者还快 大概就是像序列莫队那样 首先 ...
- bzoj 2038 A-小Z的袜子[hose] - 莫队算法
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法
[题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...
- 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...
随机推荐
- 洛谷 P1926 小书童——刷题大军
题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人. 文言是火,点亮历史宫灯:历史是灯,照亮社会之路:社会是路,通向哲学大坑:哲学是坑,埋葬文科生 ...
- Objective-C中关于NSArray, NSDictionary, NSNumber等写法的进化
从xcode4.4开始,LLVM4.0编译器为Objective-C添加一些新的特性.创建数组NSArray,哈希表NSDictionary, 数值对象NSNumber时,可以像NSString的初始 ...
- Luogu P4593 [TJOI2018]教科书般的亵渎
亵渎终于离开标准了,然而铺场快攻也变少了 给一个大力枚举(无任何性质)+艹出自然数幂和的方法,但是复杂度极限是\(O(k^4)\)的,不过跑的好快233 首先简单数学分析可以得出\(k=m+1\),因 ...
- gEdit - GTK+ 基础文本编辑器
语法 gedit [--help] [--version] [文件名] [文件名] [文件名] 等等... 描述 gEdit 是一个 X窗口系统下的基础文本编辑器由 GTK+ 写成.它现在支持建立,打 ...
- Asp.Net Core 进阶(一) —— 读取appsettings.json
我们以前在Asp.Net MVC中使用 System.Configuration.ConfigurationManager 来读取web.config文件.但是Asp.Net Core MVC已经没有 ...
- Python 字典dict 集合set
字典dict Python内置字典,通过key-value进行存储,字典是无序的,拓展hash names = ['Michael', 'Bob', 'Tracy'] scores = [95, 75 ...
- AEE加密解密
from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hex class AesHandler(object): def ...
- Day5 集合的深浅copy
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试, ...
- 洛谷 P2846 光开关
https://www.luogu.org/problemnew/show/P2846 好多题解用线段树来写,然而分块不是更简单好些吗? 一个数组use记录这一块进行了多少次开关操作,两边单独计算,注 ...
- (42)zabbix使用IT services 了解服务器SLA整体情况
什么是IT Services 服务器或者某项服务.业务的可用率,不懂技术的上级领导会过问最近服务器可用率如何.所有api的状况怎么样? 通常一些技术人员会说负载怎么样,哪些cpu使用率怎么样,硬盘使用 ...