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

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

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

我们假设盘子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. 服务器迁移之debian重新配置Web服务的细节

    之前配置Linux服务器时采用的是Debian系统一直很稳定,这次准备迁移到新的服务器环境上,好在以前的配置我在博客都做了备忘,所以很容易就搞定了,这次服务系统采用的是最新的Debian 7.0,但是 ...

  2. 手机淘宝用JS来动态写meta标签(1像素边框处理方法)

    var metaEl = doc.createElement('meta'); var scale = isRetina ? 0.5:1; metaEl.setAttribute('name', 'v ...

  3. mongodb命令使用

    最近学习mongodb的使用,整理了一些常用命令 windows服务安装:mongod --install --serviceName MongoDB --serviceDisplayName Mon ...

  4. 关于Simple.Data.PostgreSql的ExecuteReader没实现非常坑爹的问题

    https://github.com/ChrisMH/Simple.Data.PostgreSql/issues/3 github上有个issues...默认从nuget上下载的Simple.Data ...

  5. 拥抱ARM妹子第二季 之 序:我和春天有个约会 - 生命的萌芽

      春姑年轻轻的吻了一下小穆妹纸的额头!从沉睡中苏醒的小穆妹纸,缓缓伸了个懒腰--- 啊-- 睡得真香! 等--等-等-!好像和童话故事里的情节不一样,应该由王子我来亲吻睡梦中的妹纸才能醒!!-- 强 ...

  6. C#网络编程(1)

    1.Purpose 1.什么是网络编程 2.TCP/IP协议 3.什么是套接字 4.多线程深入理解 二.Basic Concept 1.网络编程:主要实现进程(线程)相互之间的通信和基本的网络应用原理 ...

  7. easy ui 表单ajax和from两种提交数据方法

    说明: ①ajax在表单提交时需要将所有表单的控件的数据一一获取并赋值传到后台 ②form在提交时,只要给控件加name属性,在提交时就可以将表单数据提交到后台,不需要一一获取再进行赋值. ajax ...

  8. django开发框架-view & template

    django框架的主要模型是MVT,Model模型,View视图,Template模板,基于基本的HttpRequest方式. django支持的数据库有四种:PostgreSQL,MySQL, Or ...

  9. Telerik_2012_Q3 RadGrid 汉化

    ChineseRadGridLocalizationProvider.cs using System; using System.Collections.Generic; using System.L ...

  10. 《Publish or Perish》——从某种角度来说,我们也算和世界同步了呢。