我懒死了

过于棘手

但这题真的很水的说

毕竟写啥都能过

常见思路:

①:由于不强制在线,所以重新编号之后线段树维护

②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的

讲一种无脑算法:

对于$F1$,并查集乱搞

对于$F2$,用可并堆维护连通块里的值,并维护对应的时间,如果堆顶访问到旧的值直接抛出

对于$F3$,用全局堆维护每个连通块的最大值的集合并维护对应的时间,如果堆顶访问到旧的值直接抛出

$A1$:单点修改时在所在可并堆里插入一个新的,维护修改时间,同时在全局堆里插入一个新的该可并堆的最大值

$A2$:在堆上打tag,在全局堆中插入新的最大值

$A3$:维护一个全局变量

$U$:略

好气啊将近二百行可并堆写的一点问题没有结果十多行并查集出了三处锅...

 #include<cstdio>
 #include<queue>
 #include<algorithm>
 using std::max;
 using std::priority_queue;
 using std::swap;
 ;
 int n,v[N],del[N],Del;
 ];

 int lta[N],ltb[N];
 struct shino
 {
     int id,v,t;
     shino(){}
     shino(int a,int b,int c){id=a,v=b,t=c;}
     bool friend operator < (shino x,shino y){return x.v<y.v;}
 }g;
 struct merheap
 {
     ],tag[N<<],son[N<<][],fa[N<<],kr,yop[N<<],rt[N<<];
     shino el[N<<];
     int find(int x)
     {
         if(fa[x]==x) return x;
         else return fa[x]=find(fa[x]);
     }
     void fuckdown(int x)
     {
         if(tag[x])
         {
             ];
             if(k){el[k].v+=tag[x];tag[k]+=tag[x];}
             k=son[x][];
             if(k){el[k].v+=tag[x];tag[k]+=tag[x];}
             tag[x]=;
         }
     }
     int makenew(shino sn)
     {
         kr++;
         el[kr]=sn;
         fa[kr]=kr;
         return kr;
     }
     int merge(int x,int y)
     {
         if(!x) return y;
         if(!y) return x;
         fuckdown(x);
         fuckdown(y);
         if(el[x]<el[y]) swap(x,y);
         son[x][]=merge(son[x][],y);
         fa[son[x][]]=x;
         ]]<dis[son[x][]]) swap(son[x][],son[x][]);
         dis[x]=dis[son[x][]]+;
         return x;
     }
     void push(int x,shino ei)
     {
         int tmp=makenew(ei);
         int xx=find(x);
         rt[x]=merge(xx,tmp);
     }
     void pop(int x)
     {
         int xx=find(x);
         fuckdown(xx);
         ],son[xx][]);
         fa[xx]=tmp;
         ]) fa[son[xx][]]=tmp;
         ]) fa[son[xx][]]=tmp;
         rt[x]=tmp;
     }
     shino top(int x)
     {
         x=find(x);
         return el[x];
     }
     void update(int x)
     {
         int xx=find(x);
         while(xx)
         {
             xx=find(xx);
             g=top(xx);
             if(g.t!=lta[g.id]) pop(xx);
             else break;
         }
     }
     void add(int x,int vi)
     {
         int xx=find(x);
         el[xx].v+=vi;
         tag[xx]+=vi;
     }
     void init()
     {
         ;i<=n;i++)
         {
             makenew(shino(i,v[i],));
             rt[i]=i;
         }
     }
 }rk;
 int fa[N];
 bool isrt[N];
 void domerge(int x,int y);
 priority_queue<shino> q;
 void find(int x)
 {
     if(fa[x]!=fa[fa[x]]) find(fa[x]),v[x]+=del[fa[x]];
     fa[x]=fa[fa[x]];
 }
 void merge(int x,int y,int tt)
 {
     find(x),find(y);
     int fx=fa[x],fy=fa[y];
     if(fx==fy) return;
     domerge(fx,fy);
     q.push(shino(fy,rk.top(fy).v,tt));
     ltb[fy]=tt;
     fa[fx]=fy;
     del[fx]-=del[fy];
     v[fx]+=del[fx];
     isrt[fx]=;
 }
 void domerge(int x,int y)
 {
     int xx=rk.find(x),yy=rk.find(y);
     int tmp=rk.merge(xx,yy);
     rk.fa[xx]=rk.fa[yy]=rk.rt[y]=tmp;
 }
 void fuckdate()
 {
     while(!q.empty())
     {
         g=q.top();
         if(!isrt[g.id]||g.t!=ltb[g.id]) q.pop();
         else break;
     }
 }

 int main()
 {
     scanf("%d",&n);
     ;i<=n;i++) scanf(;
     int T;
     scanf("%d",&T);
     rk.init();
     ;i<=n;i++) q.push(shino(i,v[i],));
     int xin,yin,vin;
     ;t<=T;t++)
     {
         scanf("%s",op);
         ]=='U')
         {
             scanf("%d%d",&xin,&yin);
             merge(xin,yin,t);
         }]=='A')
         {
             ]==')
             {
                 scanf("%d%d",&xin,&vin);
                 find(xin);
                 v[xin]+=vin;
                 rk.push(fa[xin],shino(xin,v[xin]+del[fa[xin]],t));
                 lta[xin]=t;
                 rk.update(fa[xin]);
                 q.push(shino(fa[xin],rk.top(fa[xin]).v,t));
                 ltb[fa[xin]]=t;
             }]==')
             {
                 scanf("%d%d",&xin,&vin);
                 find(xin);
                 del[fa[xin]]+=vin;
                 rk.add(fa[xin],vin);
                 q.push(shino(fa[xin],rk.top(fa[xin]).v,t));
                 ltb[fa[xin]]=t;
             }else
             {
                 scanf("%d",&vin);
                 Del+=vin;
             }
         }]=='F')
         {
             ]==')
             {
                 scanf("%d",&xin);
                 find(xin);
                 printf("%d\n",v[xin]+del[fa[xin]]+Del);
             }]==')
             {
                 scanf("%d",&xin);
                 find(xin);
                 rk.update(fa[xin]);
                 printf("%d\n",rk.top(fa[xin]).v+Del);
             }else
             {
                 fuckdate();
                 g=q.top();
                 printf("%d\n",g.v+Del);
             }
         }
     }
     ;
 }

