bzoj4009
这是一道神题,首先我们不难先到整体二分吧
下面的问题就是,求出对于每个水果,有多少盘子是他的子路径
直接考虑不是很容易,我们换个思路,考虑对于每个盘子,哪些水果能包含它
我们假设盘子a,b,dep[a]<dep[b]
如果b在a的子树内,不难发现,水果路径必须是一个点在b的子树内(包括b),一个在c的子树外(不包括c,c是ab路径上a下一个点)
否则 ,水果路径必须两个点分别在a,b子树内
子树问题不难想到dfs序,设子树x区间为l[x],r[x],盘子路径x,y(l[x]<l[y])满足条件为
则要满足x∈[1,l[c]-1],y∈[l[b],r[b]或x∈[l[b],r[b]], y∈[l[c]+1,n] 当b在a的子树内
否则x∈[l[a],r[a]],y∈[l[b],r[b],把(x,y)看做一个点
也就是现在询问每个点被多少矩形覆盖(注意第一种情形两个矩形是不相交的,所以覆盖的矩形数目就是盘子数目
矩形覆盖的经典做法是把矩形(x0,y0),(x1,y1)看成4个带权值的点
(x0,y0) 1, (x0,y1+1) -1, (x1+1,y0) -1 (x1+1,y1+1) 1,
这样每个询问点最下方(包括边界)的点权值和就是覆盖询问点的矩形数目(画图可知)
而这个问题我们对一维排序,一维树状数组即可快速解决
type node=record
po,next:longint;
end;
point=record
x,y,id,z:longint;
end; var e:array[..] of node;
dep,ans,st,a,b,c,p,d:array[..] of longint;
anc:array[..,..] of longint;
q,w,tw:array[..] of point;
can,v:array[..] of boolean;
j,tot,t,x,y,z,i,len,n,m,k,xx:longint; function lowbit(x:longint):longint;
begin
exit(x and (-x));
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);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
end; procedure dfs(x:longint);
var i,y:longint;
begin
inc(t);
a[x]:=t;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if a[y]= then
begin
anc[y,]:=x;
dep[y]:=dep[x]+;
dfs(y);
end;
i:=e[i].next;
end;
b[x]:=t;
end; function jump(x,d:longint):longint;
var i:longint;
begin
for i:= downto do
if dep[x]- shl i>=d then x:=anc[x,i];
exit(x);
end; function cmp(a,b:point):boolean;
begin
exit((a.x<b.x) or (a.x=b.x) and (a.y<b.y));
end; procedure sortc(l,r:longint);
var i,j,x:longint;
begin
i:=l;
j:=r;
x:=c[(l+r) shr ];
repeat
while c[i]<x do inc(i);
while x<c[j] do dec(j);
if not(i>j) then
begin
swap(c[i],c[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then sortc(l,j);
if i<r then sortc(i,r);
end; procedure sortw(l,r:longint);
var i,j:longint;
x,y:point;
begin
i:=l;
j:=r;
x:=w[(l+r) shr ];
repeat
while cmp(w[i],x) do inc(i);
while cmp(x,w[j]) do dec(j);
if not(i>j) then
begin
y:=w[i]; w[i]:=w[j]; w[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if l<j then sortw(l,j);
if i<r then sortw(i,r);
end; procedure sortq(l,r:longint);
var i,j:longint;
x,y:point;
begin
i:=l;
j:=r;
x:=q[(l+r) shr ];
repeat
while cmp(q[i],x) do inc(i);
while cmp(x,q[j]) do dec(j);
if not(i>j) then
begin
y:=q[i]; q[i]:=q[j]; q[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if l<j then sortq(l,j);
if i<r then sortq(i,r);
end; procedure open(x0,x1,y0,y1,z:longint);
begin
inc(x1); inc(y1);
inc(t); w[t].x:=x0; w[t].y:=y0; w[t].id:=; w[t].z:=z;
inc(t); w[t].x:=x0; w[t].y:=y1; w[t].id:=-; w[t].z:=z;
inc(t); w[t].x:=x1; w[t].y:=y0; w[t].id:=-; w[t].z:=z;
inc(t); w[t].x:=x1; w[t].y:=y1; w[t].id:=; w[t].z:=z;
end; procedure work(x,w:longint);
begin
while x<=n+ do
begin
if not v[x] then
begin
v[x]:=true;
inc(tot);
st[tot]:=x;
end;
d[x]:=d[x]+w;
x:=x+lowbit(x);
end;
end; function ask(x:longint):longint;
begin
ask:=;
while x> do
begin
ask:=ask+d[x];
x:=x-lowbit(x);
end;
end; procedure cdq(opx,opy,qx,qy,l,r:longint);
var m,t,i,j,s,f1,f2,z,q1,q2:longint;
begin
if (l>r) or (qx>qy) then exit;
if l=r then
begin
for i:=qx to qy do
ans[q[i].id]:=c[l];
exit;
end;
m:=(l+r) shr ; //二分答案
t:=;
for i:=opx to opy do
if w[i].z<=c[m] then
begin
inc(t);
tw[t]:=w[i];
end; z:=;
j:=;
for i:=qx to qy do
begin
can[i]:=false;
while (j<=t) and (tw[j].x<=q[i].x) do //扫描询问
begin
work(tw[j].y,tw[j].id);
inc(j);
end;
s:=ask(q[i].y);
if s>=q[i].z then
begin
ans[q[i].id]:=c[m];
inc(z);
can[i]:=true;
end
else q[i].z:=q[i].z-s;
end;
f1:=opx-; f2:=opx+t-; //划分操作区间
for i:=opx to opy do
if w[i].z<=c[m] then
begin
inc(f1);
tw[f1]:=w[i];
end
else begin
inc(f2);
tw[f2]:=w[i];
end;
for i:=opx to opy do
w[i]:=tw[i];
q1:=qx-; q2:=qx+z-;
for i:=qx to qy do
if can[i] then
begin
inc(q1);
tw[q1]:=q[i];
end
else begin
inc(q2);
tw[q2]:=q[i];
end;
for i:=qx to qy do
q[i]:=tw[i];
for i:= to tot do
begin
s:=st[i];
v[s]:=false;
d[s]:=;
end;
tot:=;
cdq(opx,f1,qx,q1,l,m);
cdq(f1+,opy,q1+,qy,m+,r);
end; begin
readln(n,m,k);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
dfs();
for j:= to trunc(ln(n)/ln())+ do
for i:= to n do
begin
x:=anc[i,j-];
anc[i,j]:=anc[x,j-];
end; t:=;
for i:= to m do
begin
readln(x,y,z);
if a[x]>a[y] then swap(x,y);
if a[y]<=b[x] then
begin
xx:=jump(y,dep[x]+);
if a[xx]<> then open(,a[xx]-,a[y],b[y],z);
if b[xx]<n then open(a[y],b[y],b[xx]+,n,z);
end
else open(a[x],b[x],a[y],b[y],z);
c[i]:=z;
end;
sortc(,m);
sortw(,t);
for i:= to k do
begin
readln(x,y,z);
if a[x]>a[y] then swap(x,y);
q[i].x:=a[x]; q[i].y:=a[y]; q[i].id:=i; q[i].z:=z;
end;
sortq(,k);
cdq(,t,,k,,m);
for i:= to k do
writeln(ans[i]);
end.
bzoj4009的更多相关文章
- 【BZOJ4009】接水果(整体二分,扫描线)
[BZOJ4009]接水果(整体二分,扫描线) 题面 为什么这都是权限题???,洛谷真良心 题解 看到这道题,感觉就是主席树/整体二分之类的东西 (因为要求第\(k\)大) 但是,读完题目之后,我们发 ...
- 【bzoj4009 hnoi2015】接水果
题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...
- 【bzoj4009】 HNOI2015—接水果
http://www.lydsy.com/JudgeOnline/problem.php?id=4009 (题目链接) 题意 给出一颗无根树.有一些路径记为$P_i$,这些路径有两个端点和一个权值$W ...
- [BZOJ4009][HNOI2015]接水果(整体二分)
[HNOI2015]接水果 时间限制:60s 空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...
- 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
[BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...
- BZOJ4009: [HNOI2015]接水果
4009: [HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她 ...
- 2018.10.02 bzoj4009: [HNOI2015]接水果(整体二分)
传送门 整体二分好题. 考虑水果被盘子接住的条件. 不妨设水果表示的路径为(x1,y1)(x_1,y_1)(x1,y1),盘子表示的为(x2,y2)(x_2,y_2)(x2,y2) 不妨设df ...
- [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组
Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...
- BZOJ4009 & 洛谷3242 & LOJ2113:[HNOI2015]接水果——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4009 https://www.luogu.org/problemnew/show/P3242 ht ...
随机推荐
- PHP随机生成广告图片的实例 代码
PHP随机生成广告图片: <?php /* +------------------------------------------------------------------+ | Mi ...
- Mysql 存储过程小例子
创建存储过程: DELIMITER $$ USE `database_name`$$ DROP PROCEDURE IF EXISTS `add_or_update_user`$$ )) BEGIN ...
- python基础教程笔记—即时标记(详解)
最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...
- 奖学金评分系统(系统分析与设计版与Delphi实现代码)
一.系统规划 1.1 项目背景介绍 在奖学金评比过程中,学生综合测评是学校普遍采用的评比手段.对学生实施综合素质测评的目的在于正确评价学生的综合素质,为评奖学金提供依据,实现学生教育管理工作的标准化. ...
- OO之观察者模式
以下为观察者模式详解: 引子: 假设有这样一个问题,有一条河经过一个山谷,山谷下有一个村庄,人们在山谷处修建了一个水库,并安排专人管理,当水库的水位过高时要通知下游居民注意水库的开闸放水,当水库的水温 ...
- nodejs read/write file
fs.readFile('c:\\tmp\\helloworld.txt','utf8',function(err,data){console.log(data);}) var token=fs.re ...
- Qt编译postgreSQL驱动
安装postgreSQL,安装目录下的lib和bin添加到path 打开Qt安装目录,找到src\plugins\sqldrivers\psql编辑psql.pro,添加INCLUDEPATH += ...
- Mac - 更新 Ruby
因为准备在项目中使用bootstrap,在安装bootstrap过程中提示需要Ruby的版本在1.9.2以上,而目前使用的Ruby版本是Mac系统自带的1.8.7.所以需要对Ruby进行升级.这里使用 ...
- Java发送邮件(带附件)
实现java发送邮件的过程大体有以下几步: 准备一个properties文件,该文件中存放SMTP服务器地址等参数. 利用properties创建一个Session对象 利用Session创建Mess ...
- memcached 在window下的安装与使用
memcached搭建缓存系统 一.概念 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 二 ...