Meteors bzoj-2527 Poi-2011

题目大意:题目链接。

注释:略。


想法

首先答案可以离线,且具有单调性。

这里的单调性就是随着时间的推移,每个国家收集的陨石数增加。

不难想到整体二分,对时间进行二分。

但是有一个问题,就是一个国家出现了多次,这样的话我们用链表把他们记录到一起即可,二分的时候传链头。

这个题就是用树状数组+差分实现区间加。

先把$[l,mid]$的操作都用树状数组加上。然后枚举当前还没有答案的国家:每一个都访问整条链加一起跟自己需要的$k$判断一下扔进左区间还是右区间即可。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1000000000000000
#define N 300010
using namespace std; typedef long long ll;
ll tree[N];
int n,m;
struct Node {int x,y,val;}q[N];
int head[N],nxt[N];
int a[N],t[N],w[N],ans[N];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
inline int lowbit(int x) {return x&(-x);}
void update(int x,ll val) {for(int i=x;i<=m;i+=lowbit(i)) (tree[i]+=val)%=mod;}
ll query(int x) {ll ans=0; for(int i=x;i>=1;i-=lowbit(i)) (ans+=tree[i])%=mod; return ans;}
void solve(int x,int y,int l,int r)
{if(x>y) return;if(l==r){for(int i=x;i<=y;i++) ans[a[i]]=l;return;}int mid=(l+r)>>1;for(int i=l;i<=mid;i++){if(q[i].x<=q[i].y) update(q[i].x,q[i].val),update(q[i].y+1,-q[i].val);else update(q[i].x,q[i].val),update(m+1,-q[i].val),update(1,q[i].val),update(q[i].y+1,-q[i].val);}int tl=x,tr=y;for(int i=x;i<=y;i++){if(!w[a[i]]) t[tl++]=a[i];else{ll c=0,vc=0;for(int j=head[a[i]];j;j=nxt[j]){c+=query(j);if(c>=mod) vc+=c/mod,c%=mod;else if(c<0) vc+=c/mod-1,c=(c%mod+mod)%mod;}if(vc||c>=w[a[i]]) t[tl++]=a[i];else w[a[i]]-=c,t[tr--]=a[i];}}for(int i=x;i<=y;i++) a[i]=t[i];for(int i=l;i<=mid;i++){if(q[i].x<=q[i].y) update(q[i].x,-q[i].val),update(q[i].y+1,q[i].val);else update(q[i].x,-q[i].val),update(m+1,q[i].val),update(1,-q[i].val),update(q[i].y+1,q[i].val);}solve(x,tr,l,mid); solve(tl,y,mid+1,r);
}
int main()
{n=rd(),m=rd();for(int i=1;i<=m;i++){int x=rd();nxt[i]=head[x]; head[x]=i;}for(int i=1;i<=n;i++) w[i]=rd(),a[i]=i;int k=rd();for(int i=1;i<=k;i++) q[i].x=rd(),q[i].y=rd(),q[i].val=rd();solve(1,n,1,k+1);for(int i=1;i<=n;i++){if(ans[i]>=1&&ans[i]<=k) printf("%d\n",ans[i]);else puts("NIE");}return 0;
}

小结:整体二分的裸题。我们发现整体二分都通常和树状数组一起搭配使用。

转载于:https://www.cnblogs.com/ShuraK/p/10108065.html

[bzoj2527][Poi2011]Meteors_整体二分_树状数组相关推荐

  1. [POI2011]MET-Meteors 整体二分_树状数组_卡常

    线段树肯定会 TLE 的,必须要用树状数组. Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorith ...

  2. nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】

    正题 题目大意 求n个数的全排列的第k个. 解题思路 首先康拓逆展开 ∑ii<=nxi(n−i)!\sum^{i<=n}_i x_i(n-i)!∑ii<=n​xi​(n−i)! 求每 ...

  3. Educational Codeforces Round 80 (Rated for Div. 2)SZU cf集训round2 C~E(dp,状压+二分,树状数组+逆向思维)

    C. Two Arrays 题目大意:就是给定两个整数n和m.计算数组对的数量(a,b),使得: 1 .两个阵列的长度都等于m: 2 .每个数组的每个元素都是1到n(包括1和n)之间的整数: 从1到m ...

  4. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  5. LIS最长上升子序列详解(动态规划、贪心+二分、树状数组)

    1.摘要: 关于LIS部分,本篇博客讲一下LIS的概念定义和理解,以及求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,最后附上几 ...

  6. 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询

    如何将普通树状数组升级 普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起. 原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]. 那么求a[i]的值的时候a ...

  7. [poj3321]Apple Tree_dfs序_树状数组

    Apple Tree poj-3321 题目大意:给你一个根固定的树,每一个点的点权是0或1,查询子树点权和. 注释:$1\le n \le 10^5$. 想法:刚刚学习dfs序,刷到水题偶哈哈. 什 ...

  8. hdoj_1166_敌兵布阵_树状数组

    2019独角兽企业重金招聘Python工程师标准>>> 树状数组 模板题对待就好 据图可知: c1=a1, c2=a1+a2, c3=a3, c4=a1+a2+a3+a4, c5=a ...

  9. 求序列最长不下降子序列_树状数组解决最长不下降子序列 讲讲主要思路就好...

    展开全部 不降子序列求的是一个元素的值单调e69da5e887aa62616964757a686964616f31333361306430不降的序列. 传统的状态设计便是使用f[n] 表示到达第n位时 ...

最新文章

  1. Failed to resolve:com.android.support:appcompat-v7:报错处理
  2. python计算文件md5值_用python 正确计算大文件md5 值
  3. CloudStack集成KVM报NFS错误
  4. 《计算机基础(2008版)》第4次作业,《计算机基础(2008版)》第5次作业.doc
  5. 你的设备中缺少重要的安全和质量修复_城市排水管道三类非开挖修复技术汇总...
  6. python pywin32 微信_python win32con安装_python-2.7 – 安装pywin32
  7. 设置图片圆角 或者圆形
  8. activiti web流程设计器 整合视频 教程 SSM和独立部署的方式
  9. 20145228 《信息安全系统设计基础》第0周学习总结
  10. redis memcache 性能比较
  11. 鸿蒙明年可以在手机上用吗,华为王成录:鸿蒙已满足在手机上使用,明年一二月份向部分用户开放...
  12. 礼品盒子插画素材丨节日设计加上它之后价值翻倍!
  13. 数据库连接池实现原理
  14. 在Azure上搭建SQL云数据库
  15. java 中deff方法_怎么解决java.lang.NoclassDeffFoundError错误【转载】
  16. org.hibernate.hql.internal.ast.QuerySyntaxException
  17. android圆形进度条
  18. 7、Spring MVC 之 处理异步请求
  19. linux-磁盘分区
  20. 第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂)

热门文章

  1. 《Code Complete》ch.15 使用条件语句
  2. 百度机器人对战人类最强大脑,赢在了小数点后第二位
  3. 机器学习算法学习---处理分类问题常用算法(一)
  4. 【跃迁之路】【488天】程序员高效学习方法论探索系列(实验阶段245-2018.06.08)...
  5. Python-使用python-memcache操作Memcached
  6. linux下find(文件查找)命令的用法总结
  7. 骆驼命名法,帕斯卡命名法和匈牙利命名法(转)
  8. 张涵20160401作业
  9. 运维-系统架构师经验总结:
  10. 如何使用MFC和类型库创建自动化项目