5308: [Zjoi2018]胖
5308: [Zjoi2018]胖
分析:
题目转化为一个点可以更新多少个点,一个点可以更新的点一定是一个区间,考虑二分左右端点确定这个区间。
设当前点是x,向右二分一个点y,如果x可以更新到y,那么在x~y之间的所有关键点(存在宫殿往这边的点)到y的距离小于x到y的距离,以及y~2*y-x之间的关键点到y的距离小于x到y的距离。
当然一个点可能同时被两个点更新,那么让最靠左的点更新它。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
int Log[N], n, m, k;
LL dis[N];
struct Node {
int p; LL l;
Node() {}
Node(int _p,LL _l) { p = _p, l = _l; }
bool operator < (const Node &A) const { return p < A.p; }
}a[N];
struct ST{
LL f[][N];
void init() {
for (int i = ; i <= k; ++i) f[][i] = a[i].l;
for (int j = ; j <= Log[k]; ++j)
for (int i = ; i + ( << j) - <= k; ++i)
f[j][i] = min(f[j - ][i], f[j - ][i + ( << (j - ))]);
}
LL query(int l,int r) {
l = max(, l), r = min(r, n);
l = lower_bound(a + , a + k + , Node(l, )) - a;
r = upper_bound(a + , a + k + , Node(r, )) - a - ;
if (l > r) return 1e18;
int k = Log[r - l + ];
return min(f[k][l], f[k][r - ( << k) + ]);
}
}L, R; bool check1(int x,int y) { // [2 * y - x + 1, y, x]
if (x == y) return true;
LL a = L.query( * y - x + , y) + dis[y];
LL b = R.query(y, x - ) - dis[y];
LL c = R.query(x, x) - dis[y];
if (a <= c || b <= c) return false;
if ( * y - x >= ) return L.query( * y - x, * y - x) + dis[y] > c; // 如果距离相同,优先给左边的点
return true;
}
int findL(int x) {
int l = , r = x, ans = ;
while (l <= r) {
int mid = (l + r) >> ;
if (check1(x, mid)) r = mid - , ans = mid;
else l = mid + ;
}
return ans;
}
bool check2(int x,int y) { // [x, y, 2 * y - x - 1]
if (x == y) return true;
LL a = L.query(x + , y) + dis[y];
LL b = R.query(y, * y - x - ) - dis[y];
LL c = L.query(x, x) + dis[y];
if (a <= c || b <= c) return false;
if ( * y - x <= n) return R.query( * y - x, * y - x) - dis[y] >= c;
return true;
}
int findR(int x) {
int l = x, r = n, ans = ;
while (l <= r) {
int mid = (l + r) >> ;
if (check2(x, mid)) l = mid + , ans = mid;
else r = mid - ;
}
return ans;
}
int main() {
n = read(), m = read();
for (int i = ; i <= n; ++i) Log[i] = Log[i >> ] + ;
for (int i = ; i <= n; ++i) dis[i] = dis[i - ] + read();
while (m --) {
LL ans = ;
k = read();
for (int i = ; i <= k; ++i) a[i].p = read(), a[i].l = read();
sort(a + , a + k + );
for (int i = ; i <= k; ++i) a[i].l -= dis[a[i].p]; L.init();
for (int i = ; i <= k; ++i) a[i].l += dis[a[i].p] * ; R.init();
for (int i = ; i <= k; ++i) ans += findR(a[i].p) - findL(a[i].p) + ;
printf("%lld\n", ans);
}
return ;
}
5308: [Zjoi2018]胖的更多相关文章
- bzoj 5308: [Zjoi2018]胖
Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...
- 【BZOJ5308】[ZJOI2018]胖(模拟,ST表,二分)
[BZOJ5308][ZJOI2018]胖(模拟,ST表,二分) 题面 BZOJ 洛谷 题解 首先发现每条\(0\)出发的边都一定会更新到底下的一段区间的点. 考虑存在一条\(0\rightarrow ...
- P4501 [ZJOI2018]胖
题目 P4501 [ZJOI2018]胖 官方口中的送分题 做法 我们通过手玩(脑补),\(a_i\)所作的贡献(能更新的点)为:在\(a_i\)更新\(\forall x\)更新前前没有其他点能把\ ...
- BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表
题目链接 LOJ 2529 BZOJ 5308 题解 这么简单的题 为什么考场上我完全想不清楚 = = 对于k个关键点中的每一个关键点\(a\),二分它能一度成为哪些点的最短路起点(显然这些点在一段包 ...
- [ZJOI2018]胖
嘟嘟嘟 都说这题是送分题,但我怎么就不觉得的呢. 看来我还是太弱了啊-- 大体思路就是对于每一个设计方案,答案就是每一个关键点能更新的点的数量之和. 关键在于怎么求一个关键点能更新那些点. 首先这些点 ...
- zjoi[ZJOI2018]胖
题解: 因为n,m很大 所以复杂度应该是和m相关的 考虑到每个点的影响区间是连续的 就很简单了 区间查询最小值线段树维护(st表也可以) 然后注意一下不要重复算一个就可以了 max函数用templat ...
- ZJOI2018 胖 二分 ST表
原文链接https://www.cnblogs.com/zhouzhendong/p/ZJOI2018Day2T2.html 题目传送门 - BZOJ5308 题目传送门 - LOJ2529 题目传送 ...
- 2019.03.04 bzoj5308: [Zjoi2018]胖(二分答案+st表)
传送门 想题5分钟调题两小时系列 其实还是我tcl 读完题之后自然会知道一个关键点能够更新的点是一段连续的区间,于是我们对于每个点能到的左右区间二分答案,用ststst表维护一下查询即可. 代码: # ...
- BZOJ5308 ZJOI2018胖
贝尔福特曼(?)的方式相当于每次将所有与源点直接相连的点的影响区域向两边各扩展一格.显然每个点在过程中最多更新其他点一次且这些点构成一段连续区间.这个东西二分st表查一下就可以了.注意某一轮中两点都更 ...
随机推荐
- Python项目生成requirements.txt的多种方式
我相信任何软件程序都会有依赖的类库,尤其现在开源如此的火爆,因为一个项目可能会有无很多的依赖的包 这个时候难道我们都要一个一个的去找到安装吗?即使你找到了依赖的包 但是呢模块的版本又有很多难道你都要装 ...
- Virtual PC局域网共享速度慢的解决半法。转
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DisableTaskOffload 新建字符串,名:DisableTaskOffloa ...
- September 28th 2017 Week 39th Thursday
Every saint has a past and every sinner has a future. 圣人皆有过去,罪人皆有未来. If you were a sinner in the pas ...
- 张高兴的 Windows 10 IoT 开发笔记:FM 电台模块 KT0803L
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...
- 【洛谷】【treap/堆】P2073 送花
[题目描述:] 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地向里面添加花.他有以下几种操作: 操作 含义 1 W C 添加一朵美丽值为W,价格为C的花. 3 小 ...
- Java基础加强之并发(四)synchronized关键字
并发系列参考文章http://www.cnblogs.com/skywang12345/p/3323085.html#3907193 synchronized原理 在java中,每一个对象有且仅有一个 ...
- Day5 JavaScript(三)事件、表单验证以及初识jQuery
事件 1)鼠标事件 mousedown mouseup 2)键盘事件 a) keydown:键被按下 b) keyup:键抬起 c) keypress:按下可打印字符的键时. document.onk ...
- 记一次爬虫经历(友话APP的Web端)
背景:学校为迎接新生举办了一个活动,在友话APP的校园圈子内发布动态即可参与活动,最终抽取数名同学赠送福利. 分析:动态的数量会随着迎新的开始逐渐增加,人工统计显然不现实,因此可以使用爬虫脚本在友话A ...
- js中css样式兼容各个浏览器写法
在实际业务中往往需要在js中对dom添加一些样式,还需要对各个浏览器厂商的兼顾,看到一位大神写的一个方法很赞,做一个笔记 function prefixStyle(style){ var eleSty ...
- vs未能正确加载XXX包,编译时停止工作问题
出现这个问题的原因可能是配置更改或安装了另一个扩展,幸好之前用的不多,重新进行用户配置代价也不高,打开Visual Studio Tools: 选择VS2013 开发人员命令提示: 输入deven ...