这是一道神题,首先我们不难先到整体二分吧

下面的问题就是,求出对于每个水果,有多少盘子是他的子路径

直接考虑不是很容易,我们换个思路,考虑对于每个盘子,哪些水果能包含它

我们假设盘子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的更多相关文章

  1. 【BZOJ4009】接水果(整体二分,扫描线)

    [BZOJ4009]接水果(整体二分,扫描线) 题面 为什么这都是权限题???,洛谷真良心 题解 看到这道题,感觉就是主席树/整体二分之类的东西 (因为要求第\(k\)大) 但是,读完题目之后,我们发 ...

  2. 【bzoj4009 hnoi2015】接水果

    题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...

  3. 【bzoj4009】 HNOI2015—接水果

    http://www.lydsy.com/JudgeOnline/problem.php?id=4009 (题目链接) 题意 给出一颗无根树.有一些路径记为$P_i$,这些路径有两个端点和一个权值$W ...

  4. [BZOJ4009][HNOI2015]接水果(整体二分)

    [HNOI2015]接水果 时间限制:60s      空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...

  5. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

  6. BZOJ4009: [HNOI2015]接水果

    4009: [HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black,  她 ...

  7. 2018.10.02 bzoj4009: [HNOI2015]接水果(整体二分)

    传送门 整体二分好题. 考虑水果被盘子接住的条件. 不妨设水果表示的路径为(x1,y1)(x_1,y_1)(x1​,y1​),盘子表示的为(x2,y2)(x_2,y_2)(x2​,y2​) 不妨设df ...

  8. [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组

    Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...

  9. BZOJ4009 & 洛谷3242 & LOJ2113:[HNOI2015]接水果——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4009 https://www.luogu.org/problemnew/show/P3242 ht ...

随机推荐

  1. 多线程的单元测试工具 - GroboUtils

    写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自 ...

  2. EXTJS 4.2 资料 Grid嵌套

    如图: var ParentContCateId = 0; var start = 0; var limit = 20; DistributionPointForm = function () { E ...

  3. Unity3D中Ragdoll的用法

    一.创建Ragdoll      见unity3d组件文档里的Ragdoll Wizard.由于unity3d中的Ragdoll设置的骨骼点名字与3DMAX里人体骨骼命名有些不一样,下图为Unity3 ...

  4. Hadoop的安装与配置说明

    安装hadoop是一件非常容易的事情,读者可以在官网上下载到最近的几个hadoop版本.网址为http://apache.etoak.com//hadoop/core/.   目前,hadoop可以运 ...

  5. centos7安装mplayer以及出现的各种问题

    首先,centos7默认的视频播放器基本不能用,这里我们选择mplayer作为视频播放器. 安装的过程,痛并快乐着....... 首先我们去mplayer的官网下载需要的文件,http://www.m ...

  6. 严重: The web application [] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it.

    今日在重新部署项目时出现此问题,虽然对项目无影响,但问题就是问题.完整信息如下(使用idea工具): 十二月 05, 2015 11:44:27 上午 org.apache.catalina.star ...

  7. 获取属性名:PropertyNameHelper

    获取属性名:PropertyNameHelper namespace NCS.Infrastructure.Querying { public static class PropertyNameHel ...

  8. spoj 368

    额   最小生成树 ........ #include <cstdio> #include <cstring> #include <algorithm> using ...

  9. robots.txt协议-互联网robots搜索规范

    最近在看搜索爬虫相关的,挺有趣的,记录一些信息备用. robots.txt官方说明网站 http://www.robotstxt.org/ robots.txt原则 Robots协议是国际互联网界通行 ...

  10. shell中截取字符串的方法总结

    shell中截取字符串的方法有很多种, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...