关于矩形与点其实有两种关系。

一种是每个矩形包含多少点。一种是每个点被多少矩形包含。


解:因为可以离线所以直接套整体二分。关键是考虑如何能够被覆盖。

我一开始都是想的树上操作...其实是转化成DFS序。分链和有lca两种情况。

考虑每个盘子能接住的水果,两端DFS序满足的性质。发现是二维平面上的矩形。

一个水果就是询问一个点被多少矩形覆盖(能被多少盘子接)。于是整体二分里面扫描线,片改点查用树状数组。

 #include <bits/stdc++.h>

 const int N = ;

 struct Edge {
int nex, v;
}edge[N << ]; int tp; int e[N], pos[N], ed[N], num, n, fa[N][], pw[N], d[N]; /// tree
int X[N], xx, ans[N]; struct Node {
int id, x, y, k, z;
Node(int ID = , int X = , int Y = , int K = , int Z = ) {
id = ID;
x = X;
y = Y;
k = K;
z = Z;
}
inline bool operator <(const Node &w) const {
if(id != w.id) return id < w.id;
return z < w.z;
}
}node[N], t1[N], t2[N], stk[N << ]; namespace ta {
int ta[N];
inline void add(int x, int v) {
for(int i = x; i <= n + ; i += (i & (-i))) {
ta[i] += v;
}
return;
}
inline int ask(int x) {
int ans = ;
for(int i = x; i >= ; i -= (i & (-i))) {
ans += ta[i];
}
return ans;
}
inline void del(int x) {
for(int i = x; i <= n + ; i += (i & (-i))) {
ta[i] = ;
}
return;
}
} inline void add(int x, int y) {
tp++;
edge[tp].v = y;
edge[tp].nex = e[x];
e[x] = tp;
return;
} void DFS(int x, int f) {
pos[x] = ++num;
fa[x][] = f;
d[x] = d[f] + ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(y == f) continue;
DFS(y, x);
}
ed[x] = num;
return;
} inline void prework() {
for(int i = ; i <= n; i++) pw[i] = pw[i >> ] + ;
for(int j = ; j <= pw[n]; j++) {
for(int i = ; i <= n; i++) {
fa[i][j] = fa[fa[i][j - ]][j - ];
}
}
return;
} inline int lca(int x, int y) {
if(d[x] > d[y]) std::swap(x, y);
int t = pw[n];
while(t >= && d[y] > d[x]) {
if(d[fa[y][t]] >= d[x]) {
y = fa[y][t];
}
t--;
}
if(x == y) return x;
t = pw[n];
while(t >= && fa[x][] != fa[y][]) {
if(fa[x][t] != fa[y][t]) {
x = fa[x][t];
y = fa[y][t];
}
t--;
}
return fa[x][];
} inline int getPos(int x, int y) {
int t = pw[n];
while(t >= && fa[y][] != x) {
if(d[fa[y][t]] > d[x]) {
y = fa[y][t];
}
t--;
}
return y;
} void Div(int L, int R, int l, int r) {
if(L > R) return;
if(l == r) {
for(int i = L; i <= R; i++) {
if(node[i].id) ans[node[i].id] = r;
}
return;
} int mid = (l + r) >> , top1 = , top2 = , top = ;
for(int i = L; i <= R; i++) {
int x = node[i].x, y = node[i].y, z = node[i].z;
if(!node[i].id) { /// change | this is a Matrix
if(node[i].k > mid) {
t2[++top2] = node[i];
continue;
}
t1[++top1] = node[i];
if(z) { /// line
stk[++top] = Node(, pos[y], ed[y], , );
stk[++top] = Node(pos[z], pos[y], ed[y], -, );
stk[++top] = Node(pos[y], ed[z] + , n, , );
stk[++top] = Node(ed[y] + , ed[z] + , n, -, );
}
else { /// lca
stk[++top] = Node(pos[x], pos[y], ed[y], , );
stk[++top] = Node(ed[x] + , pos[y], ed[y], -, );
}
}
else { /// ask | this is a Point
stk[++top] = Node(pos[x], , pos[y], i, );
}
}
std::sort(stk + , stk + top + );
for(int i = ; i <= top; i++) {
if(stk[i].z == ) { /// change
ta::add(stk[i].x, stk[i].k);
ta::add(stk[i].y + , -stk[i].k);
}
else { /// ask
int t = ta::ask(stk[i].y), id = stk[i].k;
if(node[id].k <= t) {
t1[++top1] = node[id];
}
else {
node[id].k -= t;
t2[++top2] = node[id];
}
}
}
for(int i = ; i <= top; i++) { /// clear
if(stk[i].z == ) {
ta::del(stk[i].x);
ta::del(stk[i].y + );
}
}
memcpy(node + L, t1 + , top1 * sizeof(Node));
memcpy(node + L + top1, t2 + , top2 * sizeof(Node));
Div(L, L + top1 - , l, mid);
Div(L + top1, R, mid + , r);
return;
} int main() {
int m, q;
scanf("%d%d%d", &n, &m, &q);
for(int i = , x, y; i < n; i++) {
scanf("%d%d", &x, &y);
add(x, y); add(y, x);
}
DFS(, );
prework();
for(int i = , x, y, z; i <= m; i++) {
scanf("%d%d%d", &x, &y, &X[i]);
if(pos[x] > pos[y]) std::swap(x, y);
z = lca(x, y);
node[i] = Node(, x, y, X[i], (z == x) ? getPos(x, y) : );
}
std::sort(X + , X + n + );
xx = std::unique(X + , X + n + ) - X - ;
for(int i = ; i <= m; i++) {
node[i].k = std::lower_bound(X + , X + xx + , node[i].k) - X;
}
for(int i = , x, y, k; i <= q; i++) {
scanf("%d%d%d", &x, &y, &k);
if(pos[x] > pos[y]) std::swap(x, y);
node[m + i] = Node(i, x, y, k, );
}
Div(, m + q, , xx);
for(int i = ; i <= q; i++) printf("%d\n", X[ans[i]]);
return ;
}

