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 ...
随机推荐
- Python Web 程序使用 uWSGI 部署
Python Web 程序使用 uWSGI 部署 WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway ...
- 可以在一个.java文件中写两个类吗?
一个java文件中可以有任意多个类,接口或是注解..但是只能有一个类是public的,而且这个类的名字要和文件同名,比如public类名为A则文件名就应当为A.java
- Java程序员的自我修养
一.自我修养路线图 如图,这是笔者所走的路.且不论这路走的对不对,这个过程中行业环境会影响到你,大可不必钻牛角尖.附上这张图的目的是为了说,如果你想成为一个优秀的程序员,那么你一定要有规划.当然,别想 ...
- requests模块的基本用法
requests 什么是requests模块 python中封装好的一个基于网络请求的模块 作用 用来模拟浏览器发送请求 环境安装 pip install requests 编码流程 指定 url 发 ...
- Python 自己实现可迭代对象
import time from collections import Iterable from collections import Iterator class Classmate(object ...
- ios数组倒序
比如有一个数组: NSArray *arr = @["]; 倒过来排序: arr = [[arr reverseObjectEnumerator] allObjects]; NSMutabl ...
- Apache日志轮询Cronolog安装及简单用法
安装日志轮询工具cronolog: [root@bqh- tools]# tar xf cronolog-.tar.gz [root@bqh- tools]# cd cronolog- [root@b ...
- 【leetcode】366.Find Leaves of Binary Tree
原题 Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all lea ...
- Vue框架之初识
介绍 vue.js 是用来构建web应用接口的一个库 技术上,Vue.js 重点集中在MVVM模式的ViewModel层,它连接视图和数据绑定模型通过两种方式.实际的DOM操作和输出格式被抽象的方式到 ...
- Django中实现单表和多表接口
基础接口 序列化:course/serializers.py from rest_framework import serializers from .models import CourseCate ...