题目链接

传送门

思路

\(kruskal\)重构树\(+\)线段树\(+\)倍增

代码

  1. #include <set>
  2. #include <map>
  3. #include <deque>
  4. #include <queue>
  5. #include <stack>
  6. #include <cmath>
  7. #include <ctime>
  8. #include <bitset>
  9. #include <cstdio>
  10. #include <string>
  11. #include <vector>
  12. #include <cassert>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. using namespace std;
  18. typedef long long LL;
  19. typedef pair<LL, LL> pLL;
  20. typedef pair<LL, int> pLi;
  21. typedef pair<int, LL> pil;;
  22. typedef pair<int, int> pii;
  23. typedef unsigned long long uLL;
  24. #define fi first
  25. #define se second
  26. #define lson (rt<<1)
  27. #define rson (rt<<1|1)
  28. #define lowbit(x) x&(-x)
  29. #define name2str(name) (#name)
  30. #define bug printf("*********\n")
  31. #define debug(x) cout<<#x"=["<<x<<"]" <<endl
  32. #define FIN freopen("D://Code//in.txt","r",stdin)
  33. #define IO ios::sync_with_stdio(false),cin.tie(0)
  34. const double eps = 1e-8;
  35. const int mod = 998244353;
  36. const int maxn = 100000 + 7;
  37. const double pi = acos(-1);
  38. const int inf = 0x3f3f3f3f;
  39. const LL INF = 0x3f3f3f3f3f3f3f3fLL;
  40. inline int read() {
  41. int f = 0, x = 0;
  42. char ch = getchar();
  43. while (ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();
  44. while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  45. return x = f ? -x : x;
  46. }
  47. pii edge[maxn*2];
  48. vector<int> vec[maxn];
  49. int n, m, q, op, x, y, dfn;
  50. int Fa[maxn], mul[maxn<<2], fa[maxn][22], w[maxn], ls[maxn], rs[maxn], dd[maxn];
  51. int fi(int x) {
  52. return Fa[x] == x ? x : Fa[x] = fi(Fa[x]);
  53. }
  54. void dfs(int u, int p) {
  55. fa[u][0] = p, ls[u] = ++dfn, dd[dfn] = u;
  56. for(int i = 1; i <= 20; ++i) fa[u][i] = fa[fa[u][i-1]][i-1];
  57. for(int i = 0; i < (int)vec[u].size(); ++i) {
  58. int v = vec[u][i];
  59. dfs(v, u);
  60. }
  61. rs[u] = dfn;
  62. }
  63. void push_up(int rt) {
  64. mul[rt] = 1LL * mul[lson] * mul[rson] % mod;
  65. }
  66. void build(int rt, int l, int r) {
  67. if(l == r) {
  68. mul[rt] = w[dd[l]];
  69. return;
  70. }
  71. int mid = (l + r) >> 1;
  72. build(lson, l, mid), build(rson, mid + 1, r);
  73. push_up(rt);
  74. }
  75. void update(int rt, int l, int r, int pos, int val) {
  76. if(l == r) {
  77. mul[rt] = val % mod;
  78. return;
  79. }
  80. int mid = (l + r) >> 1;
  81. if(pos <= mid) update(lson, l, mid, pos, val);
  82. else update(rson, mid + 1, r, pos, val);
  83. push_up(rt);
  84. }
  85. int query(int rt, int l, int r, int L, int R) {
  86. if(l == L && R == r) return mul[rt];
  87. int mid = (l + r) >> 1;
  88. if(R <= mid) return query(lson, l, mid, L, R);
  89. else if(L > mid) return query(rson, mid + 1, r, L, R);
  90. else return 1LL * query(lson, l, mid, L, mid) * query(rson, mid + 1, r, mid + 1, R) % mod;
  91. }
  92. void solve(int x, int y) {
  93. if(x > y) {
  94. printf("0\n");
  95. return;
  96. }
  97. for(int i = 20; i >= 0; --i) {
  98. if(fa[x][i] != 0 && fa[x][i] <= y) x = fa[x][i];
  99. }
  100. printf("%d\n", query(1, 1, n, ls[x], rs[x]));
  101. }
  102. int main() {
  103. #ifndef ONLINE_JUDGE
  104. FIN;
  105. #endif // ONLINE_JUDGE
  106. n = read(), m = read(), q = read();
  107. for(int i = 1; i <= n; ++i) w[i] = read(), w[i] %= mod, Fa[i] = i;
  108. int x, y;
  109. for(int i = 1; i <= m; ++i) {
  110. x = read(), y = read();
  111. if(x < y) swap(x, y);
  112. edge[i] = {x, y};
  113. }
  114. sort(edge + 1, edge + m + 1);
  115. for(int i = 1; i <= m; ++i) {
  116. x = edge[i].fi, y = edge[i].se;
  117. x = fi(x), y = fi(y);
  118. if(x == y) continue;
  119. if(x > y) Fa[y] = x, vec[x].push_back(y);
  120. else Fa[x] = y, vec[y].push_back(x);
  121. }
  122. dfs(n, 0);
  123. build(1, 1, n);
  124. while(q--) {
  125. op = read(), x = read(), y = read();
  126. if(op == 1) {
  127. solve(x, y);
  128. } else {
  129. update(1, 1, n, ls[x], y);
  130. }
  131. }
  132. return 0;
  133. }

isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)的更多相关文章

  1. Pandaria(Kruskal重构树+线段树合并)

    题意 是 有n个花园 一个花园内所有的花的颜色都是一样的 有很多种不同的颜色  花园到花园之间有路,走不同的路有不同的代价   如果选一个点作为起点 只走小于等于w的路  可以经过的这些花园里  那种 ...

  2. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  3. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  4. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  5. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

    题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...

  6. 洛谷P4197 Peaks(Kruskal重构树 主席树)

    题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的 ...

  7. [SCOI2013]摩托车交易 kruskal重构树(最大生成树) 倍增

    ---题面--- 题解: 这题想法简单,,,写起来真的是失智,找了几个小时的错误结果是inf没开到LL范围.... 首先我们需要找到任意两点之间能够携带黄金的上限值,因为是在经过的道路权值中取min, ...

  8. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  9. UOJ#407. 【IOI2018】狼人 Kruskal,kruskal重构树,主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵krus ...

