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 ...
随机推荐
- table固定宽度与自动宽度
table-layout:auto(创建的table默认是此布局模式): 对table和td.th指定的宽度无效,浏览器会计算所有单元格的内容宽度才能得出一列宽度 如果想对单元格的内容自动折行需使用w ...
- iOS 数据源切换混乱问题
问题场景 这个问题遇到是偶然的,正常来说是不会出现的.但是有时候在一些极端操作情况下,还是出现了. 现在我说明下这个场景.页面上是一个tableview,那对应的有一个dataSource,页面顶部有 ...
- RuntimeWarning: DateTimeField AppToken.expire_date received a naive datetime (2019-05-16 16:54:01.144582) while time zone support is active. RuntimeWarning)
数据库存储当前时间操作: datetime.datetime.now() 更改为: from django.utils import timezone timezone.now()
- windows 下 redis 的安装及使用
1.下载及安装redis 下载地址:https://github.com/dmajkic/redis/downloads 找到对应的版本下载安装 打开cmd窗口,用cd命令进入到安装redis的根目录 ...
- “key_share”和"pre_shared_key" 的区别
越是基本的问题或者概念越是难解释或者讲清楚,论文写到现在真的好无助的样子 . 在LTS协议中牵扯到握手的认证和秘钥建立的时候,这连个概念经常混淆,TLS1.3版本协议为参照,区别这两个概念 1.概念的 ...
- Innodb关键特性之自适用Hash索引
一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...
- Loadrunner 计算保留两位小数不四舍五入
有时候在测试过程中会截取返回值,当你截取的值不是最终的值,需要进行计算后才能使用并且需要保留两位小数,不进行四舍五入的计算: 此时 我使用了各种办法,但是最终我采用了一种最直接,最暴力的方法就是先乘后 ...
- Oracle使用游标查询所有数据表备注
功能作用:应用对应的SQL语句,能方便快速的查询Oracle数据库指定用户的所有用户表说明,快速知道每个数据表是做什么的,方便写文档和方案. 运行环境:搭建好Oracle数据库,并使用PQ/SQL D ...
- Android --其他测试点
全球化测试: 语言方向,参考:https://developer.android.google.cn/guide/topics/resources/pseudolocales. Spot locali ...
- vue 安装 ‘node-sass’ 运行报错:ERROR in Cannot find module 'node-sass'
好像是由于cnpm安装导致.执行下面的安装代码,或者使用npm 安装node-sass cnpm install node-sass@latest