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

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

最后用线段树维护 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. (十五)springMvc 拦截器

    文章目录 定义拦截器 接口中三个方法 配置拦截器 多个拦截器的规则 定义拦截器 springMvc 中定义拦截器只需要实现一个接口 org.springframework.web.servlet.Ha ...

  2. Android Studio中怎么使用DDMS工具

    随着android studio的广泛使用,开发人员对相关工具的使用需求更加凸显.昨天在一个android studio教程网站上,看到一篇有关DDMS工具使用的相关知识,感觉很不错,分享给大家,一起 ...

  3. VS2017的一些调试方法技巧

    一.基本的操作. 1.启动调试. 可以通过VS的调试(Debug)菜单启动调试.点击调试菜单下的“启动调试”或者按F5键启动.如果你已经在代码中加入了断点,那么执行会自动开始. 注:退出调试快捷键sh ...

  4. __formart__

    __format__ 一.__format__ 自定制格式化字符串 date_dic = { 'ymd': '{0.year}:{0.month}:{0.day}', 'dmy': '{0.day}/ ...

  5. Go语言操作NoSql

    NSQ平台 NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ. NSQ NSQ介绍 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异. N ...

  6. 监控 Kubernetes 集群应用

    Prometheus的数据指标是通过一个公开的 HTTP(S) 数据接口获取到的,我们不需要单独安装监控的 agent,只需要暴露一个 metrics 接口,Prometheus 就会定期去拉取数据: ...

  7. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  8. 解决低版本IE关于html5新特性的兼容性问题html5shiv.js和Respond.js,以及excanvas.js解决低版本IE不支持canvas的问题

    插件:html5shiv.js 让IE9以下版本支持html5新标签,git地址https://github.com/aFarkas/html5shiv 用于解决IE9以下版本浏览器对HTML5新增标 ...

  9. python+django学习二

    所有模型类型的准备和迁移 在setting.py中添加:AUTH_USER_MODEL = 'users.UserProfile' 继承用户模板 确保子项目的url现在都是空的, 在pycharm的f ...

  10. [NOIP10.3模拟赛]3.w题解--神奇树形DP

    题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...