随机推荐

  1. [LeetCode] 881. Boats to Save People 渡人的船

    The i-th person has weight people[i], and each boat can carry a maximum weight of limit. Each boat c ...

  2. 推荐一款语音直播连麦App YAMI

    推荐一款语音直播连麦App YAMI 1 介绍 功能描述:[语音直播]:海量超有才主播,游戏送礼抢红包,嗨玩不停:[多人聊天室]:连麦交友处CP,主持人带你玩游戏,边聊边玩:[语音交友]:海量声优专属 ...

  3. C# HTTP系列3 HttpWebRequest.ContentType属性

    系列目录     [已更新最新开发文章,点击查看详细] 获取或设置请求的 Content-type HTTP 标头的值.默认值为null. 常见的请求内容类型为以下几种: /// <summar ...

  4. C# HTTP系列10 form表单的enctype属性

    系列目录     [已更新最新开发文章,点击查看详细] 在ASP.NET编程中经常遇到下面的代码片段,将人员信息以表单方式提交到后台程序并保存到服务器与数据库中. <form action=&q ...

  5. Shell脚本——添加和删除用户

    写一个脚本admin_user.sh,其用法格式为: admin_user.sh --add USERLIST --del USERLIST -v|--verbose -h|--help 其中, -h ...

  6. Prometheus 安装Grafana与Prometheus集成

    Prometheus 安装Grafana与Prometheus集成 Grafana是一个开源的度量分析和可视化系统. 下载地址:https://grafana.com/grafana/download ...

  7. 【模板整合计划】图论—有向无环图 (DAG) 与树

    [模板整合计划]图论-有向无环图 (DAG) 与树 一:[拓扑排序] 最大食物链计数 \(\text{[P4017]}\) #include<cstring> #include<cs ...

  8. 人生苦短,我用Python(目录)

    目前Django分类的文章正在整顿中,届时将呈现更加丰富的内容,另外整体排版也将会更改,感谢支持!! 一.Python基础 二.并发编程 三.数据库 四.Web 五.Python Web 框架 六.爬 ...

  9. 单片机成长之路(51基础篇)- 024 基于 N76E003 的按键按键状态机

    前端时间要用按键,搞了个状态机(如图): main.c #include <N76E003.H> #include <SFR_Macro.h> //N76E003 SFR寄存器 ...

  10. $.ajax()方法

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...