洛谷

题意:

思路: 考虑整体二分前,一定要思考一下直接二分怎么做。显然对每个城市,当<pos<pos<pos的时候收集不够足够的陨石,>=pos>=pos>=pos的时候能收集足够多陨石,这个时候pospospos即为答案。这显然具有二分性,复杂度为O(NMlogM)O(NMlogM)O(NMlogM)。让后我们发现可以将所有城市放在一起二分,假设当前陨石落下波数区间为[l,r][l,r][l,r],mid=l+r>>1mid=l+r>>1mid=l+r>>1,当前面[l,mid][l,mid][l,mid]陨石落下来的时候就足达到个城镇的预期的话,就把这个城镇放在左边,否则放在右边。让后将[l,mid][l,mid][l,mid]跟放在左边的城镇递归下去,[mid+1,r][mid+1,r][mid+1,r]跟放在右边的城镇递归下去。最终l==rl==rl==r的时候更新答案即可。
有可能存在无解的情况,我们只需要把初始的[1,k][1,k][1,k]改成[l,k+1][l,k+1][l,k+1],等于k+1k+1k+1的时候无解。
还有一个要注意的点是代码的86行加到期望之后要停下来,不然可能会爆LL,因为这个调了一下午。
区间加,单点查询用树状数组应该不用多说了,用线段树可能会T。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
#define lowbit(x) ((x)&(-x))
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=300010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m,k;
LL s[N];
int p[N],p1[N],p2[N],ans[N];
struct Query
{LL l,r,c,id;
}q[N];
vector<int>v[N];
LL tr[N<<2];void add(int x,LL c)
{for(int i=x;i<=m*2;i+=lowbit(i)) tr[i]+=c;
}LL sum(int x)
{LL ans=0;for(int i=x;i;i-=lowbit(i)) ans+=tr[i];return ans;
}void solve(int l,int r,LL c)
{if(l<=r) add(l,c),add(r+1,-c);else add(r,c),add(m+1,-c),add(1,c),add(l+1,-c);
}void solve(int l,int r,int begin,int end)
{int mid=l+r>>1;if(l==r){for(int i=begin;i<=end;i++){int id=p[i];ans[id]=l;}return;}for(int i=l;i<=mid;i++) add(q[i].l,q[i].c),add(q[i].r+1,-q[i].c);int cnt1,cnt2; cnt1=cnt2=0;for(int i=begin;i<=end;i++){int id=p[i];LL ssum=0;for(int j=0;j<v[id].size()&&ssum<s[id];j++) ssum+=sum(v[id][j])+sum(v[id][j]+m);if(ssum>=s[id]) p1[++cnt1]=p[i];else p2[++cnt2]=p[i],s[id]-=ssum;}for(int i=l;i<=mid;i++) add(q[i].l,-q[i].c),add(q[i].r+1,q[i].c);for(int i=1;i<=cnt1;i++) p[begin+i-1]=p1[i];for(int i=1;i<=cnt2;i++) p[begin+cnt1+i-1]=p2[i];solve(l,mid,begin,begin+cnt1-1); solve(mid+1,r,begin+cnt1,end);
}template <class T>
bool read(T &ret)//输入
{char c;int sgn;T bit=0.1;if(c=getchar(), c==EOF)return 0;while(c!='-' && c!='.' && (c<'0' || c>'9'))c=getchar();sgn=(c=='-')? -1:1;ret=(c=='-')? 0:(c-'0');while(c=getchar(), c>='0' && c<='9')ret=ret*10+(c-'0');if(c==' ' || c=='\n'){ret*=sgn;return 1;}while(c=getchar(), c>='0' && c<='9')ret+=(c-'0')*bit, bit/=10;ret*=sgn;return 1;
}inline void out(int x)//输出
{if(x>9)out(x/10);putchar(x%10+'0');
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);read(n); read(m);for(int i=1;i<=m;i++){int x; read(x);v[x].pb(i);}for(int i=1;i<=n;i++) p[i]=i;for(int i=1;i<=n;i++) read(s[i]);read(k);for(int i=1;i<=k;i++){int l,r,c; read(l); read(r); read(c);if(l>r) r+=m;q[i]={l,r,c,i};}solve(1,k+1,1,n);for(int i=1;i<=n;i++) (ans[i]==k+1)? puts("NIE"):printf("%d\n",ans[i]);return 0;
}
/**/

