这题搞了我一天啊。。。拍不出错原来是因为极限数据就RE了啊,竟然返回WA啊。我的线段树要开8倍才能过啊。。。

首先可以发现除了那个加边操作,其他的操作有点像线段树啊。如果我们把每次询问的联通块都放在一个区间的话,那么就可以用线段树维护了啊。

于是我们只需要用带权并查集把联通块串成一条链的形式。就可以用区间表示出来了啊。。

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cstdlib>
  4. # include <iostream>
  5. # include <vector>
  6. # include <queue>
  7. # include <stack>
  8. # include <map>
  9. # include <set>
  10. # include <cmath>
  11. # include <algorithm>
  12. using namespace std;
  13. # define lowbit(x) ((x)&(-x))
  14. # define pi acos(-1.0)
  15. # define eps 1e-
  16. # define MOD
  17. # define INF
  18. # define mem(a,b) memset(a,b,sizeof(a))
  19. # define FOR(i,a,n) for(int i=a; i<=n; ++i)
  20. # define FO(i,a,n) for(int i=a; i<n; ++i)
  21. # define bug puts("H");
  22. # define lch p<<,l,mid
  23. # define rch p<<|,mid+,r
  24. # define mp make_pair
  25. # define pb push_back
  26. typedef pair<int,int> PII;
  27. typedef vector<int> VI;
  28. # pragma comment(linker, "/STACK:1024000000,1024000000")
  29. typedef long long LL;
  30. int Scan() {
  31. int x=,f=;char ch=getchar();
  32. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  33. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  34. return x*f;
  35. }
  36. void Out(int a) {
  37. if(a<) {putchar('-'); a=-a;}
  38. if(a>=) Out(a/);
  39. putchar(a%+'');
  40. }
  41. const int N=;
  42. //Code begin...
  43.  
  44. struct Node{char s[]; int x, y;}node[N];
  45. struct Q{int l, r;}q[N];
  46. int seg[N<<], tag[N<<], a[N], fa[N], to[N], tail[N], suc[N], F[N];
  47.  
  48. int find(int x){
  49. int tmp;
  50. if (fa[x]!=x) tmp=find(fa[x]), fa[x]=tmp;
  51. return fa[x];
  52. }
  53. void union_set(int u, int v){fa[u]=v; suc[tail[v]]=u; tail[v]=tail[u];}
  54. void union_set1(int x, int y){
  55. int l=min(q[x].l,q[y].l), r=max(q[x].r,q[y].r);
  56. fa[x]=y, q[y].l=l, q[y].r=r;
  57. }
  58. void push_up(int p){seg[p]=max(seg[p<<],seg[p<<|]);}
  59. void push_down(int p){
  60. if (!tag[p]) return ;
  61. seg[p]+=tag[p];
  62. tag[p<<]+=tag[p]; tag[p<<|]+=tag[p]; tag[p]=;
  63. }
  64. void init(int p, int l, int r){
  65. if (l<r) {
  66. int mid=(l+r)>>;
  67. init(lch); init(rch); push_up(p);
  68. }
  69. else seg[p]=a[F[l]];
  70. }
  71. int query(int p, int l, int r, int L, int R){
  72. push_down(p);
  73. if (L>r||R<l) return -INF;
  74. if (L<=l&&R>=r) return seg[p];
  75. int mid=(l+r)>>;
  76. return max(query(lch,L,R),query(rch,L,R));
  77. }
  78. void update(int p, int l, int r, int L, int R, int val){
  79. push_down(p);
  80. if (L>r||R<l) return ;
  81. if (L<=l&&R>=r) tag[p]=val, push_down(p);
  82. else {
  83. int mid=(l+r)>>;
  84. update(lch,L,R,val); update(rch,L,R,val); push_up(p);
  85. }
  86. }
  87. int main ()
  88. {
  89. int n, m, u, v;
  90. scanf("%d",&n);
  91. FOR(i,,n) fa[i]=tail[i]=i;
  92. FOR(i,,n) scanf("%d",a+i);
  93. scanf("%d",&m);
  94. FOR(i,,m) {
  95. scanf("%s",node[i].s);
  96. if (!strcmp(node[i].s,"U")||!strcmp(node[i].s,"A1")||!strcmp(node[i].s,"A2")) scanf("%d%d",&node[i].x,&node[i].y);
  97. else if(!strcmp(node[i].s,"F3")) continue;
  98. else scanf("%d",&node[i].x);
  99. }
  100. FOR(i,,m) if(node[i].s[]=='U') {
  101. u=find(node[i].x), v=find(node[i].y);
  102. if (u!=v) union_set(u,v);
  103. }
  104. int now=;
  105. FOR(i,,n) if (fa[i]==i) {
  106. to[i]=++now; F[now]=i;
  107. int tmp=i;
  108. while (suc[tmp]) tmp=suc[tmp], to[tmp]=++now, F[now]=tmp;
  109. }
  110. //debug
  111. //FOR(i,1,n) printf(" %d",to[i]); putchar('\n');
  112. //debug
  113. init(,,n); FOR(i,,n) fa[i]=q[i].l=q[i].r=i;
  114. FOR(i,,m) {
  115. if (!strcmp(node[i].s,"U")) {
  116. u=find(to[node[i].x]); v=find(to[node[i].y]);
  117. if (u!=v) union_set1(u,v);
  118. }
  119. else if (!strcmp(node[i].s,"A1")) update(,,n,to[node[i].x],to[node[i].x],node[i].y);
  120. else if (!strcmp(node[i].s,"A2")) u=find(to[node[i].x]), update(,,n,q[u].l,q[u].r,node[i].y);
  121. else if (!strcmp(node[i].s,"A3")) update(,,n,,n,node[i].x);
  122. else if (!strcmp(node[i].s,"F1")) printf("%d\n",query(,,n,to[node[i].x],to[node[i].x]));
  123. else if (!strcmp(node[i].s,"F2")) u=find(to[node[i].x]), printf("%d\n",query(,,n,q[u].l,q[u].r));
  124. else printf("%d\n",query(,,n,,n));
  125. }
  126. return ;
  127. }

