当前位置: 首页 > news >正文

bzoj2333

好题,先离线把连通块变成连续的区间
每次连通块合并就相当于两个区间合并
这样就轻易的用线段树解决了

 

  1 type node=record
  2        wh:string[2];
  3        x,y:longint;
  4      end;
  5 
  6 var lazy,tree:array[0..300010*4] of longint;
  7     q:array[0..300010] of node;
  8     a,b,c,last,next,fa:array[0..300010] of longint;
  9     i,n,m,x,y,t:longint;
 10     ch:char;
 11 
 12 procedure swap(var a,b:longint);
 13   var c:longint;
 14   begin
 15     c:=a;
 16     a:=b;
 17     b:=c;
 18   end;
 19 
 20 function max(a,b:longint):longint;
 21   begin
 22     if a>b then exit(a) else exit(b);
 23   end;
 24 
 25 function getf(x:longint):longint;
 26   begin
 27     if fa[x]<>x then fa[x]:=getf(fa[x]);
 28     exit(fa[x]);
 29   end;
 30 
 31 procedure push(i:longint);
 32   begin
 33     inc(lazy[i*2],lazy[i]);
 34     inc(tree[i*2],lazy[i]);
 35     inc(lazy[i*2+1],lazy[i]);
 36     inc(tree[i*2+1],lazy[i]);
 37     lazy[i]:=0;
 38   end;
 39 
 40 function ask(i,l,r,x,y:longint):longint;
 41   var m,s:longint;
 42   begin
 43     if (x<=l) and (y>=r) then exit(tree[i])
 44     else begin
 45       if lazy[i]<>0 then push(i);
 46       m:=(l+r) shr 1;
 47       s:=-2147483647;
 48       if x<=m then s:=ask(i*2,l,m,x,y);
 49       if y>m then s:=max(s,ask(i*2+1,m+1,r,x,y));
 50       exit(s);
 51     end;
 52   end;
 53 
 54 procedure add(i,l,r,x,y,z:longint);
 55   var m:longint;
 56   begin
 57     if (x<=l) and (y>=r) then
 58     begin
 59       inc(tree[i],z);
 60       inc(lazy[i],z);
 61     end
 62     else begin
 63       if lazy[i]<>0 then push(i);
 64       m:=(l+r) shr 1;
 65       if x<=m then add(i*2,l,m,x,y,z);
 66       if y>m then add(i*2+1,m+1,r,x,y,z);
 67       tree[i]:=max(tree[i*2],tree[i*2+1]);
 68     end;
 69   end;
 70 
 71 procedure build(i,l,r:longint);
 72   var m:longint;
 73   begin
 74     if l=r then tree[i]:=a[c[l]]
 75     else begin
 76       m:=(l+r) shr 1;
 77       build(i*2,l,m);
 78       build(i*2+1,m+1,r);
 79       tree[i]:=max(tree[i*2],tree[i*2+1]);
 80     end;
 81   end;
 82 
 83 begin
 84   readln(n);
 85   for i:=1 to n do
 86   begin
 87     read(a[i]);
 88     fa[i]:=i;
 89     last[i]:=i;
 90   end;
 91   readln(m);
 92   for i:=1 to m do
 93   begin
 94     read(ch);
 95     q[i].wh:=ch;
 96     read(ch);
 97     q[i].wh:=q[i].wh+ch;
 98     if q[i].wh='U ' then
 99     begin
100       readln(q[i].x,q[i].y);
101       x:=getf(q[i].x);
102       y:=getf(q[i].y);
103       if x=y then continue;
104       fa[y]:=x;
105       next[last[x]]:=y;
106       last[x]:=last[y];
107     end
108     else if (q[i].wh='A1') or (q[i].wh='A2') then
109       readln(q[i].x,q[i].y)
110     else if (q[i].wh='F3') then readln
111     else readln(q[i].x);
112   end;
113 
114   for i:=1 to n do
115     if fa[i]=i then
116     begin
117       x:=i;
118       while x<>0 do
119       begin
120         inc(t);
121         b[x]:=t;
122         c[t]:=x;
123         x:=next[x];
124       end;
125     end;
126 
127   build(1,1,n);
128   for i:=1 to n do
129   begin
130     fa[i]:=i;
131     last[i]:=i;
132   end;
133 
134   for i:=1 to m do
135     if q[i].wh='U ' then
136     begin
137       x:=getf(q[i].x);
138       y:=getf(q[i].y);
139       if x=y then continue;
140       fa[y]:=x;
141       last[x]:=last[y];
142     end
143     else if q[i].wh='A1' then
144       add(1,1,n,b[q[i].x],b[q[i].x],q[i].y)
145     else if q[i].wh='A2' then
146     begin
147       x:=getf(q[i].x);
148       y:=last[x];
149       add(1,1,n,b[x],b[y],q[i].y);
150     end
151     else if q[i].wh='A3' then
152     begin
153       inc(tree[1],q[i].x);
154       inc(lazy[1],q[i].x);
155     end
156     else if q[i].wh='F1' then
157       writeln(ask(1,1,n,b[q[i].x],b[q[i].x]))
158     else if q[i].wh='F2' then
159     begin
160       x:=getf(q[i].x);
161       y:=last[x];
162       writeln(ask(1,1,n,b[x],b[y]));
163     end
164     else writeln(tree[1]);
165 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4473001.html

相关文章:

  • rpm的含义
  • 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码...
  • 兄弟选择器 + 和 ~
  • 在Mac OS X 10.8中配置Apache + PHP + MySQL
  • Docker学习笔记 - Docker的远程访问
  • 2015-02-01
  • 连续自然数和
  • php中的in_array分析及其替换方法
  • Linux内核 设备树操作常用API
  • SharePoint 2013 自定义扩展菜单(二)
  • html5的本地存储
  • 设计模式之创建型模式—— 1.1 简单工厂模式
  • javascript UniqueID属性
  • 与Susan Fowler探讨生产就绪微服务之问答
  • Android 老罗视频教程笔记
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • [译]Python中的类属性与实例属性的区别
  • 「译」Node.js Streams 基础
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gops —— Go 程序诊断分析工具
  • JAVA 学习IO流
  • leetcode388. Longest Absolute File Path
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue 配置sass、scss全局变量
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 第十八天-企业应用架构模式-基本模式
  • 给github项目添加CI badge
  • 简单数学运算程序(不定期更新)
  • 聊聊flink的BlobWriter
  • 驱动程序原理
  • 微信小程序开发问题汇总
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用jquery写贪吃蛇
  • gunicorn工作原理
  • kubernetes资源对象--ingress
  • 阿里云重庆大学大数据训练营落地分享
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Apache SeaTunnel 究竟是什么?
  • (六)c52学习之旅-独立按键
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)Travel Information Center
  • (转)菜鸟学数据库(三)——存储过程
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)项目管理杂谈-我所期望的新人
  • .CSS-hover 的解释
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net反编译工具
  • 。Net下Windows服务程序开发疑惑
  • @angular/cli项目构建--http(2)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [AAuto]给百宝箱增加娱乐功能