思路:整体二分

提交:4次

错因:树状数组开的$int$

题解:

二分操作序列,将仅用$[l,md]$即可满足要求的国家递归到左半边,将仅用$[l,md]$不能满足要求的国家,把他们的要求去掉左半边的贡献,递归到右半边。

具体来说,开一个以空间站为下标的树状数组(把环展成链),区间加单点求和转化为差分和前缀和,依次加入$[l,md]$中的所有操作区间;

然后每个国家枚举自己的所有空间站,计算贡献,判断前$[l,md]$是否满足,来决定向左右递归的方向。

#include<iostream>
#include<cstdio>
using namespace std;
#define ull unsigned long long
#define ll long long
#define R register ll
#define pause (for(R i=1;i<=10000000000;++i))
#define In freopen("NOIPAK++.in","r",stdin)
#define Out freopen("out.out","w",stdout)
namespace Fread {
static char B[<<],*S=B,*D=B;
#ifndef JACK
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
#endif
inline ll g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
if(ch==EOF) return EOF; do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} inline bool isempty(const char& ch) {return (ch<=||ch>=);}
inline void gs(char* s) {
register char ch; while(isempty(ch=getchar()));
do *s++=ch; while(!isempty(ch=getchar()));
}
} using Fread::g; using Fread::gs; namespace Luitaryi {
const int N=3e++;
int n,m,k,lim,ct;
struct node {int fir,rk; ll w;}a[N],tmp[N];
#define fir(u) a[u].fir
int vr[N],nxt[N],LL[N],RR[N],W[N],ans[N];
ll c[N<<];
inline void adde(int u,int v) {vr[++ct]=v,nxt[ct]=fir(u),fir(u)=ct;}
inline int lbt(int x) {return x&-x;}
inline void add(int pos,int inc) {for(;pos<=lim;pos+=lbt(pos)) c[pos]+=inc;}
inline ll query(int pos) { R ret=;
for(;pos;pos-=lbt(pos)) ret+=c[pos]; return ret;
}
inline void solve(int l,int r,int s,int t) {
if(l==r) {for(R i=s;i<=t;++i) ans[a[i].rk]=l; return ;}
R md=l+r>>,f=s-,b=t+;
for(R i=l;i<=md;++i) add(LL[i],W[i]),add(RR[i]+,-W[i]);
for(R u=s;u<=t;++u) { R cnt=;
for(R i=fir(u),lim=a[u].w;i&&cnt<lim;i=nxt[i]) { R v=vr[i];
cnt+=query(v)+query(v+m);
} if(cnt>=a[u].w) tmp[++f]=a[u];
else tmp[--b]=a[u],tmp[b].w-=cnt;
} for(R i=l;i<=md;++i) add(LL[i],-W[i]),add(RR[i]+,W[i]);
for(R i=s;i<=f;++i) a[i]=tmp[i];
for(R i=t;i>=b;--i) a[i]=tmp[i];
solve(l,md,s,f); solve(md+,r,b,t);
}
inline void main() {
n=g(),m=g(),lim=m<<;
for(R i=,x;i<=m;++i) x=g(),adde(x,i);
for(R i=;i<=n;++i) a[i].w=g(),a[i].rk=i;
k=g(); for(R i=;i<=k;++i) LL[i]=g(),RR[i]=g(),W[i]=g(),LL[i]>RR[i]?RR[i]+=m:;
solve(,k+,,n); for(R i=;i<=n;++i) ans[i]==k+?printf("NIE\n"):printf("%d\n",ans[i]);
}
}
signed main() {
Luitaryi::main();
return ;
}

2019.07.14

Luogu P3527 [POI2011]MET-Meteors 整体二分的更多相关文章

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

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

  2. 洛谷P3527 [POI2011]MET-Meteors(整体二分)

    传送门 整体二分 先二分一个答案,判断是否可行,把可行的全都扔到左边,不可行的扔到右边 判断是否可行用树状数组就行 具体细节看代码好了 整体二分细节真多……也可能是我大脑已经退化了? //minamo ...

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

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

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

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

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

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

  6. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  7. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

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

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

  9. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

随机推荐

  1. 【LOJ】#3096. 「SNOI2019」数论

    LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...

  2. typora的基本使用技巧汇总

    typora的基本使用技巧汇总 链接: https://www.jianshu.com/p/380005c8f104

  3. kmp跑两串的最大相同前后缀 HDU2594

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=2594 如题. 思路: Next数组记录的是pos位置失配时要跑到哪里,所以最后得再添加一个字符‘#’. 连 ...

  4. python学习-7 条件语句 while循环 + 练习题

    1.死循环 while 1 == 1: print('ok') 结果是一直循环 2.循环 count = 0 while count < 10: print(count) count = cou ...

  5. 【Trie】The XOR Largest Pair

    [题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对 ...

  6. cygwin gcc 编译windowsAPI 报错的一个解决方案

    一开始按照linux的习惯去编译一个使用了windowsAPI的程序 结果提示: $ i686-pc-cygwin-g++ screen_catch.cscreen_catch.c: In funct ...

  7. POJ2773Happy2006题解--数论好题

    题目链接 https://cn.vjudge.net/problem/POJ-2773 题意: 求第\(k\)个与\(m\)互质的数 分析 因为\(gcd(a,b)=gcd(a+t * b,b)\) ...

  8. 使用百度echarts仿雪球分时图(三)

    这章节将完成我们的分时图,并使用真实的数据来进行展示分时图. 一天的交易时间段分为上午的09:30~11:30,下午的13:00~15:00两个时间段,因为分时间段的关系,数据是不连续的,所以会先分为 ...

  9. selenium在爬虫中的应用之动态数据爬取

    一.selenium概念 selenium 是一个基于浏览器自动化的模块 selenium爬虫之间的关联: 1.便捷的获取动态加载的数据 2.实现模拟登录 基本使用 pip install selen ...

  10. C++ DLL导出的两种方式和链接的两种方式

    第一种 导出方式 extern "C" _declspec(dllexport) int Plus(int x, int y); extern "C" _dec ...