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. OpenLayer3调用天地图,拖拽后,地图消失的问题[已解决]

    拖拽后,地图直接消失了,而且右上角的坐标变成了NaN,NaN 后来经过测试发现,原来是自己封装有问题,坐标点一定要用parseFloat()转换下,但不清楚为什么页面刚开始加载的时候没有问题,总之能解 ...

  2. 基于Mysql数据库的SSM分页查询

    前言: Hello,本Y又来了,"分页"在我们使用软件的过程中是一个很常见的场景,比如博客园对于每个博主的博客都进行了分页展示.可以简单清晰的展示数据,防止一下子将过多的数据展现给 ...

  3. CentOS时间的查看与修改

    [http://www.centoscn.com/CentOS/help/2014/0805/3430.html] 1.查看.修改Linux时区与时间 一.linux时区的查看与修改 1,查看当前时区 ...

  4. mvc get image 500

    mvc中get图片时报500错误 很奇怪,突然变500错误了,一番查找之后发现原来是因为mimeType重复定义的原因,吐血.. http://stackoverflow.com/questions/ ...

  5. centos/linux下的安装git

    1.下载git wget https://github.com/git/git/archive/v2.14.1.zip 2.安装依赖 sudo yum -y install zlib-devel op ...

  6. 遇见JMS[1] —— activeMQ的简单使用

    1.JMS Java Message Service,提供API,供两个应用程序或者分布式应用之间异步通信,以传送消息. 2.相关概念 提供者:实现JMS规范的消息中间件服务器客户端:发送或接收消息的 ...

  7. Docker mongodb 3.4 分片 一主 一副 一仲 鉴权集群部署.

    非docker部署 为了避免过分冗余,并且在主节点挂了,还能顺利自动提升,所以加入仲裁节点 为什么要用docker部署,因为之前直接在虚拟机启动10个mongod 进程.多线程并发测试的时候,mong ...

  8. 一个逼格很低的appium自动化测试框架

    Github地址: https://github.com/wuranxu 使用说明 1. 安装配置Mongo数据库 下载地址 mongo是用来存放元素定位的,截图如下: 通过case_id区分每个ca ...

  9. Appium疑难杂症

    坑之初体验 在Appium的初体验中,遇到了一些坑坑洼洼.将他们记录下来,以后方便查阅. 1. session大于60秒没接收到命令自动关闭 通过Appium-Python-Client连接到appi ...

  10. 【java学习笔记】反射基础

    一.反射 反射就是在剖析一个类,了解这个类的构造,创建这个类对应的对象. Class 代表字节码的类,代表类的类 Field 代表属性的类 Method 代表方法的类 Constructor 代表构造 ...