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;
}/*
*/

最新文章

  1. (1)as_view() (2)在urls.py里面出现的pk是怎么回事 (3)RetrieveAPIView表示什么
  2. word2007二级标题自动编号不从大标题开始的解决方法
  3. android 之 ExpandableListView列表中的列表
  4. [GeoServer]重拾GeoServer之安装篇
  5. java Date比较
  6. 转换时间为 “XX分钟之前”
  7. spring mvc使用ClassPathXmlApplicationContext或FileSystemXmlApplicationContext和XmlWebApplicationContext类的操作其中 XmlWebApplicationContext是专为Web工程定制的。
  8. OAuth 2.0 开发完全详解
  9. Symfony没有安装依赖_PHP Fatal error: require(): Failed opening required
  10. 构建高性能web站点-阅读笔记(一)
  11. Python 获取 网易云音乐热门评论
  12. 老李推荐:第2章3节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NoteEditor简介
  13. 51nod 1020 逆序排列 DP
  14. OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)
  15. 《前端之路》之五 head 头标签指南
  16. ros 使用笔记
  17. MapReduce作业的工作原理
  18. cf1076d 贪心最短路
  19. HTML 09 web 内容与攻击技术
  20. 利用开源项目jadx反编译Android应用

热门文章

  1. VsCode开发Angular的必备插件
  2. 命令行参数 &amp;&amp; json 协议 &amp;&amp; 自定义 error 类型
  3. https、加密安全
  4. 前端编译原理 parser.js源码解读
  5. pycharm中文乱码
  6. 解决windows 1903 alt + tab 切换卡顿
  7. 美化WebApi,使其统一返回Json格式
  8. 每日一题-——最长公共子序列(LCS)与最长公共子串
  9. 工程代码不编译src的java目录下的xml文件问题及解决
  10. ubuntu---记录.重装电脑之设置电脑信息