传送门

根据原图建一棵新的树。

把原图每一个环上除了深度最浅的点以外的点全部向深度最浅的点连边。

然后可以搞出来一个dfsdfsdfs。

这个时候我们就成功把问题转换成了对子树的询问。

然后就可以对权值分块用莫队做了注意如果不用分块而是用树状数组维护是O(nlognsqrt(n))的

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
inline void write(int x){
	if(!x){putchar('0');return;}
	if(x>9)write(x/10);
	putchar((x-x/10*10)^48);
}
const int N=1e6+5,K=1e6+5;
int n,m,tot=0,dfn[N],low[N],a[N],col[N],siz[K],tim[K][2],in[N],Siz[N],pred[N],sig,ans[N],sig1,mx=0;
vector<int>e[N];
struct Query{int l,r,lim,f,id;}q[N];
inline int getp(int x,int z){return (x-1)/z+1;}
inline void tarjan(int p,int fa){
	dfn[p]=low[p]=++tot,pred[tot]=p;
	for(int i=0;i<e[p].size();++i){
		int v=e[p][i];
		if(v==fa)continue;
		if(!dfn[v])tarjan(v,p),low[p]=min(low[p],low[v]);
		else low[p]=min(low[p],dfn[v]);
	}
}
inline void dfs(int p,int fa){
	in[p]=++tot,Siz[p]=1;
	for(int i=0;i<e[p].size();++i){
		int v=e[p][i];
		if(v==fa)continue;
		if(!in[v]&&low[v]>=dfn[p])dfs(v,p),Siz[p]+=Siz[v];
	}
	for(int i=0;i<e[p].size();++i){
		int v=e[p][i];
		if(v==fa)continue;
		if(!in[v]&&low[v]<dfn[p])dfs(v,p),Siz[pred[low[v]]]+=Siz[v];
	}
}
inline void add(int pos){
	int upd=getp(pos,sig1);
	if(siz[pos]&1)--tim[upd][1],++tim[upd][0];
	else if(siz[pos])++tim[upd][1],--tim[upd][0];
	else ++tim[upd][1];
	++siz[pos];
}
inline void del(int pos){
	int upd=getp(pos,sig1);
	if(!(siz[pos]&1))++tim[upd][1],--tim[upd][0];
	else if(siz[pos]^1)--tim[upd][1],++tim[upd][0];
	else --tim[upd][1];
	--siz[pos];
}
inline bool cmp(const Query&a,const Query&b){return getp(a.l,sig)==getp(b.l,sig)?a.r<b.r:getp(a.l,sig)<getp(b.l,sig);}
int main(){
	n=read(),m=read(),sig=sqrt(n);
	for(int i=1;i<=n;++i)mx=max(mx,a[i]=read());
	sig1=sqrt(mx);
	for(int u,v,i=1;i<=m;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
	tarjan(1,0),tot=0,dfs(1,0),m=read();
	for(int i=1;i<=n;++i)col[in[i]]=a[i];
	for(int i=1,v;i<=m;++i)q[i].f=read(),v=read(),q[i].l=in[v],q[i].r=in[v]+Siz[v]-1,q[i].lim=read(),q[i].id=i;
	int ql=1,qr=0,sum=0;
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;++i){
		while(qr<q[i].r)add(col[++qr]);
		while(ql>q[i].l)add(col[--ql]);
		while(qr>q[i].r)del(col[qr--]);
		while(ql<q[i].l)del(col[ql++]);
		sum=0;
		int pos=getp(q[i].lim,sig1);
		for(int j=1;j<pos;++j)sum+=tim[j][q[i].f];
		int L=(pos-1)*sig1+1,R=q[i].lim;
		for(int j=L;j<=R;++j){
			if(!siz[j])continue;
			sum+=(siz[j]&1)==q[i].f;
		}
		ans[q[i].id]=sum;
	}
	for(int i=1;i<=m;++i)write(ans[i]),puts("");
	return 0;
}

