http://www.lydsy.com/JudgeOnline/problem.php?id=2333

题意:

有N个节点,标号从1到N,这N个节点一开始相互不连通。第i个节点的初始权值为a[i],接下来有如下一些操作:

U x y: 加一条边,连接第x个节点和第y个节点

A1 x v: 将第x个节点的权值增加v

A2 x v: 将第x个节点所在的连通块的所有节点的权值都增加v

A3 v: 将所有节点的权值都增加v

F1 x: 输出第x个节点当前的权值

F2 x: 输出第x个节点所在的连通块中,权值最大的节点的权值

F3: 输出所有节点中,权值最大的节点的权值

N, Q<=200000,-1000<=v, a[i]<=1000

#include <bits/stdc++.h>
using namespace std;
const int N=300015, Lim=N;
struct node *null;
struct node {
node *c[2], *f;
int s, tag, mx, w;
void init(int _w=-(~0u>>2)) { c[0]=c[1]=f=null; s=1; tag=0; mx=w=_w; }
void up() { if(this==null) return; s=c[0]->s+c[1]->s+1; mx=max(w, max(c[0]->mx, c[1]->mx)); }
void upd(int add) { if(this==null) return; mx+=add; w+=add; tag+=add; }
void down() { if(tag) c[0]->upd(tag), c[1]->upd(tag), tag=0; }
bool d() { return f->c[1]==this; }
void setc(node *x, int d) { c[d]=x; x->f=this; }
}Po[Lim], *iT=Po, *p[N];
node *newnode(int w=-(~0u>>2)) { iT->init(w); return iT++; }
void rot(node *x) {
node *f=x->f; f->down(); x->down(); bool d=x->d();
if(f->f!=null) f->f->setc(x, f->d());
else x->f=f->f;
f->setc(x->c[!d], d);
x->setc(f, !d);
f->up();
}
void splay(node *x, node *goal) {
if(x==null) return;
while(x->f!=goal)
if(x->f->f==goal) rot(x);
else x->d()==x->f->d()?(rot(x->f), rot(x)):(rot(x), rot(x));
x->up();
}
int getrank(node *x) { splay(x, null); return x->c[0]->s; }
node *sel(int k, node *x) {
int s=x->c[0]->s;
if(s==k) return x;
if(s<k) return sel(k-s-1, x->c[1]);
return sel(k, x->c[0]);
}
node *sel(int k) { splay(&Po[1], null); return sel(k, &Po[1]); }
node *getrange(int l, int r) {
node *nl=sel(l-1), *nr=sel(r+1);
splay(nl, null); splay(nr, nl); return nr;
}
node *getblc(node *x, int len) { int rk=getrank(x); return getrange(rk, rk+len-1); } int pf[N], sz[N], wsum, a[N], n;
int find(int x) { return pf[x]==x?x:pf[x]=find(pf[x]); }
void U(int x, int y) {
int fx=find(x), fy=find(y);
if(fx==fy) return;
if(sz[fx]<sz[fy]) swap(x, y), swap(fx, fy);
sz[fx]+=sz[fy]; pf[fy]=fx;
node *yf=getblc(p[fy], sz[fy]), *ny=yf->c[0];
// printf("%d, %d\n", yf, ny);
yf->c[0]=null; ny->f=null;
splay(yf, null);
splay(p[fx], null);
splay(sel(p[fx]->c[0]->s+1), p[fx]);
p[fx]->c[1]->setc(ny, 0);
splay(ny, null);
}
void A1(int x, int v) { splay(p[x], null); p[x]->w+=v; p[x]->up(); }
void A2(int x, int v) { x=find(x); node *y=getblc(p[x], sz[x]); y->c[0]->upd(v); splay(y->c[0], null); }
void A3(int v) { wsum+=v; }
int F1(int x) { splay(p[x], null); return p[x]->w; }
int F2(int x) { int rt=find(x); node *y=getblc(p[rt], sz[rt]); return y->c[0]->mx; }
int F3() { splay(&Po[1], null); return Po[1].mx; }
node *build(int l, int r) {
if(l>r) return null;
int mid=(l+r)>>1;
node *x=p[mid]=newnode(a[mid]), *nl=build(l, mid-1), *nr=build(mid+1, r);
if(nl!=null) x->setc(nl, 0);
if(nr!=null) x->setc(nr, 1);
x->up();
return x;
}
void init() {
null=iT++; null->init(); null->s=0;
node *l=newnode(), *r=newnode();
l->setc(r, 1);
r->setc(build(1, n), 0);
r->up(); l->up();
//D(l);
for(int i=1; i<=n; ++i) pf[i]=i, sz[i]=1;
}
int main() {
scanf("%d", &n);
for(int i=1; i<=n; ++i) scanf("%d", &a[i]);
init();
int Q; scanf("%d", &Q);
while(Q--) {
char cs[5];
int x, v;
scanf("%s", cs);
if(cs[0]=='A') {
if(cs[1]=='1') scanf("%d%d", &x, &v), A1(x, v);
else if(cs[1]=='2') scanf("%d%d", &x, &v), A2(x, v);
else scanf("%d", &v), A3(v);
}
else if(cs[0]=='U') scanf("%d%d", &x, &v), U(x, v);
else {
int ans;
if(cs[1]=='1') scanf("%d", &x), ans=F1(x);
else if(cs[1]=='2') scanf("%d", &x), ans=F2(x);
else ans=F3();
printf("%d\n", ans+wsum);
}
//puts("");
//splay(&Po[1], null);
//D(&Po[1]);
}
return 0;
}

  

