BZOJ权限题!提供洛谷链接!

sol

昨晚突发奇想去学了一下整体二分。

这道题应该算是整体二分的板子题吧。

整体二分

首先要求可离线,不然还是安心码数据结构吧。

整体二分简单的来讲,就是时间复杂度可以承受一次二分答案却无法承受每个询问都二分答案时(比如说依次二分的复杂度是\(O(n\log{n})\),那么\(Q\)次二分答案就是\(O(Qn\log{n})\)),我们把所有询问一起二分答案。往往会使用一些诸如树状数组之类的辅助工具。

拿这道题来讲

“每个国家最早多少次之后收集到指定数量的陨石?”

那么就二分一个时间\(mid\),然后判断前\(mid\)次之内是否达到了指定数量。

我们把所有国家放在一起做,每次二分出了\(mid\)之后,模拟\(l\)到\(mid\)这一段的陨石(当然是用树状数组统计啦),然后按照“是否已经达到指定数量”把所有国家分成两份。已经完成了的国家向左递归(因为答案可能会更小),没有完成的国家向右递归,同时指定数量\(p\)中减掉已收集的陨石数量即可。

code

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 300005;
#define ll long long
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
int n,m,k,p[N],st[N],ed[N],val[N],ans[N];
struct nation{ll p;int id;}q[N],q1[N],q2[N];
vector<int>a[N];
ll c[N];
void modify(int k,int v){while (k<=m) c[k]+=v,k+=k&-k;}
ll query(int k){ll s=0;while (k) s+=c[k],k-=k&-k;return s;}
void update(int p,int f)
{
if (st[p]<=ed[p])
modify(st[p],val[p]*f),modify(ed[p]+1,-val[p]*f);
else
modify(1,val[p]*f),modify(ed[p]+1,-val[p]*f),modify(st[p],val[p]*f);
}
void solve(int L,int R,int l,int r)//[L,R]是国家区间 [l,r]是二分的答案区间
{
if (L>R) return;
if (l==r)
{
for (int i=L;i<=R;i++)
ans[q[i].id]=l;
return;
}
int mid=l+r>>1;
int t1=0,t2=0;ll temp;
for (int i=l;i<=mid;i++) update(i,1);
for (int i=L;i<=R;i++)
{
temp=0;
for (int j=0,sz=a[q[i].id].size();j<sz;j++)
temp+=query(a[q[i].id][j]);
if (temp>=q[i].p) q1[++t1]=q[i];
else q[i].p-=temp,q2[++t2]=q[i];
}
for (int i=l;i<=mid;i++) update(i,-1);
for (int i=L,j=1;j<=t1;i++,j++) q[i]=q1[j];
for (int i=L+t1,j=1;j<=t2;i++,j++) q[i]=q2[j];
solve(L,L+t1-1,l,mid);solve(L+t1,R,mid+1,r);
}
int main()
{
n=gi();m=gi();
for (int i=1;i<=m;i++) a[gi()].push_back(i);
for (int i=1;i<=n;i++) q[i]=(nation){gi(),i};
k=gi();
for (int i=1;i<=k;i++) st[i]=gi(),ed[i]=gi(),val[i]=gi();
++k;st[k]=1;ed[k]=m;val[k]=1e9;//设置右哨兵保证所有国家都可以完成
solve(1,n,1,k);
for (int i=1;i<=n;i++)
if (ans[i]==k) puts("NIE");
else printf("%d\n",ans[i]);
return 0;
}

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

  1. Luogu-3527 [POI2011]MET-Meteors

    Luogu-3527 [POI2011]MET-Meteors 题面 Luogu-3527 题解 感觉和上一那道题是一个类型的,直接二分答案,用BIT维护区间加(差分)即可 代码 #include&l ...

  2. 「POI2011」Meteors

    「POI2011」Meteors 传送门 整体二分,树状数组实现区间修改单点查询,然后注意修改是在环上的. 参考代码: #include <cstdio> #include <vec ...

  3. Luogu3527 POI2011 Meteors 整体二分、树状数组、差分

    传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...

  4. 【BZOJ】【2527】【POI2011】Meteors

    整体二分+树状数组 整体二分……感谢zyf提供的入门题 简单粗暴的做法:枚举每一个国家,二分他的$w_i$,然后计算……然而这样效率很低…… 整体二分就是:对所有的国家一起进行二分,$w_i$在mid ...

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

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

  6. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  7. BZOJ2527: [Poi2011]Meteors

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

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

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

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

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

随机推荐

  1. [Python Study Notes]psutil模块

    系统性能信息模块psutil psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(CPU,内存,磁盘,网络等)信息,主要应用于系统监控,分析和限制系统资源及进程的管理,它实现了同等 ...

  2. jenkins中使用rsync, scp命令

    jenkins 中使用 rsync 命令 是出现一些错误输出 Host key verification failed. rsync: connection unexpectedly closed ( ...

  3. 4、flask之分页插件的使用、添加后保留原url搜索条件、单例模式

    本篇导航: flask实现分页 添加后保留原url搜索条件 单例模式 一.flask实现分页 1.django项目中写过的分页组件 from urllib.parse import urlencode ...

  4. 企业级数据库监控利器Lepus

    开篇介绍官方网站:http://www.lepus.cc开源企业级数据库监控系统简洁.直观.强大的开源数据库监控系统,MySQL/Oracle/MongoDB/Redis一站式性能监控,让数据库监控更 ...

  5. Java经典编程题50道之四十五

    判断一个整数能被几个9整除. public class Example45 {    public static void main(String[] args) {        f(729);   ...

  6. 消息队列(MQ)入门-activemq,代码级别

    第一种:activemq: 1.从官网下载apache-activemq-5.15.3-bin.zip并解压: 2.启动activemq, CMD--/bin/activemq start ,访问12 ...

  7. Visual Studio 2017 Enterprise 发布 15.3.2 版,附离线安装包下载。

    Visual Studio 2017 Enterprise 更新至 15.3.2 ,本安装包使用微软原版安装文件,配合layout指令全量下载后制作,内置中文语言包,包含 Visual Studio ...

  8. JVM性能监控与故障处理命令汇总(jps、jstat、jinfo、jmap、jhat、jstack)

    给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具才是运用知识处理数据的手段 使用适当的虚拟机监控和分析的工具可以加快我们分析数据.定位解决问题的速度,本文主要介绍了几款服 务器上常用的 ...

  9. Java数字签名——DSA算法

    RSA数字加密算法参考:http://www.cnblogs.com/LexMoon/p/javaRSA.html DSS: 数字签名标准 DSA: 数字签名算法 DSA仅仅包含数字签名 —————— ...

  10. poj Hotel 线段树

    经典线段树的题. 每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度. 由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小: 1.如果当 ...