2018.10.29 bzoj4564: [Haoi2016]地图(仙人掌+莫队)的更多相关文章

  1. 2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌图(仙人掌+单调队列优化dp)

    传送门 求仙人掌的直径. 感觉不是很难. 分点在环上面和不在环上分类讨论. 不在环上直接树形dpdpdp. 然后如果在环上讨论一波. 首先对环的祖先有贡献的只有环上dfsdfsdfs序最小的点. 对答 ...

  2. 2018.10.29 NOIP训练 数据结构(带修改莫队)

    传送门 带修莫队板题. 直接按照经典写法做就行了. 代码

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

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

  4. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...

  5. loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)

    传送门 模拟赛的时候纯暴力竟然骗了\(70\)分-- 首先对于一堆\(g\)怎么计算概率应该很好想,用总的区间数减去不合法的区间数就行了,简而言之对\(g\)排个序,每一段长为\(d\)的连续序列的区 ...

  6. 2018.09.16 bzoj3757: 苹果树(树上莫队)

    传送门 一道树上莫队. 先用跟bzoj1086一样的方法给树分块. 分完之后就可以莫队了. 但是两个询问之间如何转移呢? 感觉很难受啊. 我们定义S(u,v)" role="pre ...

  7. 2018.10.29 洛谷P4129 [SHOI2006]仙人掌(仙人掌+高精度)

    传送门 显然求出每一个环的大小. Ans=∏i(siz[i]+1)Ans=\prod_i(siz[i]+1)Ans=∏i​(siz[i]+1) 注意用高精度存答案. 代码: #include<b ...

  8. 2018.10.25 bzoj4565: [Haoi2016]字符合并(区间dp+状压)

    传送门 当看到那个k≤8k\le 8k≤8的时候就知道需要状压了. 状态定义:f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]处理完之后的状态为kkk ...

  9. 2018.10.29 NOIP2018模拟赛 解题报告

    得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...

随机推荐

  1. 前端框架(kraken、Express、Node、MVC)

    You know my loneliness is only kept for you, my sweet songs are only sang for you. 前端框架相关知识记录. krake ...

  2. CentOS查看进程、杀死进程、启动进程等常用命令

    关键字: linux 查进程.杀进程.起进程 1.查进程     ps命令查找与进程相关的PID号:     ps a 显示现行终端机下的所有程序,包括其他用户的程序.     ps -A 显示所有程 ...

  3. PAT L2-016 愿天下有情人都是失散多年的兄妹(深搜)

    呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入 ...

  4. 控制台输出到txt

    //PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. //PrintStream不同于PrintWriter,PrintStream输出的是字节内容. //pu ...

  5. 安装sql server 2008 提示错误 SQL Server 2005 Express 工具。 失败

    安装sql server 2008 management,提示错误:Sql2005SsmsExpressFacet 检查是否安装了 SQL Server 2005 Express 工具. 失败,已安装 ...

  6. sqlserver数据库的分离与附加

    当我们一台电脑上创建了数据库想要转移到另外一台电脑上时,由于数据库处于联机状态,不能够对数据库文件进行复制和迁移,所以我们可以将数据库从服务器上分离出去,这样我们就可以复制数据库文件了.然后将数据库文 ...

  7. BTC和BCH 区别和联系?

    在比特币刚刚出现的时期,中本聪对区块的大小限制在1M.这种限制既保障性能较弱的个人电脑能够参与其中,同时也起到了防止攻击者让比特币网络超载的风险发生,毕竟那时系统还很脆弱.在1M的限制下,10分钟一个 ...

  8. CSS day49

    前端基础之CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CS ...

  9. 10.22JS日记

    1.js数据类型分析 (1)基础类型:string.number.boolean.null.undefined (2)引用类型:object-->json.array... 2.点运算  xxx ...

  10. Linux内核哈希表分析与应用

        目录(?)[+]   Linux内核哈希表分析与应用 Author:tiger-johnTime:2012-12-20mail:jibo.tiger@gmail.comBlog:http:// ...