ref

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, m, q, a[100005], uu, vv, hea[100005], cnt, dfn[100005], loo[100005];
int idx, dui[100005], qwq[100005], siz[100005], ans[100005], blc1, blc2;
int bei[100005], jis[1000005], qaq[2][1005], ovo[100005];
struct Edge{
int too, nxt, val;
}edge[300005];
struct Node{
int ll, rr, id, ty, li;
}nd[100005];
void add_edge(int fro, int too){
edge[++cnt].nxt = hea[fro];
edge[cnt].too = too;
hea[fro] = cnt;
}
bool cmp(Node x, Node y){
if(bei[x.ll]!=bei[y.ll]) return bei[x.ll]<bei[y.ll];
if(bei[x.ll]&1) return x.rr<y.rr;
else return x.rr>y.rr;
}
void dfs1(int x, int f){
dfn[x] = loo[x] = ++idx;
dui[idx] = x;
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(t==f) continue;
if(!dfn[t]){
dfs1(t, x);
loo[x] = min(loo[x], loo[t]);
}
else loo[x] = min(loo[x], dfn[t]);
}
}
void dfs2(int x){
qwq[x] = ++idx;
siz[x] = 1;
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(!qwq[t] && loo[t]>=dfn[x]){
dfs2(t);
siz[x] += siz[t];
}
}
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(!qwq[t] && loo[t]<dfn[x]){
dfs2(t);
siz[dui[loo[t]]] += siz[t];
}
}
}
void add(int x){
int p=(x-1)/blc2+1;
if(jis[x]&1) qaq[1][p]--, qaq[0][p]++;
else if(jis[x]) qaq[0][p]--, qaq[1][p]++;
else qaq[1][p]++;
jis[x]++;
}
void dec(int x){
int p=(x-1)/blc2+1;
if(jis[x]==1) qaq[1][p]--;
else if(jis[x]&1) qaq[1][p]--, qaq[0][p]++;
else qaq[0][p]--, qaq[1][p]++;
jis[x]--;
}
int main(){
cin>>n>>m;
blc1 = sqrt(n);
blc2 = sqrt(1000000);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
bei[i] = (i - 1) / blc1 + 1;
}
for(int i=1; i<=m; i++){
scanf("%d %d", &uu, &vv);
add_edge(uu, vv);
add_edge(vv, uu);
}
dfs1(1, 0);
idx = 0;
dfs2(1);
cin>>q;
for(int i=1; i<=q; i++){
scanf("%d %d %d", &nd[i].ty, &uu, &nd[i].li);
nd[i].ll = qwq[uu]; nd[i].rr = qwq[uu] + siz[uu] - 1;
nd[i].id = i;
}
sort(nd+1, nd+1+q, cmp);
for(int i=1; i<=n; i++)
ovo[qwq[i]] = a[i];
int l=nd[1].ll, r=l-1;
for(int i=1; i<=q; i++){
while(l>nd[i].ll) add(ovo[--l]);
while(l<nd[i].ll) dec(ovo[l++]);
while(r<nd[i].rr) add(ovo[++r]);
while(r>nd[i].rr) dec(ovo[r--]);
int now=0, p=(nd[i].li-1)/blc2+1;
for(int j=1; j<p; j++)
now += qaq[nd[i].ty][j];
for(int j=blc2*(p-1)+1; j<=nd[i].li; j++)
if(jis[j] && (jis[j]&1)==nd[i].ty)
now++;
ans[nd[i].id] = now;
}
for(int i=1; i<=q; i++)
printf("%d\n", ans[i]);
return 0;
}

loj2062 [HAOI2016]地图的更多相关文章

  1. P3180 [HAOI2016]地图

    P3180 [HAOI2016]地图 显然,这是一个仙人掌图 inline void tarjan(LL u,LL fa){ low[u]=dfn[u]=++tot, pre[tot]=u; for( ...

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

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

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

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

  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. socket网络套节字---聊天室

    一:服务端: 1.创建客户端: package com.ywh.serversocket; import java.io.InputStream; import java.io.OutputStrea ...

  2. 小记:iOS 中一般对于 view 不依赖 model 的的两种代码书写形式

    一. 前言 对于在 MVC 的定义中,view 层是不引用 model 层,view 和 model 是不相往来的 一般开发中,我们都写过 在自定义 view 中增加一个 model 的属性,外接直接 ...

  3. World Wind Java开发之十四——添加WMS地图服务资源(转)

    数据是GIS的核心,没有数据一切无从谈起,Internet上有很多在线WMS地图服务资源,我们可以好好利用这些数据资源,比如天地图.必应地图.NASA.OGC数据服务等等. 在我们国家常用的还是天地图 ...

  4. python_74_pickle反序列化

    import pickle def say(name):#序列化时用完会释放,要想反序列化,要重新写上该函数,否则会出错 print('我的高中', name)#可以和之前的序列化函数不同 f=ope ...

  5. 前端面试题1:Object.prototype.toString.call() 、instanceof 以及 Array.isArray()三种方法判别数组的优劣和区别

    1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...

  6. 零基础快速入门SpringBoot2.0教程 (二)

    一.SpringBoot2.x使用Dev-tool热部署 简介:介绍什么是热部署,使用springboot结合dev-tool工具,快速加载启动应用 官方地址:https://docs.spring. ...

  7. Oracle 字符串处理函数

    字符串处理函数 ① substr(string,a,b)/substr(string,a) string 为字符串,string 表示需要截取的字符串. a.b 均为整型数字,a 表示开始截取的位置, ...

  8. 转:CentOS7 下 Redis4 安装与配置教程(Redis开机启动)

    转 https://ken.io/note/centos7-redis4-setup 一.前言 1.本教程主要内容 Redis安装与测试 Redis远程访问配置 Redis开机启动配置 2.本教程环境 ...

  9. 【原创】大数据量时生成DataFrame避免使用效率低的append方法

      转载请注明出处:https://www.cnblogs.com/oceanicstar/p/10900332.html      ★append方法可以很方便地拼接两个DataFrame df1. ...

  10. windows环境下安装npm、cnpm、bower

    什么是npm.cnpm.bower? 简单地说,就是帮你下载好你需要的css或者js库,而且三者功能也都是一样的.那为什么要下载这3个不同的呢?据说npm容易被墙……而cnpm是淘宝的镜像,所以通常用 ...