BZOJ 2333 棘手的操作(离线+线段树+带权并查集)的更多相关文章

  1. 2333: [SCOI2011]棘手的操作[离线线段树]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2325  Solved: 909[Submit][Stat ...

  2. BZOJ 1202 狡猾的商人 差分约束or带权并查集

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1202 题目大意: 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的 ...

  3. BZOJ 3376 [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)

    题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #in ...

  4. 【BZOJ4025】二分图(线段树分治,并查集)

    [BZOJ4025]二分图(线段树分治,并查集) 题面 BZOJ 题解 是一个二分图,等价于不存在奇环. 那么直接线段树分治,用并查集维护到达根节点的距离,只计算就好了. #include<io ...

  5. 【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)

    [CF938G]Shortest Path Queries(线段树分治,并查集,线性基) 题面 CF 洛谷 题解 吼题啊. 对于每个边,我们用一个\(map\)维护它出现的时间, 发现询问单点,边的出 ...

  6. BZOJ4025 二分图 线段树分治、带权并查集

    传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...

  7. hdu 5441 Travel 离线带权并查集

    Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...

  8. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  9. BZOJ 3362 Navigation Nightmare 带权并查集

    题目大意:给定一些点之间的位置关系,求两个点之间的曼哈顿距离 此题土豪题.只是POJ也有一道相同的题,能够刷一下 别被题目坑到了,这题不强制在线.把询问离线处理就可以 然后就是带权并查集的问题了.. ...

随机推荐

  1. linux signal函数遇到的问题

    1.关于signal函数的定义 signal最开始的原型是这: void (*signal(int signo, void (*func)(int)))(int);看过下面两行,了解到上面这一行是这个 ...

  2. JavaScript基础part2

    JavaScript对象 在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,String.Math.Array.Date.Re ...

  3. javascript之input字符串不为空

    今天我们来讲如何判断这个java中字符串输入是否为空 ------------------------当只有一个input的时候,我们来进行个判断这个值是否为空-------------------- ...

  4. Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航

    原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...

  5. 杭州优步uber司机第二组奖励政策

    -8月9日更新- 优步杭州第二组: 定义为激活时间在2015/6/8之后2015/8/3之前的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com ...

  6. (AOSP)repo checkout指定版本

    aosp 怎么切换分支? To properly switch Android version, all you need to change is branch for your manifest ...

  7. CLR via #C读书笔记三:基元类型、引用类型和值类型

    1.一些开发人员说应用程序在32位操作系统上运行,int代表32位整数:在64位操作系统上运行,int代表64位整数.这个说法是完全错误的.C#的int始终映射到System.Int32,所以不管在什 ...

  8. .net core mvc 模型绑定 之 json and urlencoded

    .net core mvc 模型绑定, FromQuery,对应 url 中的 urlencoded string ("?key1=value1&key2=value2") ...

  9. L010 linux命令及基础手把手实战总结

    一转眼都快两周没更新了,最近实在太忙了,这两周的时间断断续续的把L010学完了,短短的15节课,确是把前10节的课程全部的运用一遍,从笔记到整理,再到重新理解,最后发布到微博,也确实提升了一些综合性能 ...

  10. java 面向对象一

    一 基础部分 1.基本数据类型 Java的八种基本数据类型不支持面向对象的编程机制,不具备“对象”的特性:没有成员变量.方法可以调用.java之所以提供这八种基本数据类型,是为了照顾程序员的传统习惯. ...