巨佬您txdy

题外话:你这题解也太水了吧

rkk:因为确实水死了啊...都快成板子了...

[SCOI2011]棘手的操作(可并堆/并查集/线段树)的更多相关文章

  1. 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记

    2016-05-31  21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...

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

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

  3. 【bzoj2333】[SCOI2011]棘手的操作 可并堆+STL-set

    UPD:复杂度是fake的...大家还是去写启发式合并吧. 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条 ...

  4. [bzoj2333] [SCOI2011]棘手的操作 (可并堆)

    //以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个节点,标号从1 ...

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

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

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

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

  7. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)

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

  8. 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作

    n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...

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

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

随机推荐

  1. get与post提交方式区别?

    1.get <!--表单数据作为HTTP GET请求发送给action 规定的URL,并将数据附加在URL之后,由客户端直接发送给服务器.表单数据不能太长,也不能含有非ASCII码的字符--&g ...

  2. java笔记之IO3读操作

    * 字节输入流操作步骤: * A:创建字节输入流对象 * B:调用read()方法读取数据,并把数据显示在控制台 * C:释放资源 *  * 读取数据的方式: * A:int read():一次读取一 ...

  3. C# a标签请求下载文件

    服务器文件后台处理方式: a标签: <a href="/FileUpload/DownloadFile?file=/UploadFiles/File/bfcd676b-13a8-419 ...

  4. [Swift通天遁地]一、超级工具-(3)带切换图标的密码文本框

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. bzoj 2257[Jsoi2009]瓶子和燃料 数论/裴蜀定理

    题目 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1< ...

  6. python ftp小程序练习

    作业要求: 开发一个支持多用户在线的FTP程序 要求: 1.用户加密认证 2.允许同时多用户登陆 3.每个用户都有自己的家目录,并且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 ...

  7. [ZOJ1140]Courses 课程

    Description 给出课程的总数P(1<=p<100),学生的总数N(1<=N<=300) 每个学生可能选了一门课程,也有可能多门,也有可能没有. 要求选出P个学生来组成 ...

  8. ACM_给你100块钱

    给你100块钱 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小光见到昨晚旭能神没拿到一血,又损失了一百块,很同情他.但是为了不 ...

  9. Service官方教程(2)*IntentService与Service示例、onStartCommand()3个返回值的含义。

    1.Creating a Started Service A started service is one that another component starts by calling start ...

  10. C#模版学习研究

    原文链接1   原文链接2 using System; using System.Collections.Generic; using System.Text; using T = System.By ...