bzoj 2527: [Poi2011]Meteors
昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的。
(这里n,m,k我就不区分了)
首先一个城市的询问可以很容易的二分
check用树状数组维护区间(区间修改,单点查询的那种)
一次是\(O(nlog^2n)\)
n次就是\(O(n^2log^2n)\)
但是我们check的时候都是树状数组维护,询问相同
我们就可以整体二分(顾名思义)
把区间考虑成二叉树(类似线段树的形状)
我们每一层用一遍树状数组
查询的话,一个国家用一个链表存下所在的点
因为深度是\(logn\)的
复杂度是还是差不多的\((Onlog^2n)\)
妙啊
会炸long long 及时break就好
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <utility>
#include <vector>
#define ll long long
using namespace std;
const int N = 5e5+7;
int read() {
int x = 0,f = 1;char s = getchar();
for(; s > '9'||s < '0'; s = getchar()) if(s == '-') f = -1;
for(; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int n, m, k;
int L[N], R[N], w[N], need[N], ans[N];
pair<int,int> erfen[N];
vector<int> hav[N];
namespace BIT {
ll sum[N];
void add(int id, ll ad) {for(int i = id; i <= m; i += (i&-i)) sum[i] += ad;}
ll query(int id) {ll ans = 0;for(int i = id; i >= 1;i -= (i&-i)) ans += sum[i]; return ans;}
void modify(int l, int r, ll ad) {add(l, ad), add(r + 1, -ad);}
void clear() {memset(sum, 0, sizeof(sum));}
}
void solve() {
vector<pair<int,int> > Q;
for(int i = 1; i <= n; ++i)
if(erfen[i].first!=k+1&&erfen[i].first <= erfen[i].second)
Q.push_back(make_pair((erfen[i].first+erfen[i].second)>>1,i));
if(Q.empty()) return;
sort(Q.begin(), Q.end());
BIT::clear();
for(int i = 1, js = 0;i <= k; ++ i) {
if(L[i] <= R[i]) BIT::modify(L[i], R[i], (ll)w[i]);
else BIT::modify(L[i], m, w[i]), BIT::modify(1, R[i], (ll)w[i]);
while(js < Q.size() && Q[js].first == i) {
int id = Q[js].second;
ll tmp=0;
for(vector<int>::iterator it = hav[id].begin();it != hav[id].end(); ++it) {
tmp += BIT::query(*it);
if(tmp>=(ll)need[id]) break;
}
if(tmp>=(ll)need[id])
ans[id] = i,erfen[id].second = i - 1;
else
erfen[id].first = i + 1;
++js;
}
}
solve();
}
int main() {
//read
n = read(), m = read();
for(int i = 1; i <= m; ++i) {
int x = read();
hav[x].push_back(i);
}
for(int i = 1; i <= n; ++i) need[i] = read();
k = read();
for(int i = 1; i <= k; ++i) L[i] = read(), R[i] = read(), w[i] = read();
for(int i = 1; i <= n; ++i) erfen[i].first = 1, erfen[i].second = k+1;
//work
solve();
//print
for(int i = 1;i <= n; ++i) {
if(ans[i]) printf("%d\n", ans[i]);
else puts("NIE");
}
return 0;
}
bzoj 2527: [Poi2011]Meteors的更多相关文章
- BZOJ 2527 [Poi2011]Meteors(整体二分)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2527 [题目大意] 有N个成员国.现在它发现了一颗新的星球, 这颗星球的轨道被分为M份 ...
- BZOJ 2527 [Poi2011]Meteors:整体二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527 题意: 有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站, ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- BZOJ.2527.[POI2011]MET-Meteors(整体二分)
题目链接 BZOJ 洛谷 每个国家的答案可以二分+求前缀和,于是可以想到整体二分. 在每次Solve()中要更新所有国家得到的值,不同位置的空间站对应不同国家比较麻烦. 注意到每次Solve()其国家 ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
- BZOJ 2527 Meteors | 整体二分
BZOJ 2527 Meteors 题意 一个圆环上有m个位置,编号为1~m,分别属于n个国家. 有k个时刻,每个时刻都会给圆环上的一个区间中每个位置的值加上一个数. 每个国家有一个目标,问对于每个国 ...
随机推荐
- URL Resources
Prezi 1. 官网 https://prezi.com/ 2. 入门教程 https://wenku.baidu.com/view/9bb234ac0029bd64783e2c6b.htm ...
- 水题 J
一张CT扫描的灰度图像可以用一个N*N(0 < N <= 100)的矩阵描述,矩阵上的每个点对应一个灰度值(整数),其取值范围是0-255.我们假设给定的图像中有且只有一个肿瘤.在图上监测 ...
- 类模板中的static关键字
特性: 1.从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员 2. 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定 ...
- uva 1416 Warfare And Logistics
题意: 给出一个无向图,定义这个无向图的花费是 其中path(i,j),是i到j的最短路. 去掉其中一条边之后,花费为c’,问c’ – c的最大值,输出c和c’. 思路: 枚举每条边,每次把这条边去掉 ...
- 【Hadoop学习之十三】MapReduce案例分析五-ItemCF
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 推荐系统——协同过滤(Collab ...
- ubuntu14.04 cpu-ssd
1. ssd-caffe部署 五年半前老笔记本,没有GPU(其实有,AMD的,不能装CUDA),之前装过CPU版的Caffe 新建一个目录,然后参考网上步骤 sudo git clone https: ...
- tensorflow学习6
g_w1 = tf.get_variable('g_w1', [z_dim, 3136], dtype=tf.float32, initializer=tf.truncated_normal_init ...
- 以太坊智能合约介绍,Solidity介绍
以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...
- js中利用cookie实现记住密码功能
在登录界面添加记住密码功能,代码如下: //设置cookie var passKey = '4c05c54d952b11e691d76c0b843ea7f9'; function setCookie( ...
- HTTP接口-跨域-callback
1.客户端和正常调用非跨域接口一样2.服务端返回的时候用callback+(返回值)的方式返回结果. callback为客户端的隐藏参数.public String converJsonResultS ...