其实我是直接输入2333来做的233333333

想了一下发现可以用splay来做0.0

大概就是维护一个序列,然后同一连通块在一段连续的区间,然后区间修改就行辣

然后连通块大小用并查集维护一下就行辣

(然后看到题解是一堆可并堆是什么鬼。。。。可并堆是什么.......QAQ

(窝看了一下,妈呀你们这个左偏树查询和深度有关,居然没被卡!!!差评!!然后我的splay是单次查询是$O(logn)$的居然还被卡常熟!!!!!!

【BZOJ】2333: [SCOI2011]棘手的操作的更多相关文章

  1. BZOJ 2333: [SCOI2011]棘手的操作

    题目描述 真的是个很棘手的操作.. 注意每删除一个点,就需要clear一次. #include<complex> #include<cstdio> using namespac ...

  2. BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...

  3. BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...

  4. bzoj 2333 [SCOI2011]棘手的操作 —— 可并堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2333 稍微复杂,参考了博客:http://hzwer.com/5780.html 用 set ...

  5. BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)

    码农题.. 很显然除了两个全局操作都能用可并堆完成 全局最大值用个multiset记录,每次合并时搞一搞就行了 注意使用multiset删除元素时 如果直接delete一个值,会把和这个值相同的所有元 ...

  6. 2333: [SCOI2011]棘手的操作[写不出来]

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

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

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

  8. 2333: [SCOI2011]棘手的操作[我不玩了]

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

  9. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

随机推荐

  1. HTML5学习之拖放(十)

    l元素可以用于拖拽必须设置draggable="true"属性,img和a标签除外,她们两个默认就可以被拖拽 想做拖拽处理,就需要在Dom元素上监听拖放的事件:dragstart, ...

  2. Pyqt QListWidget 展示系统环境变量

    今天学习了下Pyqt的 QListWidget 控件 我们先看下这个图片 这张图片就是典型的listWidget效果,我们今天就仿这样布局新建个ListWidget 在网上找了个关于QListWidg ...

  3. DIV宽度自动缓慢变化

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. document.location.reload();与location.href='xxx'的区别

    document.location.reload();会重新加载页面,onload事件会被触发. location.href='xxx'刷新页面,onload事件不会触发.

  5. WPF PRISM开发入门二(Unity依赖注入容器使用)

    这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...

  6. hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***

    题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙,          每个逮捕队伍在每个城市可以选 ...

  7. BZOJ 3289: Mato的文件管理 莫队+BIT

    3289: Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的 ...

  8. java中static作用详解

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  9. ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正

    很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这 ...

  10. Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解

    废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...