P3527 [POI2011]MET-Meteors 整体二分 + 树状数组相关推荐

  1. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

  2. 【BZOJ2738】矩阵乘法 [整体二分][树状数组]

    矩阵乘法 Time Limit: 20 Sec  Memory Limit: 256 MB [Submit][Status][Discuss] Description 给你一个N*N的矩阵,不用算矩阵 ...

  3. P3527-[POI2011]MET-Meteors【整体二分,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3527 题目大意 mmm个格子形成的环,有nnn个集合,第iii个格子属于第oio_ioi​个集合,kkk次让环上 ...

  4. [THUPC2017] 天天爱射击(整体二分+树状数组)

    洛谷题目传送门 解题思路 我们发现直接做不是很好做 考虑计算每个木板是在第几次射击被射掉的 这显然是具有可二分性的 于是我们考虑整体二分 每次二分中间点 m i d mid mid,然后将时间小于等于 ...

  5. jzoj4050-寻宝游戏【二分,树状数组,LCA】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3017/1 题目大意 nnn个点的一棵树,mmm次操作,修改一个地方的宝藏. 每次操作后求拿完所以宝藏并回 ...

  6. bzoj4418 [Shoi2013]扇形面积并 扫描线+二分+树状数组

    Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. 对于100%的数据,1≤n≤105, 1≤m≤106,1≤k≤5000,1≤ri≤105,-m≤a1,a2≤m Sol ...

  7. HDU多校1 - 6756 Finding a MEX(分块+二分+树状数组)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的无向图,每个点都有一个权值,现在需要执行 q 次操作,每次操作分为两种类型: 1 pos val :将第 pos 个点的权值修改为 val ...

  8. P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3573 题目大意 nnn个点mmm条边的DAGDAGDAG,删掉一个点使得最长路最短. 解题思路 先跑一遍拓扑排序 ...

  9. ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

最新文章

  1. 区块链概况:什么是区块链
  2. 10.07-Idea的使用
  3. 目标检测 最新源码大放送
  4. 示范对外接口参数文档
  5. 嵌入式linux开发业内各个常用开源项目git仓库地址大全
  6. 交换机老化测试和性能测试方法收集
  7. Matlab控制精度
  8. tslib编译使用方法
  9. javascript无限弹窗_html恶搞之无限弹窗
  10. WebView截取长图
  11. 如果时间不够 ,无法进行充分的测试怎么办?
  12. 不平衡数据对于卷积神经网络的影响
  13. 北大AI公开课笔记整理
  14. 187. 导弹防御系统
  15. M-Arch(番外13)GD32L233评测-来点音乐
  16. 超级牛的网站同步工具软件—端端Clouduolc
  17. 苹果cms v10模板 海螺模板V15 已去授权 源码+安装教程 长期更新
  18. java计算机毕业设计问卷调查系统源码+数据库+系统+lw文档+mybatis+运行部署
  19. 免费在线绘图软件推荐-processon
  20. [小甲鱼] 零基础入门python第023、024讲课后测试题及答案:这帮小兔崽子汉诺塔

热门文章

  1. stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制
  2. python获取键盘事件_50-用Python监听鼠标和键盘事件
  3. 史上最接近上帝的方程!神秘的数字4.669,目前没有人能解开这个谜语......
  4. 每日一笑 | 3 X 4 = ?
  5. 快速成长为数据挖掘高手的秘诀
  6. 代码传奇 | 明明可以靠颜值 却用代码把人类送上了月球的女人——Margaret Hamilton
  7. linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)
  8. python训练词库_在Python中训练NGramModel
  9. background 旋转_第4章 旋转的圆弧(《Python趣味创意编程》教学视频)
  10. python中merge函数怎么用_Python Merge函数原理及用法解析