【整体二分】【P3527】 [POI2011]MET-Meteors
Description
有 n 个国家,总共占有一个环,环被分成了 m 段,已知有 k 次流星雨会落在这个环上的一些位置。再给出每个国家目标收集多少流星,对每个国家求出第几次流星雨后可以满足这个国家的目标
Input
第一行是 n,m,意义如上
第二行是 m 个数,第 i 个数 a_i 代表国家 a_i 拥有环上的第 i 段
第三行是 n 个数,代表每个国家的目标
第四行是一个整数 k
下面 k 行每行 3 个数字描述一场流星雨,分别为覆盖区间和区间内每一段都能收到的陨石数目
Output
对每个国家输出一行代表答案,无解输出NIE
Hint
1\leqn,m\leq3\times10^5,其他数字 \leq~10^9
Solution
考虑对于每个国家,我们都可以二分答案然后树状数组统计,但是复杂度太高,我们考虑将所有的国家放在一起二分
具体的,我们二分区间 [l, r],计算 [l,, mid] 中修改(流星雨)对查询(国家)的贡献。然后枚举在当前区间中的所有国家,如果满足目标则下放递归 [l, mid],否则将需求减去前半部分的贡献在下放递归 (mid, r]。我们发现在递归树上的每一层每个国家都恰好对应一条线段,一共有 O(\log k) 层,每层使用树状数组统计贡献的总复杂度是 O(k~\log m),共有 O(n) 个国家,对应 O(m) 个区域,所以总复杂度 \Theta(k~\log m~\log n)。
Code
#include <cstdio>
#include <vector>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#define printtime()
#else
#include <ctime>
#define printtime() printf("Times used = %ld ms\n", clock())
#endif
#define ci const int
#define cl const long long
typedef long long int ll;
namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
}
template <typename T>
inline void qr(T &x) {
char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
}
template <typename T>
inline void ReadDb(T &x) {
char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch = IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = x * 10 + (ch ^ 48), ch = IPT::GetChar();
if (ch == '.') {
ch = IPT::GetChar();
double base = 1;
while ((ch >= '0') && (ch <= '9')) x += (ch ^ 48) * ((base *= 0.1)), ch = IPT::GetChar();
}
if (lst == '-') x = -x;
}
namespace OPT {
char buf[120];
}
template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
int top=0;
do {OPT::buf[++top] = static_cast<char>(x % 10 + '0');} while (x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
}
const int maxn = 300010;
struct Zay {
int l, r, v;
};
Zay sto[maxn];
struct Info {
int p;ll v;
};
int n, m, k;
int MU[maxn], ans[maxn], len[maxn];
ll tree[maxn];
std::vector<int> CU[maxn];
std::vector<Info> down;
inline int lowbit(ci x) {return x & -x;}
void divide(ci, ci, std::vector<Info>&);
void insert(int, ci);
ll query(int);
signed main() {
freopen("1.in", "r", stdin);
qr(n); qr(m);
for (int i = 1, a; i <= m; ++i) {
a = 0; qr(a); CU[a].push_back(i); ++len[a];
}
for (int i = 1; i <= n; ++i) qr(MU[i]);
qr(k);
for (int i = 1; i <= k; ++i) {
qr(sto[i].l); qr(sto[i].r); qr(sto[i].v);
}
for (int i = 1; i <= n; ++i) down.push_back((Info) {i, MU[i]});
divide(1, k, down);
for (int i = 1; i <= n; ++i)
if (ans[i]) qw(ans[i], '\n', true);
else puts("NIE");
printtime();
}
void divide(ci l, ci r, std::vector<Info> &s) {
if (!s.size()) return;
int mid = (l + r) >> 1;
for (int i = l; i <= mid; ++i) {
if (sto[i].l <= sto[i].r) {
insert(sto[i].l, sto[i].v);
insert(sto[i].r + 1, -sto[i].v);
} else {
insert(sto[i].l, sto[i].v);
insert(1, sto[i].v);
insert(sto[i].r + 1, -sto[i].v);
}
}
std::vector<Info> ldown, rdown;
for (auto &i : s) {
ll _tmp = i.v;
for (int j = 0; j < len[i.p]; ++j) {
if ((i.v -= query(CU[i.p][j])) <= 0) {
ldown.push_back((Info){i.p, _tmp});
break;
}
}
printf("QWQ%d %d %d\n", l, r, i.v);
if (i.v > 0) rdown.push_back(i);
}
for (int i = l; i <= mid; ++i) {
if (sto[i].l <= sto[i].r) {
insert(sto[i].l, -sto[i].v);
insert(sto[i].r + 1, sto[i].v);
} else {
insert(sto[i].l, -sto[i].v);
insert(1, -sto[i].v);
insert(sto[i].r + 1, sto[i].v);
}
}
if (l == r) {
for (auto i : ldown) ans[i.p] = mid;
} else {
divide(l, mid, ldown); divide(mid + 1, r, rdown);
}
}
void insert(int x, ci v) {
while (x <= m) {
tree[x] += v;
x += lowbit(x);
}
}
ll query(int x) {
ll _ret = 0;
while (x) {
_ret += tree[x];
x -= lowbit(x);
}
return _ret;
}
【整体二分】【P3527】 [POI2011]MET-Meteors的更多相关文章
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- 洛谷P3527 [POI2011]MET-Meteors [整体二分]
题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)
[bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【BZOJ2527】【POI2011】Meteors [整体二分]
Meteors Time Limit: 60 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这个星球经常会下陨石雨.BI ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...
- 洛谷P3527 MET-Meteors [POI2011] 整体二分
正解:整体二分 解题报告: 传送门! 还有个双倍经验!(明明是一样的题目为什么你们一个紫一个黑啊喂! 这题首先要想到可以二分嘛,然后看到多组询问肯定就整体二分鸭 那就是基本套路啊,发现是区间修改单点查 ...
随机推荐
- JSBridge实现示例
前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 Hybrid APP架构设计思路 marcuswestin/WebViewJavascriptBridge 楔子 本文介绍JSBridge的完整 ...
- oracle和mysql对时间与字符串的转换
1,oracle to_date(#{item.value},'YYYY-MM-DD hh24-mi-ss') to_char(CRERATE_TIME,'YYYY-MM-DD hh24-mi-ss' ...
- OO学习体会与阶段总结(测试与论证)
前言 随着期末的到来,对于面向对象程序设计课程的学习也迎来了尾声.在最后一个月的从课程中,笔者对于面向对象程序规格实现层面的单元测试.正确性论证以及使用UML图描述程序的设计进行了深入的学习.通过 ...
- 08慕课网《进击Node.js基础(一)》事件events
引用events模块中的EventEmitter 事件的监听和发射 相同的事件发射数量有限,可以通过setMaxListeners设置峰值 var EventEmitter = require('ev ...
- HDU 1565 方格取数(1) 轮廓线dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...
- Gradle入门(5):创建二进制发布版本
在创建了一个实用的应用程序之后,我们可能想将其与他人分享.其中一种方式就是创建一个可以从网站上下载的二进制文件. 这篇教程描述了如何创建一个二进制发布版本,满足以下需求: 二进制发布一定不能使用所谓的 ...
- JAVA 对象序列化——Serializable
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...
- 消息队列第一篇:MessageQueue介绍
消息队列有哪些好处或功能: 1.消息可以在断开连接的环境下发送.不需要同时运行正在发送和正在接收的应用程序. 2.使用快捷模式,消息可以非常快地发送.在快捷模式下,消息存储在内存中. 3.对于可恢复的 ...
- Vue.js——60分钟browserify项目模板快速入门
概述 在之前的一系列vue.js文章,我们都是用传统模式引用vue.js以及其他的js文件的,这在开发时会产生一些问题. 首先,这限定了我们的开发模式是基于页面的,而不是基于组件的,组件的所有代码都直 ...
- 基于 Jmeter 的 web 端接口自动化测试平台
简介 基于之前的react+unittest+flask的接口自动化平台开发经验,和趟过的坑,我重新开发了这个接口自动化平台.平台前端采用的antd+dva+umi的antd-pro模板,结合平台业务 ...