BZOJ 2527 Meteors

题意

一个圆环上有m个位置,编号为1~m,分别属于n个国家。

有k个时刻,每个时刻都会给圆环上的一个区间中每个位置的值加上一个数。

每个国家有一个目标,问对于每个国家,哪个时刻它拥有的每个位置的数值之和会达到它的目标。

题解

这道题也是一道整体二分题。二分到达目标的时间mid,将l~mid的每个修改操作在树状数组中执行,然后看每个当前询问集合中的国家是否达到了目标,达到的放左边,没达到的放右边。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <complex>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 300005, INF = 0x3f3f3f3f;
int n, m, K, adj[N], nxt[N], buf1[N], buf2[N], seq[N], ans[N], L[N], R[N], A[N], vis[N], times;
ll tr[N], tar[N];
void single_add(int p, ll x){
while(p <= m){
if(vis[p] != times) vis[p] = times, tr[p] = 0;
tr[p] += x, p += p & -p;
}
}
void add(int l, int r, ll x){
if(l <= r) single_add(l, x), single_add(r + 1, -x);
else add(l, m, x), add(1, r, x);
}
ll ask(int p){
ll ret = 0;
for(; p; p -= p & -p)
if(vis[p] == times)
ret += tr[p];
return ret;
}
void solve(int ql, int qr, int l, int r){
if(ql > qr) return;
if(l == r){
for(int i = ql; i <= qr; i++)
ans[seq[i]] = l;
return;
}
++times;
int mid = (l + r) >> 1, p1 = 0, p2 = 0;
for(int i = l; i <= mid; i++)
add(L[i], R[i], A[i]);
for(int i = ql; i <= qr; i++){
ll sum = 0;
for(int j = adj[seq[i]]; j && sum < tar[seq[i]]; j = nxt[j])
sum += ask(j);
if(sum >= tar[seq[i]]) buf1[++p1] = seq[i];
else tar[seq[i]] -= sum, buf2[++p2] = seq[i];
}
for(int i = 1; i <= p1; i++) seq[ql - 1 + i] = buf1[i];
for(int i = 1; i <= p2; i++) seq[ql + p1 - 1 + i] = buf2[i];
solve(ql, ql + p1 - 1, l, mid);
solve(ql + p1, qr, mid + 1, r);
}
int main(){
read(n), read(m);
for(int i = 1, t; i <= m; i++)
read(t), nxt[i] = adj[t], adj[t] = i;
for(int i = 1; i <= n; i++)
read(tar[i]);
read(K);
for(int i = 1; i <= K; i++)
read(L[i]), read(R[i]), read(A[i]);
L[++K] = 1, R[K] = m, A[K] = INF;
for(int i = 1; i <= n; i++) seq[i] = i;
solve(1, n, 1, K);
for(int i = 1; i <= n; i++)
if(ans[i] == K) puts("NIE");
else write(ans[i]), enter;
return 0;
}

BZOJ 2527 Meteors | 整体二分的更多相关文章

  1. bzoj 2527 Meteors - 整体二分 - 树状数组

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  2. BZOJ 2527 Meteors

    http://www.lydsy.com/JudgeOnline/problem.php?id=2527 思路:整体二分 #include<cstdio> #include<cmat ...

  3. bzoj 2527: [Poi2011]Meteors 整体二分

    给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...

  4. 2527: [Poi2011]Meteors[整体二分]

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1528  Solved: 556 [Submit][S ...

  5. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  6. 【BZOJ2527】[Poi2011]Meteors 整体二分

    [BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  7. 【BZOJ2527】【POI2011】Meteors [整体二分]

    Meteors Time Limit: 60 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这个星球经常会下陨石雨.BI ...

  8. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  9. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

随机推荐

  1. ES6的promise函数用法讲解

    总结:Promise函数的出现极大的解决了Js中的异步调用代码逻辑编写太过复杂的问题,Promise对象让异步调用函数的流程显得更加的优雅,也更容易编写. 举例: 1. 异步调用: 假设现在我的一个页 ...

  2. K-SVD字典学习及其实现(Python)

    算法思想 算法求解思路为交替迭代的进行稀疏编码和字典更新两个步骤. K-SVD在构建字典步骤中,K-SVD不仅仅将原子依次更新,对于原子对应的稀疏矩阵中行向量也依次进行了修正. 不像MOP,K-SVD ...

  3. Netty源码分析第4章(pipeline)---->第5节: 传播outbound事件

    Netty源码分析第五章: pipeline 第五节: 传播outBound事件 了解了inbound事件的传播过程, 对于学习outbound事件传输的流程, 也不会太困难 在我们业务代码中, 有可 ...

  4. could not launch process: decoding dwarf section info at offset 0x0: too short

    Fabric调试异常 作者在使用chaincode进行智能合约开发的过程中,使用Goland + Golang + win10_X64作为开发环境: GoLand 2018.1.4 Build #GO ...

  5. python-五行红旗实现

    import turtle """ 绘制五星红旗 作者:zxj 版本:1.0 """ # 绘制矩形函数 def giant(leg,hig) ...

  6. 比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab

    简介 语义分割:给图像的每个像素点标注类别.通常认为这个类别与邻近像素类别有关,同时也和这个像素点归属的整体类别有关.利用图像分类的网络结构,可以利用不同层次的特征向量来满足判定需求.现有算法的主要区 ...

  7. ubuntu16.04 CUDA, CUDNN 安装

    这次介绍的是使用 tensorflow1.8, cuda9.0, cudnn7.0的版本 https://developer.nvidia.com/cuda-90-download-archive 下 ...

  8. 笔试题——C++开发简单记录错误模块

    题目:链接:https://www.nowcoder.com/questionTerminal/67df1d7889cf4c529576383c2e647c48 来源:牛客网 解析及代码来源:http ...

  9. dvwa——sql手动注入和sqlmap自动注入

    手动注入 low: 源码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; ...

  10. Vue.js 相关知识(基础)

    1. Vue.js 介绍 Vue,读音 /vjuː/,类似于 view),是一套用于构建用户界面的渐进式框架(重点在于视图层). 作者:尤雨溪 注:学习 vue.js 时,一定要抛弃 jQuery 的 ...