mdzz,手残没法治

一开始想按编号顺序用splay维护最值,但没法查找

然后想用线段树启发式合并,然而空间会爆

由于连接之后的连通块顺序没有关系,所以可以考虑并查集来表示区间,然后就可以用线段树维护了(坚决不写左偏树

注意:

1、统计并查集一定找父节点,不要扫(因为集合和编号顺序没关系)

2、标记有时可以是负值,不要zz的写>0

3、开对空间

码:

#include<iostream>
#include<cstdio>
using namespace std;
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
#include<vector>
#define N 300005
vector<int>v1[N];
int fu[N],sz[N],i,ans,v[N<<2],jbj[N<<2],va[N],a,b,c,n,vv[N],m,x,y,j,cnt,dui[N];
char ch[9];
bool yw[N];
int find(int o)
{if(fu[o]!=o)fu[o]=find(fu[o]);return fu[o];
}
struct wen
{int op;int x;int y;
}w[N];
void up(int o)
{v[o]=max(v[o<<1],v[o<<1|1]);
}
void down(int o,int l,int r)
{if(jbj[o]!=0){int ll=o<<1;int rr=o<<1|1;v[ll]+=jbj[o];v[rr]+=jbj[o];jbj[ll]+=jbj[o];jbj[rr]+=jbj[o];jbj[o]=0;          }
}
void jian(int o,int l,int r)
{if(l==r){v[o]=va[l];        return;}int mid=(l+r)>>1;jian(zuo);jian(you);up(o);
}
void gai(int o,int l,int r)
{if(a<=l&&r<=b){if(w[i].op>=1&&w[i].op<=3){v[o]+=c;jbj[o]+=c;}if(w[i].op>=4&&w[i].op<=6)ans=max(ans,v[o]);return;}down(o,l,r);int mid=(l+r)>>1;if(a<=mid)gai(zuo);if(b>mid)gai(you);up(o);
}
int main()
{//freopen("pair.in","r",stdin);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&vv[i]);             v1[i].push_back(i);sz[i]=1;fu[i]=i;}scanf("%d",&m);for(i=1;i<=m;i++){scanf("%s",ch);if(ch[0]=='U'){scanf("%d%d",&x,&y);w[i].op=0;w[i].x=x;w[i].y=y;int fx=find(x),fy=find(y);if(fx==fy)continue;if(sz[fx]<sz[fy]){fu[fx]=fy;sz[fy]+=sz[fx];for(j=0;j<v1[fx].size();j++)v1[fy].push_back(v1[fx][j]);               }else{fu[fy]=fx;sz[fx]+=sz[fy];for(j=0;j<v1[fy].size();j++)v1[fx].push_back(v1[fy][j]);                                }               }if(ch[0]=='A'){if(ch[1]=='1'){   w[i].op=1;scanf("%d%d",&w[i].x,&w[i].y);}if(ch[1]=='2'){   w[i].op=2;scanf("%d%d",&w[i].x,&w[i].y);}if(ch[1]=='3')  {   w[i].op=3;scanf("%d",&w[i].x);}      }       if(ch[0]=='F'){if(ch[1]=='1'){   w[i].op=4;scanf("%d",&w[i].x);}if(ch[1]=='2'){   w[i].op=5;scanf("%d",&w[i].x);}if(ch[1]=='3')   w[i].op=6;     }   }for(i=1;i<=n;i++){int o=find(i);if(yw[o])continue;yw[o]=1;    //  if(yw[i])continue;for(j=0;j<v1[o].size();j++){//  cout<<v1[o][j]<<" ";va[++cnt]=vv[v1[o][j]];dui[v1[o][j]]=cnt;}        }for(i=1;i<=n;i++)sz[i]=1,fu[i]=i;jian(1,1,n);for(i=1;i<=m;i++){if(w[i].op==0){int fx=find(w[i].x),fy=find(w[i].y);if(fx==fy)continue;if(sz[fx]<sz[fy]){fu[fx]=fy;sz[fy]+=sz[fx];       }else{fu[fy]=fx;sz[fx]+=sz[fy];                              }       }if(w[i].op==1){a=b=dui[w[i].x];c=w[i].y;gai(1,1,n);       }if(w[i].op==2){int fx=find(w[i].x);a=dui[fx];b=dui[fx]+sz[fx]-1;c=w[i].y;gai(1,1,n);        }if(w[i].op==3){a=1;b=n;c=w[i].x;gai(1,1,n);       }if(w[i].op==4){a=b=dui[w[i].x];ans=-1000000009;gai(1,1,n);    printf("%d\n",ans);       }if(w[i].op==5){int fx=find(w[i].x);a=dui[fx];b=dui[fx]+sz[fx]-1;ans=-1000000009;gai(1,1,n); printf("%d\n",ans);       }if(w[i].op==6){a=1;b=n;ans=-1000000009;gai(1,1,n);printf("%d\n",ans);       }       }
}

2017.9.14 棘手的操作 思考记录相关推荐

  1. 2017.3.14 软件包管理器 思考记录

    没什么好说的,就是打标记的树剖 但是:一定要注意标记下传的优先级!!!!!!!!!别导致同时下传两个标记!! #include<iostream> #include<cstdio&g ...

  2. 2017.3.14 不重复数字 思考记录

    其实,这是一个stl入门题       map水过 #include<iostream> #include<cstdio> using namespace std; #incl ...

  3. 2017.9.10 序列操作 思考记录

    唉,怎么说呢.pushdown要注意的事全忘光了.写+调竟然花了两个小时. 要注意反转时是^1而不是=1! 下传标记不要单纯管顺序,因为没有任何意义,要确保在任意时刻一个点只有一种同级标记!!比如赋值 ...

  4. 2017.6.27 树上操作 思考记录

    这个题是以前应该做过.. 子树的话注意size就可以了,另外还要开longlong 另外标记是+-的,不是覆盖的.. 下传时要注意r-mid   (开括号开错调了半天,数学太好了) 下传时应使用纯树上 ...

  5. 2017.10.5 最短母串 思考记录

    这个题n<=15,可以用10表示选取情况下的最优值 预处理两个串之间的连接关系,然后枚举状态转移 然而这个题还要输出方案,,而且还不让你开空间. 所以只能记录前继动态判断.. 所以十分难写难调 ...

  6. 2017.9.26 块的计数 思考记录

    这种题就属于那种描述很简单,要求很简单,但就是无从下手的题 这个题我只有n根n做法..枚举因数检验.. 首先对于任何块的大小,方案唯一,这是显然的,,如果划分位置改变1,一定有一个位置+1,一个位置- ...

  7. 2017.8.8 魔兽地图DotR 思考记录

    假题害人..  明明说了是一棵树,却还要强行加一组坑爹数据   所以网上的题解挂了好多 这题是很综合的树上背包问题. 由依赖关系转化为一些枚举来跑多重背包 由于是 "一棵树" 所以 ...

  8. 2017.3.25 魔术球问题 思考记录

    这个题还是不难的..(想了20分钟就出完解) 二分+网络流检验,,能加在上面的数大的向小的连边 总点数-最大匹配>n    :{l=mid+1,      记录答案       } else   ...

  9. 2017.3.16 聪聪可可 思考记录(非常不容易)

    听说是树分治的题,就进来了,然而一看数据,最大才2000 n^2暴力应该能过啊:但是T了,因为--此题时限0.3秒..听说树形dp和点分治都可以, 那先想想吧结果,竟然搞了一天...如果学完了树分治, ...

最新文章

  1. ORACLE中的imp和exp
  2. java new 面试_java面试30问
  3. HihoCoder - 1483 区间最值
  4. HTML5跑酷网页游戏源码
  5. 移动端相关 em rem px 区别和关联
  6. 95-080-054-源码-启动-启动TaskManager
  7. 理财产品利息一直降低是什么原因?
  8. 尼尔森十大可用性原则
  9. Java开发实战经典学习记录(一)
  10. 怎样看开源代码版权_版权声明在开源代码中泛滥成灾
  11. mellanox 网卡驱动,Mellanox网卡OFED驱动安装
  12. 一名菜鸟程序员的跳槽经历以及其所感所想(二)
  13. 基于Python实现的微信好友数据分析
  14. 服务器系统做个备份吗,服务器操作系统能做备份吗
  15. 如何搭建自己的内测分发平台?有可以直接用的内测分发平台吗?
  16. 我每次去德国出差必带的东西
  17. 饭桌的威力,辛酸的父母。
  18. 线性方程组(七)- 线性无关
  19. 货币兑换(指针与常量)
  20. 51单片机学习笔记——蜂鸣器

热门文章

  1. SpringBoot和Elasticsearch集成
  2. Java虚拟机------垃圾收集器
  3. 工作笔记 - Android make文件学习(主要是编译Android apk)
  4. 最小生成树 Kruskal算法 Prim算法
  5. 用的最多的正则表达式
  6. 机器学习十大经典算法之朴素贝叶斯分类
  7. tkinter要安装吗 苹果_建造存10万斤的苹果保鲜冷库安装工程要考虑哪些因素?...
  8. Spark shuffle:hash和sort性能对比
  9. 一、Linear Regression
  10. 求一个3*3矩阵两条对角线上元素之和(每个元素只加一次) C语言