题目:洛谷P3527。

题目大意:
n个国家在某星球上建立了m个空间站(一个空间站只属于一个国家),空间站围成一个环。
现在知道要下k天陨石,每天都在一个区间内下,每个点都下同样多的(若r>l,则说明区间是\(1~r和l~m\))。
每个国家有一个目标陨石数。
问每个国家最早在什么时候达到目标陨石数。若下完了还达不到,则输出NIE。
解题思路:
整体二分。
对所有的国家一起二分,用树状数组维护前缀(后缀)。
对于每个答案,将能达到目标的国家和达不到的国家分开,然后继续二分即可。
时间复杂度\(O(n\log^2 n)\)。

线段树被卡常┭┮﹏┭┮

C++ Code:

#include<cstdio>
#include<vector>
#include<cctype>
#define LoveLive long long
const int M=500005,N=300005;
int k,n,m,P[N],q[N],ans[N],now,tmp[N];std::vector<int>a[N];
LoveLive Bit[M];
bool type[N];
inline int readint(){
int c=getchar(),d=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return d;
}
struct stars{
int l,r,s;
}d[N];
inline void add(int i,int a){for(;i<=m;i+=i&-i)Bit[i]+=a;}
inline LoveLive query(int i){LoveLive a=0;for(;i;i-=i&-i)a+=Bit[i];return a;}
inline void update(int tm,int det){
if(d[tm].l<=d[tm].r)add(d[tm].l,det*d[tm].s),add(d[tm].r+1,-det*d[tm].s);else
add(1,det*d[tm].s),add(d[tm].r+1,-det*d[tm].s),add(d[tm].l,det*d[tm].s);
}
void solve(int l,int r,int l1,int l2){
if(l1>l2)return;
if(l==r){
for(int i=l1;i<=l2;++i)ans[q[i]]=l;
return;
}
int mid=l+r>>1;
while(now<mid)update(++now,1);
while(now>mid)update(now--,-1);
int cnt=0;
for(int i=l1;i<=l2;++i){
LoveLive p=0;
int&id=q[i];
for(int j=0,dd=a[id].size();j<dd&&p<P[id];++j)p+=query(a[id][j]);
if(p>=P[id])type[id]=1,++cnt;else
type[id]=0;
}
int t1=l1,t2=l1+cnt;
for(int i=l1;i<=l2;++i)
if(type[q[i]])tmp[t1++]=q[i];else
tmp[t2++]=q[i];
for(int i=l1;i<=l2;++i)q[i]=tmp[i];
solve(l,mid,l1,t1-1);
solve(mid+1,r,t1,l2);
}
int main(){
n=readint(),m=readint();
for(int i=1;i<=m;++i)a[readint()].push_back(i);
for(int i=1;i<=n;++i)P[q[i]=i]=readint();
k=readint()+1;
for(int i=1;i<k;++i){
d[i].l=readint();
d[i].r=readint();
d[i].s=readint();
}
d[k]=(stars){1,m,1e9};
solve(1,k,1,n);
for(int i=1;i<=n;++i)
if(ans[i]<k)printf("%d\n",ans[i]);else puts("NIE");
return 0;
}

[BOI2011]MET-Meteors的更多相关文章

  1. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

  2. [Android Tips] 23. How to fail/stop Gradle task immediately if some conditions are not met

    throw new GradleException("conditions are not met") 参考 How to fail/stop task immediately i ...

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

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

  4. C# signtool error:no certificates were found that met all the given criteria 错误解决方案

    程序运行时报错:signtool error:no certificates were found that met all the given criteria (汉译:符号工具错误:没有找到符合所 ...

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

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

  6. SPOJ Meteors - 可持久化线段树 - 二分法

    Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The plan ...

  7. CH4912 Meteors

    题意 4912 Meteors 0x49「数据结构进阶」练习 描述 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第 ...

  8. (10)The secret to great opportunities? The person you haven't met yet

    https://www.ted.com/talks/tanya_menon_the_secret_to_great_opportunities_the_person_you_haven_t_met_y ...

  9. 【SPOJ METEORS】 Meteors

    http://www.spoj.com/problems/METEORS/ (题目链接) 题意 一个星球上有$m$个空间站排列在一个环形轨道上,每个空间站仅属于一个国家.总共有$K$场流星雨,这些流星 ...

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

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

随机推荐

  1. idea使用lombok

    1.这玩意可以帮助我们自动实现set.get方法,实现过程有两处,只要理解了这两处,对其实际工作如何使用就非常简单了 2.第一点就是编译过程,比如使用gradle build 等编译工具进行编译时,会 ...

  2. [bzoj2662 BeiJing wc2012] 冻结 (分层图+最短路)

    传送门 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„&q ...

  3. 02.OOP面向对象-1.面向对象介绍

    1.面向对象编程介绍 面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世界的系统思维方式,采用基于对象(实体) 的概念建立模型,模 ...

  4. 在 Windows10 系统中安装 Homestead 本地开发环境

    在 windows10 系统中安装 homestead 本地开发环境 在 windows10 环境下安装 homestead 开发环境,网上有很多相关教程其中大多都是 mac 环境,很多大神都是用户的 ...

  5. Tensorflow读取文件到队列文件

    TensorFlow读取二进制文件数据到队列 2016-11-03 09:30:00      0个评论    来源:diligent_321的博客   收藏   我要投稿 TensorFlow是一种 ...

  6. 2、链接数据库+mongodb基础命令行+小demo

    链接数据库并且打印出数据的流程:1.在CMD里面输入 mongod 2.在CMD里面输入 mongo 3.在输入mongodb命令行里面进行操作,首先输入 show dbs 来查看是否能够链接得上库4 ...

  7. 排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)

    排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...

  8. HDU 5167

    范围 内的斐波那契的数不多,求出范围内的数,再暴力枚举即可. #include <iostream> #include <cstdio> #include <algori ...

  9. HBase使用flush命令之后存储的位置

    HBase使用flush命令之后存储的位置 根据系统安装位置的不一样而不一样,当前是在: hadoop fs -ls /apps/hbase/data/data/default/t1 下面: 使用ha ...

  10. GO语言UDP小笔记

    <pre style="margin-top: 0px; margin-bottom: 0px;"><span style=" color:#0000f ...