bzoj3083 3306
又见bzoj的语言歧视,囧……
bzoj3083过了本地的数据在上面出现各种奇葩的TLE
835083 phile 3083 Time_Limit_Exceed 17092 kb 4872 ms Pascal/Edit 4931B 2015-01-11 19:53:32
10s的时限在逗我?
UPD:现在已经没有问题了……
这两道题目还是不错的
首先这道题是很像动态树的题目,我们发现树的形态不发生变化,而只是根在变化
考虑树链剖分,修改显然跟根的变化毫无关系
主要是查询,首先对于子树的查询肯定是dfs序(而轻重链剖分正是dfs序的一种特殊形式)
下面我们想,一次换跟操作对哪些点的查询会产生影响
画图可知,换根只会影响新根的祖先们的查询,如果不是祖先,那直接查询即可
而是祖先的话,设查询点x和新根路径上离x最近的那个点为y
显然,除去在原图上以y为根的子树,其余部分都应该是换根后的x的子树
由此题目得解,这里给出bzoj3083的代码
const inf=;
type node=record
po,next:longint;
end; var c,e,b,a,d,p,size,top,fa:array[..] of longint;
w:array[..] of node;
tree,lazy:array[..*] of longint;
anc:array[..,..] of longint;
root,ch,i,s,len,n,m,x,y,z:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure push(i:longint);
begin
lazy[i*]:=lazy[i];
lazy[i*+]:=lazy[i];
tree[i*]:=lazy[i];
tree[i*+]:=lazy[i];
lazy[i]:=;
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure add(x,y:longint);
begin
inc(len);
w[len].po:=y;
w[len].next:=p[x];
p[x]:=len;
end; procedure dfs1(x:longint);
var i,y:longint;
begin
for i:= to s do
begin
y:=anc[x,i-];
if anc[y,i-]= then break;
anc[x,i]:=anc[y,i-];
end;
size[x]:=;
i:=p[x];
while i<> do
begin
y:=w[i].po;
if fa[x]<>y then
begin
d[y]:=d[x]+;
fa[y]:=x;
anc[y,]:=x;
dfs1(y);
size[x]:=size[x]+size[y];
end;
i:=w[i].next;
end;
end; procedure dfs2(x:longint);
var q,i,y:longint;
begin
inc(len);
b[len]:=x;
c[x]:=len;
q:=;
i:=p[x];
while i<> do
begin
y:=w[i].po;
if fa[y]=x then
if size[y]>size[q] then q:=y;
i:=w[i].next;
end;
if q<> then
begin
top[q]:=top[x];
dfs2(q);
end;
i:=p[x];
while i<> do
begin
y:=w[i].po;
if (fa[y]=x) and (y<>q) then
begin
top[y]:=y;
dfs2(y);
end;
i:=w[i].next;
end;
e[x]:=len; //【c[x],e[x]】表示了以x根的子树所代表的区间
end; procedure build(i,l,r:longint);
var m:longint;
begin
if l=r then tree[i]:=a[b[l]]
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
tree[i]:=min(tree[i*],tree[i*+]);
end;
end; procedure change(i,l,r,x,y:longint);
var m:longint;
begin
if (x<=l) and (y>=r) then
begin
lazy[i]:=z;
tree[i]:=z;
end
else begin
if lazy[i]<> then push(i);
m:=(l+r) shr ;
if x<=m then change(i*,l,m,x,y);
if y>m then change(i*+,m+,r,x,y);
tree[i]:=min(tree[i*],tree[i*+]);
end;
end; procedure work(x,y:longint);
var f1,f2:longint;
begin
f1:=top[x];
f2:=top[y];
while f1<>f2 do
begin
if d[f1]>=d[f2] then
begin
change(,,n,c[f1],c[x]);
x:=fa[f1];
end
else begin
change(,,n,c[f2],c[y]);
y:=fa[f2];
end;
f1:=top[x];
f2:=top[y];
end;
if c[x]>c[y] then swap(x,y);
change(,,n,c[x],c[y]);
end; function getans(i,l,r,x,y:longint):longint;
var m,s:longint;
begin
if x>y then exit(inf);
if (x<=l) and (y>=r) then exit(tree[i])
else begin
if lazy[i]<> then push(i);
m:=(l+r) shr ;
s:=inf;
if x<=m then s:=getans(i*,l,m,x,y);
if y>m then s:=min(s,getans(i*+,m+,r,x,y));
exit(s);
end;
end; function check(x,y:longint):boolean;
var i,k:longint;
begin
if d[y]>=d[x] then exit(false);
for i:=s downto do
if d[x]- shl i>=d[y] then x:=anc[x,i];
if x=y then exit(true) else exit(false);
end; function ask(x:longint):longint;
var a,z,i:longint;
begin
if x=root then exit(tree[]);
if not check(root,x) then exit(getans(,,n,c[x],e[x]))
else begin
z:=root;
for i:=s downto do
if d[z]- shl i>d[x] then z:=anc[z,i]; //找最近点
a:=min(getans(,,n,,c[z]-),getans(,,n,e[z]+,n));
exit(a);
end;
end; begin
readln(n,m);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
s:=trunc(ln(n)/ln());
for i:= to n do
read(a[i]);
readln(root);
dfs1(root);
top[root]:=root;
len:=;
dfs2(root);
build(,,n);
for i:= to m do
begin
read(ch);
if ch= then
begin
readln(x);
root:=x;
end
else if ch= then
begin
readln(x,y,z);
work(x,y);
end
else begin
readln(x);
writeln(ask(x));
end;
end;
end.
bzoj3083 3306的更多相关文章
- 【BZOJ3083/3306】遥远的国度/树 树链剖分+线段树
[BZOJ3083]遥远的国度 Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了 ...
- centos7 打开mysql 3306端口并 设置外部访问
mysql安装后默认是localhost访问,如果需要外部访问可以设置一个新的账号把host改为%,意味着所有ip均可以访问 grant all privileges on *.* to 'outUs ...
- bzoj3083 遥远的国度 && bzoj3626 LCA (树链剖分)
今早刷了两道树剖的题目,用时两小时十五分钟= = 树剖的题目代码量普遍120+ 其实打熟练之后是很容易调的,不熟练的话代码量大可能会因为某些小细节调很久 3083:裸树剖+"换根" ...
- linux下mysql开启远程访问权限及防火墙开放3306端口
默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言,改表法比较容易一点,个人也是比 ...
- centos7开启3306端口,liunx查看防火墙是否开启
Can't connect to MySQL server on localhost (10061)这个就属于下面要说的情况 启动服务 systemctl start mariadb.service ...
- iptables 开启3306端口
[root@mysqld ~]# mysql -uroot -h 192.168.1.35 -p Enter password: ERROR 1130 (HY000): Host '192.168.1 ...
- ping通IP,telnet 3306不通
一个同事装的MySQL数据库,无法连接.1.查看权限2.查看防火墙检查用户权限,防火墙都没问题,就是无法连接,能ping通,但是telnet 3306 端口无法成功.检查了下数据库配置 ...
- Linux配置防火墙,开启80端口、3306端口(转)
vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火 ...
- 1045 | error connecting to master 'slave_user@192.168.0.75:3306' - retry-time: 6
mysql 主从复制问题整理 问题: 1045 | error connecting to master 'slave_user@192.168.0.75:3306' - retry-t ...
随机推荐
- Linux服务器常用性能监控命令汇总
1.ifconfig 网卡数目.ip地址.Mac地址.MTU大小 eth0 Link encap:Ethernet HWaddr 00:0d:3a:50:12:e9 inet addr:10.0.0. ...
- gitlab 配置 ssh && ubuntu
1,在你的电脑上生成密钥ssh-keygen -t rsa -C "youeamil@explode.com" 2,在 ubuntu系统中 ~/.ssh目录中生成了两个文件id_r ...
- Java--获取request中所有参数的方法
我们通常用到request获取某个参数的方法: String value=request.getparameter("key"); 如果想要获取request中所有的参数呢? re ...
- IOS-objectForKey与valueForKey在NSDictionary中的差异
从 NSDictionary 取值的时候有两个方法,objectForKey: 和 valueForKey:,这两个方法具体有什么不同呢? 先从 NSDictionary 文档中来看这两个方法的定义: ...
- 使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题
今天接触到一个新的UI调试工具教程如下: iOS真机UI调试利器——Reveal 引入增加-ObjC -framework Reveal指令后,发现项目出现多重静态库冲突问题, 首先介绍一个指令: - ...
- 在调用Qt库来实现功能过程中的一些总结
1.对于QTabWidget中tab名字的变化.当其中只有一个&时,Qt Assistant中给出的解释是:If the tab's label contains an ampersand, ...
- SQLITE和QT
sqlite3数据库支持事务 例如: BEGIN DEFERRED TRANSACTION; INSERT INTO main.test_transaction (test_unique) VALUE ...
- AS3.0面向对象的写法,类和实例
package /*package是包路径,例如AS文件在ActionScript文件夹下,此时路径应为package ActionScript.必须有的.package中只能有一个class,在一个 ...
- Curl 采集乱码 gzip 原因及解决方案 utf-8
用curl获取一个经过gzip压缩后的网页时返回乱码 原因大体就是服务器返回的Content-Encoding的值和网页的编码不同,造成curl解码出问题,直接将gzip或deflate编码的文件下载 ...
- C# 数据结构 基础 论述
问题: 信息世界中,计算机是加工处理的信息的载体,在这个过程中面临着三个问题: 1.如何方便高效的组织数据 2.如何在计算机中存储数据(内存和外存) 3.如何对存储的数据进行高效的操作 目的: 我们都 ...