发现对于任意一条边,起决定性作用的是节点编号更大的点.

于是,对于每一条边,按照节点编号较大值作为边权,按照最小生成树的方式插入即可.

最后用线段树维护 dfs 序做一个区间查询即可.

Code:

#include <bits/stdc++.h>
#define N 400005
#define ll long long
#define mod 998244353
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll val[N],mul[N<<2],V[N];
int n,m,Q,tot,edges,tt;
int p[N],cc[N],hd[N],to[N],nex[N],dfn[N],st[N],ed[N],size[N],Fa[21][N],F[21][N];
struct Edge
{
int u,v,c;
Edge(int u=0,int v=0,int c=0):u(u),v(v),c(c){}
}e[N];
void pushup(int l,int r,int now)
{
ll re=1;
int mid=(l+r)>>1;
if(l<=mid)re=re*mul[now<<1]%mod;
if(r>mid) re=re*mul[now<<1|1]%mod;
mul[now]=re;
}
void build(int l,int r,int now)
{
if(l==r)
{
mul[now]=V[l]%mod;
return;
}
int mid=(l+r)>>1;
if(l<=mid) build(l,mid,now<<1);
if(r>mid) build(mid+1,r,now<<1|1);
pushup(l,r,now);
}
void update(int l,int r,int now,int p,int v)
{
if(l==r)
{
V[l]=mul[now]=1ll*v%mod;
return;
}
int mid=(l+r)>>1;
if(p<=mid) update(l,mid,now<<1,p,v);
else update(mid+1,r,now<<1|1,p,v);
pushup(l,r,now);
}
ll query(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return mul[now];
ll re=1;
int mid=(l+r)>>1;
if(L<=mid) re=re*query(l,mid,now<<1,L,R)%mod;
if(R>mid) re=re*query(mid+1,r,now<<1|1,L,R)%mod;
return re;
}
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
bool cmp(Edge a,Edge b)
{
return a.c<b.c;
}
void addedge(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u,int ff)
{
st[u]=dfn[u]=++tt, size[u]=1, V[dfn[u]]=val[u];
Fa[0][u]=ff, F[0][u]=max(cc[ff], cc[u]);
for(int i=1;i<=20;++i)
{
Fa[i][u]=Fa[i-1][Fa[i-1][u]];
F[i][u]=max(F[i-1][u], F[i-1][Fa[i-1][u]]);
}
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
dfs(v, u);
size[u]+=size[v];
}
ed[u]=tt;
}
int get(int x,int k)
{
for(int i=20;i>=0;--i)
if(Fa[i][x] && F[i][x] <= k) x=Fa[i][x];
return x;
}
int main()
{
int i,j,k;
// setIO("input");
scanf("%d%d%d",&n,&m,&Q);
tot=n;
for(i=1;i<N;++i) p[i]=i;
for(i=1;i<=n;++i) scanf("%lld",&val[i]),cc[i]=i;
for(i=1;i<=m;++i)
{
scanf("%d%d",&e[i].u,&e[i].v);
e[i].c=max(e[i].u, e[i].v);
}
sort(e+1,e+1+m,cmp);
for(i=1;i<=m;++i)
{
int u=e[i].u, v=e[i].v;
int x=find(u),y=find(v);
if(x!=y)
{
++tot;
val[tot]=1ll;
cc[tot]=e[i].c;
p[x]=tot,p[y]=tot;
addedge(tot,x), addedge(tot,y);
}
}
cc[0]=1000000000;
dfs(tot,0);
build(1,tot,1);
for(i=1;i<=Q;++i)
{
int op;
scanf("%d",&op);
if(op==1)
{
int x,y;
scanf("%d%d",&x,&y);
if(x>y) printf("0\n");
else
{
int k=get(x,y);
int L=st[k], R=ed[k];
printf("%lld\n",query(1,tot,1,L,R));
}
}
if(op==2)
{
int x,y;
scanf("%d%d",&x,&y);
update(1,tot,1,dfn[x],y);
}
}
return 0;
}

  

