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. LeetCode - 492. Construct the Rectangle

    For a web developer, it is very important to know how to design a web page's size. So, given a speci ...

  2. [Python Study Notes]cpu信息

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  3. Python数据分析学习-re正则表达式模块

    正则表达式 为高级的文本模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于 ...

  4. PHP执行Session与前端JS之间的关系

    <?php error_reporting(0); $path = './tmp/'; $sess_name = session_name(); echo $sess_name; $sess_i ...

  5. linux 内核参数优化

    Sysctl命令及linux内核参数调整   一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现.   ...

  6. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  7. 删除表中的所有记录 ID从1开始

    TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作.语法TRUNCATE TABLE nameTRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相 ...

  8. 老男孩Python全栈开发(92天全)视频教程 自学笔记09

    day9课程内容: 乌班图(ubuntu)64位系统 和 VMware 虚拟机安装(官网收费又麻烦,在网上找资源 安装vmware: vm运行(秘钥找度娘)--文件--新建虚拟机--自定义 下一步-- ...

  9. day4(while 、练习题)

    一.while ... else 方法 while else 的作用就是,确定循环正确执行完毕,else里面可以提示完成的情况. 二.练习题 1.编译型语言是编译完之后执行,解释性语言是边编译边执行, ...

  10. Servlet中forward和redirect的区别(转)

    forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response);     red ...