P3180 [HAOI2016]地图
显然,这是一个仙人掌图
inline void tarjan(LL u,LL fa){
low[u]=dfn[u]=++tot,
pre[tot]=u;
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!dfn[v])
tarjan(v,u),
low[u]=min(low[u],low[v]);
else
low[u]=min(low[u],dfn[v]);
}
}
void Dfs(LL u){
xu[u]=++tot,
size[u]=1,
b[tot]=a[u];//拍扁莫队
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!xu[v]&&low[v]>=dfn[u])
Dfs(v),
size[u]+=size[v];
}
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!xu[v]&&low[v]<dfn[u])
Dfs(v),
size[pre[low[v]]]+=size[v];//返回割点那里
}
}
只有割点能造成贡献,要统计的就是割点的子树,dfs序拍扁莫队离线处理,分块优化
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxn=2000000;
inline LL Read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
struct node{
LL to,next;
}dis[maxn];
LL num,tot,n,m,m_val,Size,pieces,sum,l=1,r=0;
LL a[maxn],head[maxn],b[maxn],visit[maxn],fk[maxn][2];
LL low[maxn],dfn[maxn],size[maxn],pre[maxn],xu[maxn];
LL belong[maxn],bl[maxn],br[maxn],ans[maxn];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]},head[u]=num;
}
inline void tarjan(LL u,LL fa){
low[u]=dfn[u]=++tot,
pre[tot]=u;
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!dfn[v])
tarjan(v,u),
low[u]=min(low[u],low[v]);
else
low[u]=min(low[u],dfn[v]);
}
}
void Dfs(LL u){
xu[u]=++tot,
size[u]=1,
b[tot]=a[u];//拍扁莫队
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!xu[v]&&low[v]>=dfn[u])
Dfs(v),
size[u]+=size[v];
}
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!xu[v]&&low[v]<dfn[u])
Dfs(v),
size[pre[low[v]]]+=size[v];//返回割点那里
}
}
struct code{
LL l,r,op,val,id;
}q[maxn];
inline bool cmp(code x,code y){
return (belong[x.l]^belong[y.l])?
belong[x.l]<belong[y.l]:
(belong[x.l]&1)?x.r<y.r:x.r>y.r;
}
inline void Inc(LL c){
LL now=belong[c];
if(visit[c]&1)//奇数
--fk[now][1],
++fk[now][0];
else if(visit[c])//偶数出现过
++fk[now][1],
--fk[now][0];
else
++fk[now][1];
++visit[c];
}
inline void Del(LL c){
LL now=belong[c];
if(!(visit[c]&1))//偶数
++fk[now][1],
--fk[now][0];
else if(visit[c]^1)//
--fk[now][1],
++fk[now][0];
else
--fk[now][1];
--visit[c];
}
int main(){
n=Read(),m=Read();
for(LL i=1;i<=n;++i)
a[i]=Read();
for(LL i=1;i<=m;++i){
LL u,v;
Add(u=Read(),v=Read()),Add(v,u);
}
tot=0, tarjan(1,0),
tot=0, Dfs(1),
m=Read();
for(LL i=1;i<=m;++i){
LL ty=Read(),x=Read(),val=Read();
q[i]=(code){dfn[x],dfn[x]+size[x]-1,ty,val,i};
m_val=max(m_val,val);
}
Size=sqrt(n),
pieces=ceil((double)n/Size);//莫队分块
for(LL i=1;i<=pieces;++i)
for(LL j=(i-1)*pieces+1;j<=i*pieces;++j)
belong[j]=i;
sort(q+1,q+1+m,cmp),
Size=sqrt(m_val),//清空实行真正的分块
pieces=ceil((double)m_val/Size);
for(LL i=1;i<=pieces;++i){
bl[i]=(i-1)*pieces+1,br[i]=i*pieces;
for(LL j=bl[i];j<=br[i];++j)
belong[j]=i;//每种拉面属于的块
}
for(LL i=1;i<=m;++i){
LL ql=q[i].l,qr=q[i].r,now=q[i].val;
while(l<ql)
Del(b[l++]);
while(l>ql)
Inc(b[--l]);
while(r<qr)
Inc(b[++r]);
while(r>qr)
Del(b[r--]);
sum=0;
LL pos=belong[now];//拉面所在块
for(LL j=1;j<pos;++j)
sum+=fk[j][q[i].op];
for(LL j=bl[pos];j<=q[i].val;++j)
if(visit[j])
sum+=(visit[j]&1)==q[i].op;
ans[q[i].id]=sum;
}
for(LL i=1;i<=m;++i)
printf("%lld\n",ans[i]);
return 0;
}/*
*/
P3180 [HAOI2016]地图的更多相关文章
- luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树
LINK:地图 考虑如果是一棵树怎么做 权值可以离散 那么可以直接利用dsu on tree+树状数组解决. 当然 也可以使用莫队 不过前缀和比较难以维护 外面套个树状数组又带了个log 套分块然后就 ...
- 2018.10.29 bzoj4564: [Haoi2016]地图(仙人掌+莫队)
传送门 根据原图建一棵新的树. 把原图每一个环上除了深度最浅的点以外的点全部向深度最浅的点连边. 然后可以搞出来一个dfsdfsdfs. 这个时候我们就成功把问题转换成了对子树的询问. 然后就可以对权 ...
- loj2062 [HAOI2016]地图
ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath& ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【LOJ】#2062. 「HAOI2016」地图
题解 我对莫队真是一无所知 这个东西显然可以用圆方树转成一个dfs序列 然后呢,用莫队计算每个询问区间的每个数出现的次数,从而顺带计算每个数字的奇偶性 但是我们要查的数字也用一个范围,可以直接用分块维 ...
- HAOI2016 简要题解
「HAOI2016」食物链 题意 现在给你 \(n\) 个物种和 \(m\) 条能量流动关系,求其中的食物链条数. \(1 \leq n \leq 100000, 0 \leq m \leq 2000 ...
- Java 征途:行者的地图
前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...
- 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值
一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...
- C# 程序中嵌入百度地图
本例是对WinForm中使用百度地图的简要介绍.百度地图目前支持Android开发,IOS开发,Web开发,服务接口,具体可以参照'百度地图开放平台'. [动态加载百度地图]涉及到的知识点: WebB ...
随机推荐
- Effective Java 读书笔记(五):Lambda和Stream
1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...
- EfCore基本用法
db first 和 code first的基本使用方法 https://www.cnblogs.com/Starts_2000/p/mysql-efcore20-codefirst-dbfirst- ...
- django css
1. settings.py最下方STATIC_URL下面补上 STATIC_URL = '/home/wjg/code/wblog/static/' STATIC_ROOT = os.path.jo ...
- span标签中显示固定长度,超出部分用省略号代替,光标放到文字上显示全部
在span中实现显示某段内容,固定其长度,多余部分用省略号代替,这样就用到html的title属性: 如:<span title="value"></span&g ...
- VBA for循环
for循环是一种重复控制结构,它允许开发人员有效地编写需要执行特定次数的循环. 语法 以下是VBA中for循环的语法. For counter = start To end [Step stepcou ...
- js展开循环
当要对一个大数组进行循环时,通常会通过局部变量缓存数组长度来提高性能,例: for(var i=0,len=arr.len;i<len;i++){} 光是缓存数组长度或使用倒序遍历来减少判断外, ...
- 2743711 - Possible Unexpected Results When Using Query With an ORDER BY Clause on a Rowstore Table With a Parallelized Search on a Cpbtree-Type Index
2743711 - Possible Unexpected Results When Using Query With an ORDER BY Clause on a Rowstore Table W ...
- day14-python之集合函数字符串格式化
1.集合 #!/usr/bin/env python # -*- coding:utf-8 -*- # s=set(['alex','alex','sb']) # print(s) # s=set(' ...
- soapUI与post测试soap webservice接口
之前装了SoapUI,最近装了Postman,分别用它们测试了WebService,下面为用法. 测试的在线WebService(数据来源于中国气象局)Endpoint: http://www.web ...
- 常见User-Agent大全
window.navigator.userAgent 1) Chrome Win7: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KH ...