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]地图的更多相关文章

  1. luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树

    LINK:地图 考虑如果是一棵树怎么做 权值可以离散 那么可以直接利用dsu on tree+树状数组解决. 当然 也可以使用莫队 不过前缀和比较难以维护 外面套个树状数组又带了个log 套分块然后就 ...

  2. 2018.10.29 bzoj4564: [Haoi2016]地图(仙人掌+莫队)

    传送门 根据原图建一棵新的树. 把原图每一个环上除了深度最浅的点以外的点全部向深度最浅的点连边. 然后可以搞出来一个dfsdfsdfs. 这个时候我们就成功把问题转换成了对子树的询问. 然后就可以对权 ...

  3. loj2062 [HAOI2016]地图

    ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath& ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 【LOJ】#2062. 「HAOI2016」地图

    题解 我对莫队真是一无所知 这个东西显然可以用圆方树转成一个dfs序列 然后呢,用莫队计算每个询问区间的每个数出现的次数,从而顺带计算每个数字的奇偶性 但是我们要查的数字也用一个范围,可以直接用分块维 ...

  6. HAOI2016 简要题解

    「HAOI2016」食物链 题意 现在给你 \(n\) 个物种和 \(m\) 条能量流动关系,求其中的食物链条数. \(1 \leq n \leq 100000, 0 \leq m \leq 2000 ...

  7. Java 征途:行者的地图

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...

  8. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  9. C# 程序中嵌入百度地图

    本例是对WinForm中使用百度地图的简要介绍.百度地图目前支持Android开发,IOS开发,Web开发,服务接口,具体可以参照'百度地图开放平台'. [动态加载百度地图]涉及到的知识点: WebB ...

随机推荐

  1. Java Web 深入分析(10) Spring 实践

    Spring helloworld [http://wiki.jikexueyuan.com/project/spring/hello-world-example.html] HelloWorld.j ...

  2. jQuery遍历(1)

    jQuery 遍历,意为“移动”,用于根据其相对于其他元素的关系来“查找”(或选取)HTML 元素.以某项选择开始,并沿着这个选择移动,直到抵达您期望的元素为止. 图示解释: 举例: jQuery p ...

  3. Matplotlib pyplot中title() xlabel() ylabel()无法显示中文(即显示方框乱码)的解决办法

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/11020246.html 一.无法正常显示原因 ...

  4. vue简单todolist

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 直接插入排序算法(java)

    直接插入排序是将未排序的数据插入至已排好序序列的合适位置. 具体流程如下: 1.首先比较数组的前两个数据,并排序: 2.比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置: 3.比较第四 ...

  6. Linux 磁盘、分区、文件系统、挂载

    磁盘 Linux所有设备都被抽象成为一个文件,保存在/dev目录下. 设备名称一般为hd[a-z]或sd[a-z].如果电脑中有多硬盘,则设备名依次为sda.adb.sdc...以此类推 IDE设备的 ...

  7. Django组件之modelformset

    ModelFormSet 基于modelform 实现的批量处理 前端: <form method="post" action=""> {% csr ...

  8. 【OF框架】在部署中使用 Windows身份认证

    准备 了解Windows身份认证相关知识及原理 框架开发项目完成,并完成发布包,完成在IIS中部署. 框架支持对Windows身份认证的实现,仅需要通过配置节进行配置即可切换,可以在部署的时候配置即可 ...

  9. Tensorflow&CNN:验证集预测与模型评价

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/90480140 - 写在前面 本科毕业设计终于告一段落了.特 ...

  10. Go语言中Goroutine的设置

    一. 通过runtime包进行多核设置 1.NumCPU()获取当前系统的cpu核数 2.GOMAXPROCS设置当前程序运行时占用的cpu核数 版本1.6之前默认是使用1个核,而之后是全部使用. 好 ...