Comet OJ - Contest #11 D isaster 重构树+倍增+dfs序+线段树的更多相关文章

  1. isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)

    目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...

  2. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  3. Comet OJ - Contest #11题解

    传送门 \(A\) 咕咕咕 const int N=1e6+5; char s[N],t[N];int n,res; inline bool cmp(const int &x,const in ...

  4. 2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest K - Random Numbers (dfs序 线段树+数论)

    Tamref love random numbers, but he hates recurrent relations, Tamref thinks that mainstream random g ...

  5. Comet OJ - Contest #11 B题 usiness

    ###题目链接### 题目大意:一开始手上有 0 个节点,有 n 天抉择,m 种方案,在每天中可以选择任意种方案.任意次地花费 x 个节点(手上的节点数不能为负),使得在 n 天结束后,获得 y 个节 ...

  6. Comet OJ - Contest #11 B 背包dp

    Code: #include <bits/stdc++.h> #define N 1005 #define M 2000 #define setIO(s) freopen(s". ...

  7. Comet OJ - Contest #11 A 水题

    Code: #include <bits/stdc++.h> #define N 3000000 using namespace std; char str[N]; int main() ...

  8. Comet OJ - Contest #11 E ffort(组合计数+多项式快速幂)

    传送门. 题解: 考虑若最后的总伤害数是s,那么就挡板分配一下,方案数是\(C_{s-1}^{n-1}\). 那么问题在于总伤害数很大,不能一个一个的算. \(C_{s-1}^{n-1}\)的OGF是 ...

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. opencv实现人脸识别(二) 人脸图像采集模块

    这一步我们开始搭建第一个模块,用来检测到图像中的人脸位置,并将它拍下来保存在指定路径 流程图: 代码实现: import cv2 def pic(cam): # 调用笔记本内置摄像头,所以参数为0,如 ...

  2. 利用神器BTrace 追踪线上 Spring Boot应用运行时信息

    概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值.外部调用情况 以及 函数执行时间等信息以便定位问题.传 ...

  3. 【转载】Jmeter接口测试+压力测试

     jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要 ...

  4. nginx反向代理服务器以及负载均衡,从安装到配置

    nginx的具体作用不用细说,很强大,做负载均衡.反向代理服务器解决前端跨域问题等等.下面是nginx的安装过程 首先nginx主要的依赖: pcre. pcre-devel zlib zlib-de ...

  5. mac 下 vscode配置SFTP连接

    VScode中使用SFTP插件连接远程服务器进行文件修改 下载SFTP插件后,使用Ctrl+Shift+P.输入SFTP,选择第一个将会生成简短的默认配置文件 然后把sftp.json文件内内容换成以 ...

  6. Ubuntu 上网

    1.打开终端 2.sudo gedit /etc/wpa_supplicant/wpa_supplicant.conf(回车之后会弹出一个编辑页面,在里面打入第三步里面的配置文件)3.配置文件如下:c ...

  7. 原生js实现选项卡样式切换的几种方式。

    先分享一个不能实现的实例(因为es5没有块作用域) for(var i=0; i<list.length; i++ ) { list[i].onclick = function(){ tabch ...

  8. linux Linux入门

    Linux入门 Linux学习什么? 常用命令(背会) 软件安装(熟练) 服务端的架构(开开眼界) Linux如何学习? 不要问那么多为什么,后面你就懒得问了 先尝试理解一下,不行就背下来 一个知识点 ...

  9. Python入门之第三方模块安装

    Python入门之第三方模块安装 平台:Win10 x64 + Anaconda3-5.3.0 (+Python3.7.0) Issue说明:pip install line_profiler-2.1 ...

  10. DOS导出文件夹或文件名

    dir /s /w >a.txt 应用dos导出当前目录下的文件夹名称(包括子目录,但是不包括文件,仅仅导出文件夹) dir /s/b/a:d >a.txt