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

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

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

# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin... struct Node{char s[]; int x, y;}node[N];
struct Q{int l, r;}q[N];
int seg[N<<], tag[N<<], a[N], fa[N], to[N], tail[N], suc[N], F[N]; int find(int x){
int tmp;
if (fa[x]!=x) tmp=find(fa[x]), fa[x]=tmp;
return fa[x];
}
void union_set(int u, int v){fa[u]=v; suc[tail[v]]=u; tail[v]=tail[u];}
void union_set1(int x, int y){
int l=min(q[x].l,q[y].l), r=max(q[x].r,q[y].r);
fa[x]=y, q[y].l=l, q[y].r=r;
}
void push_up(int p){seg[p]=max(seg[p<<],seg[p<<|]);}
void push_down(int p){
if (!tag[p]) return ;
seg[p]+=tag[p];
tag[p<<]+=tag[p]; tag[p<<|]+=tag[p]; tag[p]=;
}
void init(int p, int l, int r){
if (l<r) {
int mid=(l+r)>>;
init(lch); init(rch); push_up(p);
}
else seg[p]=a[F[l]];
}
int query(int p, int l, int r, int L, int R){
push_down(p);
if (L>r||R<l) return -INF;
if (L<=l&&R>=r) return seg[p];
int mid=(l+r)>>;
return max(query(lch,L,R),query(rch,L,R));
}
void update(int p, int l, int r, int L, int R, int val){
push_down(p);
if (L>r||R<l) return ;
if (L<=l&&R>=r) tag[p]=val, push_down(p);
else {
int mid=(l+r)>>;
update(lch,L,R,val); update(rch,L,R,val); push_up(p);
}
}
int main ()
{
int n, m, u, v;
scanf("%d",&n);
FOR(i,,n) fa[i]=tail[i]=i;
FOR(i,,n) scanf("%d",a+i);
scanf("%d",&m);
FOR(i,,m) {
scanf("%s",node[i].s);
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);
else if(!strcmp(node[i].s,"F3")) continue;
else scanf("%d",&node[i].x);
}
FOR(i,,m) if(node[i].s[]=='U') {
u=find(node[i].x), v=find(node[i].y);
if (u!=v) union_set(u,v);
}
int now=;
FOR(i,,n) if (fa[i]==i) {
to[i]=++now; F[now]=i;
int tmp=i;
while (suc[tmp]) tmp=suc[tmp], to[tmp]=++now, F[now]=tmp;
}
//debug
//FOR(i,1,n) printf(" %d",to[i]); putchar('\n');
//debug
init(,,n); FOR(i,,n) fa[i]=q[i].l=q[i].r=i;
FOR(i,,m) {
if (!strcmp(node[i].s,"U")) {
u=find(to[node[i].x]); v=find(to[node[i].y]);
if (u!=v) union_set1(u,v);
}
else if (!strcmp(node[i].s,"A1")) update(,,n,to[node[i].x],to[node[i].x],node[i].y);
else if (!strcmp(node[i].s,"A2")) u=find(to[node[i].x]), update(,,n,q[u].l,q[u].r,node[i].y);
else if (!strcmp(node[i].s,"A3")) update(,,n,,n,node[i].x);
else if (!strcmp(node[i].s,"F1")) printf("%d\n",query(,,n,to[node[i].x],to[node[i].x]));
else if (!strcmp(node[i].s,"F2")) u=find(to[node[i].x]), printf("%d\n",query(,,n,q[u].l,q[u].r));
else printf("%d\n",query(,,n,,n));
}
return ;
}

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. c#调用c++库函数

    如果是非托管的,就用DllImport,举例    using System;    using System.Runtime.InteropServices;    class MainApp    ...

  2. Habse中Rowkey的设计原则——通俗易懂篇

    Hbase的Rowkey设计原则 一. Hbase介绍 HBase -> Hadoop Database,HBase是Apache的Hadoop项目的子项目.HBase不同于一般的关系数据库,它 ...

  3. NB-IOT连接移动onenet平台流程

    1. 先创建账号,然后创建产品 2. 创建设备,用AT+CGSN和AT+CIMI查询NB-IOT的IMEI和IMSI填写上去. 3. 创建好的设备.

  4. Arduino-元件简介

    DS18B20温度传感器 DS18B20是DALLAS公司生产的一种常用的温度传感器,其具有体积小巧.硬件功耗低.抗干扰能力强.精准度高的特点.该传感器具有单总线通讯的能力,电压范围为3.0V~5.5 ...

  5. 关于@media不生效的问题和meta总结

    1:之前做的是两套页面.现在改成响应式布局.发现加上 @media only screen and (max-width: 500px) {    .gridmenu {        width:1 ...

  6. [HNOI2017]影魔

    题意: 给定 \(n\) 个数的排列,\(m\) 次询问,每次询问询问一个区间内所有子区间的贡献. 每个区间如果两个端点分别是最大值和次大值,我们就算 \(P1\) 的贡献. 如果两个端点一个是最大值 ...

  7. 2018(容斥定理 HDU6286)

    2018 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 贵州省未来二十年的投资机会的探讨1>

    贵州的股市 1.000540.SZ 中天金融 2.000589.SZ 黔轮胎A 3.000733.SZ 振华科技 4.000851.SZ 高鸿股份 5.000920.SZ 南方汇通 6.002025. ...

  9. Unicode,UTF-32,UTF-16,UTF-8到底是啥关系?

    编码的目的,就是给抽象的字符赋予一个数值,好在计算机里面表示.常见的ASCII使用8bit给字符编码,但是实际只使用了7bit,最高位没有使用,因此,只能表示128个字符:ISO-8859-1(也叫L ...

  10. Simple Expression

    Description You probably know that Alex is a very serious mathematician and he likes to solve seriou ...