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. python起源,变量,用户交互,流程语句

    1.Python的起源 Python是一门解释型弱类型编程语言. 特点:简单.明确.优雅 2.Python解释器 CPython官方提供的, 内部使用C语言来实现 PyPy,一次性把我们的代码解释成字 ...

  2. 根据要求完成表单以及使用servlet处理表单 任务要求 掌握Servlet输出表单和接收表单数据(多值组件的读取)。

    Servlet代码: package com.test; import java.io.IOException; import java.io.PrintWriter; import java.uti ...

  3. zabbix-3.4 触发器

    3 触发器 概述 触发器是"评估"由项目采集的数据并表示当前系统状况的逻辑表达式. 当监控项用于采集系统的数据时,始终遵循这些数据是非常不切合实际的,因为这些数据始终在等待一个令人 ...

  4. Qt的各种使用技巧

    一.基本界面介绍 二.查看帮助的方法 ① 如上图所示,点击右侧帮助菜单查看帮助 ② 双击想要查看的代码,点F1,也会弹出帮助栏 三.修改文本编辑器颜色 长时间使用白底黑字的编辑器经常会使眼睛不舒服,以 ...

  5. jqGrid中multiselect: true 操作checkbox

    在jqGrid中设置multiselect: true可以实现全选的操作,但怎么设置被选中的checkbox里面的值呢,做法如下:jQuery("#listTable").jqGr ...

  6. LeetCode Remove Duplicates from Sorted Array删除整型数组中的重复元素并返回剩下元素个数

    class Solution { public: int removeDuplicates(int A[], int n) { ],*e=&A[]; //s指向开头第一个,e往后遍历相同的 i ...

  7. IFEO 映像文件劫持

    “映像劫持”,也被称为“IFEO”(Image File Execution Options) 映像劫持的根本就是被恶意篡改了注册表HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...

  8. NOIP2018赛前停课集训记(10.24~11.08)

    前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...

  9. python_65_生成器1

    # map()函数 # map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. # 例 ...

  10. Java代码工具箱之控制台输出重定向_控制台输出到文件

    1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...