题目链接 BZOJ

洛谷

每个国家的答案可以二分+求前缀和,于是可以想到整体二分。

在每次Solve()中要更新所有国家得到的值,不同位置的空间站对应不同国家比较麻烦。

注意到每次Solve()其国家数是与区间大小相关的,so根据国家处理,区间更新空间站的值,用vector枚举对应空间站得到每个国家的值。(or边表)

//20048kb	11292ms
//1316ms 24.8MB
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define lb(x) (x&-x)
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=3e5+5,INF=1e9; int n,m,K,A[N],Ans[N],q[N],q1[N],q2[N];
std::vector<int> v[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read();
struct Operation
{
int l,r,v;
inline void Input(){
l=read(),r=read(),v=read();
}
}op[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
namespace T//区间修改 单点查询
{
int n;
LL t[N]; inline void Modify(int p,int v){
while(p<=n) t[p]+=v, p+=lb(p);
}
inline void Modify_Range(int l,int r,int v)
{
Modify(l,v), Modify(r+1,-v);
if(l>r) Modify(1,v);//Modify(n+1,-v)
}
inline void Clear(int p)
{
for(; p<=n; p+=lb(p))
if(t[p]) t[p]=0; else break;
}
inline void Clear_Range(int l,int r)
{
Clear(l), Clear(r+1);//不能少啊
if(l>r) Clear(1);
}
inline LL Query(int p)
{
LL res=0; while(p) res+=t[p], p^=lb(p);
return res;
}
}
void Solve(int l,int r,int h,int t)
{
if(h>t) return;
if(l==r){
for(int i=h; i<=t; ++i) Ans[q[i]]=l;
return;
}
int mid=l+r>>1, t1=0, t2=0;
for(int i=l; i<=mid; ++i) T::Modify_Range(op[i].l,op[i].r,op[i].v);
for(int i=h,now=q[i]; i<=t; now=q[++i])//now:may be q[n+1]
{
LL tmp=0;
for(int j=0,lim=v[now].size(); j<lim; ++j)
if((tmp+=T::Query(v[now][j]))>=A[now]) break;//tmp可能爆longlong。。不过也是个剪枝。
if(tmp>=A[now]) q1[t1++]=now;
else A[now]-=tmp, q2[t2++]=now;
}
for(int i=l; i<=mid; ++i) T::Clear_Range(op[i].l,op[i].r);//T::Modify_Range(op[i].l,op[i].r,-op[i].v);
//T::Clear(op[i].l), T::Clear(op[i].r);//T::Clear(std::min(op[i].l,op[i].r));//因为有l>r的情况,所以要清空的位置比较麻烦。。这一行的两种都是错的。(而且应是r+1)
for(int i=0; i<t1; ++i) q[h+i]=q1[i];
for(int i=0; i<t2; ++i) q[h+t1+i]=q2[i];
Solve(l,mid,h,h+t1-1), Solve(mid+1,r,h+t1,t);
} int main()
{
n=read(),T::n=m=read();
for(int i=1; i<=m; ++i) v[read()].push_back(i);
for(int i=1; i<=n; ++i) A[i]=read(), q[i]=i;
K=read();
for(int i=1; i<=K; ++i) op[i].Input();
op[++K]=(Operation){m+1,m+1,0};
Solve(1,K,1,n);
for(int i=1; i<=n; ++i) Ans[i]==K?puts("NIE"):printf("%d\n",Ans[i]); return 0;
}

BZOJ.2527.[POI2011]MET-Meteors(整体二分)的更多相关文章

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

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

  2. BZOJ 2527 [Poi2011]Meteors(整体二分)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2527 [题目大意] 有N个成员国.现在它发现了一颗新的星球, 这颗星球的轨道被分为M份 ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527 题意: 有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站, ...

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

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

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

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

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

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

  7. BZOJ 2527 Meteors | 整体二分

    BZOJ 2527 Meteors 题意 一个圆环上有m个位置,编号为1~m,分别属于n个国家. 有k个时刻,每个时刻都会给圆环上的一个区间中每个位置的值加上一个数. 每个国家有一个目标,问对于每个国 ...

  8. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

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

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

随机推荐

  1. win10定时关机

    CMD  输入shutdown -s -t 7200这个命令,大家可以自已设置7200这个时间,自己算一下60分钟=3600秒:

  2. asp.net mvc 本地化 默认的错误提示

    System.ComponentModel.DataAnnotations 给我们提供了一些特性来直接对model的属性进行验证和约束, 同时也提供了 ErrorMessageResourceName ...

  3. C# LINQ语句

    1.select 和 selectMany SelectMany() 将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值 2.join语句 from x in xx join d in ...

  4. 一张图来帮你理解 SOA

    SOA 曾经一度是技术领域中最难以理解的一个概念.SOA 似乎让很多人感到困惑 - 一般来讲这是由于人们认为它拥有几乎神奇的力量.事实上 SOA 只是一个很简单的概念:SOA 由诸如 C++ 和 Ja ...

  5. 关于ARM指令那些你必须知道的东西

    1.32位ARM指令每一位都有其作用,具体如下: 低12为第二操作数, 12~15位为目的寄存器, 16~19位为第一操作数, 20~27就是操作码, 28~31就是条件域. 2.多寄存器load和s ...

  6. Excel根据单元格内容设置整行颜色

    1. 选择需要设置的区域,条件格式中找到“新建规则” 2. 弹出窗口中选择“使用公式确定要设置格式的单元格”一项.填写公式如下: =IF(OR($D1="已完成",$D1=&quo ...

  7. 一个带bash,带glibc,中国时区,非root用户可运行crond命令的基于alpine镜像的Dockerfile

    这个镜像现在说起来简单, 带bash(增加执行脚本的兼容性,带GLIBC,中国时区,非root用户可运行crond命令-安全) 但让我开始陷入时,真的让我有段时间有点爆了. 比如,将filebeat文 ...

  8. Spark(十二)SparkSQL简单使用

    一.SparkSQL的进化之路 1.0以前:   Shark 1.1.x开始:SparkSQL(只是测试性的)  SQL 1.3.x:          SparkSQL(正式版本)+Datafram ...

  9. Java语法知识总结

    一:java概述: 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名为Java: ...

  10. 【LOJ】#2040. 「SHOI2015」零件组装机

    题解 我写的应该有bug但是我懒得改了 就是最后一次合并的n要么是0点边集的最后一条边,要么是0点边集最后两条边的差,我们分别拎出来判断一下哪个可行(也许两个都可行,但是我不想多做修改了--) 然后递 ...