AC代码

洛谷P3242 接水果的更多相关文章

  1. 洛谷P3242 接水果 [HNOI2015] 整体二分

    正解:整体二分+树状数组 解题报告: 传送门! 题目还是大概解释下?虽然其实是看得懂的来着,,, 大概就是说给一棵树.给定一些询问,每个询问都是说在两个点之间的路径上的子路径的第k大是什么 然后看到这 ...

  2. [洛谷P3242] [HNOI2015]接水果

    洛谷题目链接:[HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简 ...

  3. ●洛谷P3242 [HNOI2015]接水果

    题链: https://www.luogu.org/problemnew/show/P3242 题解: 整体二分,扫描线+树状数组. 详细的题解:http://blog.csdn.net/thy_as ...

  4. 洛谷 P3242 [HNOI2015]接水果 解题报告

    P3242 [HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 \(osu!\) 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经\(DT\) \(FC\) 了\(\tt{The\ b ...

  5. 【BZOJ4009_洛谷3242】[HNOI2015] 接水果(整体二分)

    题目: 洛谷 3242 分析: 明确题意:在一棵树上给定若干权值为 \(w\) 的路径 \((u,v)\) (盘子),每次给定 \((a,b)\) (水果),询问所有满足 \((u,v)\) 被 \( ...

  6. BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解

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

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. taro实战1

    npm install -g @tarojs/cli //或 yarn global add @tarojs/cli

  2. Spring boot + mybatis + orcale实战(干货)

    废话少说,直接上步骤: 第一步:安装好IDEA(此处省略) 第二步:在IDEA新建springboot工程 第三步:在springboot工程的pom.xml添加oracle和mybait依赖 < ...

  3. yield send 的一些使用细节

    其实日常中我们使用最多的是 return 很少会使用到 yield 去创造一个生成器.一般就是算算算 算完之后用 return 返回一把. 但是有些情况下 比如需要节约内存不需要一把全部返回,每次使用 ...

  4. admin快速搭建后台管理系统

    一.基于admin后台管理系统的特点: 权限管理:权限管理是后台管理系统必不可少的部分,拥有权限管理,可以赋予用户增删改查表权限(可以分别赋予用户对不同的表有不同的操作权限): 前端样式少:后台管理主 ...

  5. 莫烦theano学习自修第十天【保存神经网络及加载神经网络】

    1. 为何保存神经网络 保存神经网络指的是保存神经网络的权重W及偏置b,权重W,和偏置b本身是一个列表,将这两个列表的值写到列表或者字典的数据结构中,使用pickle的数据结构将列表或者字典写入到文件 ...

  6. js笔记2

    原型:prototype 和 __proto__ prototype 给他即将生成的对象继承下去的属性 prototype: 显式原型,每个function下都有prototype属性,该属性是一个对 ...

  7. Error:Failed to resolve: com.android.support:appcompat-v7

    repositories { maven { url "https://maven.google.com" } } implementation 'com.android.supp ...

  8. JS 强制类型转化

    在Js中, 强制类型转化分为两种情况: 一种是引用类型转化基本类型, 如数组转化成数字:一种是两种不同基本类型之间的转化,如字符串转化为数字.你不能将基本类型转化成引用类型,比如,不可能把数字转化为数 ...

  9. codeforces285B

    Find Marble CodeForces - 285B Petya and Vasya are playing a game. Petya's got n non-transparent glas ...

  10. 双击jar文件运行程序

    Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件.可是,很多朋友遇到一个难题,那就是下载了jar文件以后在Wind ...