洛谷P3527 [POI2011]MET-Meteors [整体二分]
Meteors
格式难调,题面就不妨放了。
分析:
一道整体二分的练手题。
就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问。另外,博主代码打得太丑,常数贼大,不建议照这么打。。。
Code:
//It is made by HolseLee on 5th Oct 2018
//Luogu.org P3527
#include<bits/stdc++.h>
#define N 300007
using namespace std; typedef long long ll;
int n,m,K,cnt,ans[N];
ll c[N],a[N];
vector<int>G[N];
struct Node {
int x,y,pos,type; ll k;
}q[N<<],q1[N],q2[N]; inline ll read()
{
ll x=; char ch=getchar(); bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true; ch=getchar();
}
while( ch>='' && ch<='' ) {
x=(x<<)+(x<<)+(ch^); ch=getchar();
}
return flag ? -x : x;
} void print(int x)
{
if( x> ) print(x/);
putchar(x%+'');
} inline int lowbit(int x)
{
return x&(-x);
} inline void add(int pos,ll x)
{
for(; pos<=m; pos+=lowbit(pos)) c[pos]+=x;
} inline ll quary(int pos)
{
ll ret=;
for(; pos>; pos-=lowbit(pos)) ret+=c[pos];
return ret;
} void solve(int l,int r,int L,int R)
{
if( l>r || L>R ) return;
if( l==r ) {
for(int i=L; i<=R; ++i)
if( q[i].type== ) ans[q[i].pos]=l;
return;
}
int mid=(l+r)>>, cnt1=, cnt2=;
for(int i=L; i<=R; ++i)
if( q[i].type== ) {
ll tmp=;
for(int j=; j<G[q[i].pos].size(); ++j) {
tmp+=quary(G[q[i].pos][j]);
if( tmp>q[i].k ) break;
}
if( tmp>=q[i].k ) q1[++cnt1]=q[i];
else q[i].k-=tmp,q2[++cnt2]=q[i];
} else {
if( q[i].pos<=mid ) {
if( q[i].type== ) {
add(q[i].x,q[i].k), add(q[i].y+,-q[i].k);
} else {
add(,q[i].k), add(q[i].y+,-q[i].k), add(q[i].x,q[i].k);
}
q1[++cnt1]=q[i];
} else {
q2[++cnt2]=q[i];
}
}
for(int i=; i<=cnt1; ++i) {
if( q1[i].type== ) continue;
if( q1[i].type== ){
add(q1[i].x,-q1[i].k), add(q1[i].y+,q1[i].k);
} else {
add(,-q1[i].k), add(q1[i].y+,q1[i].k), add(q1[i].x,-q1[i].k);
}
}
for(int i=; i<=cnt1; ++i) q[L+i-]=q1[i];
for(int i=; i<=cnt2; ++i) q[L+cnt1+i-]=q2[i];
solve(l,mid,L,L+cnt1-); solve(mid+,r,L+cnt1,R);
} int main()
{
n=read(), m=read();
int x,y; ll z;
for(int i=; i<=m; ++i) G[read()].push_back(i);
for(int i=; i<=n; ++i) a[i]=read();
K=read();
for(int i=; i<=K; ++i) {
x=read(), y=read(), z=read();
q[++cnt].x=x, q[cnt].y=y, q[cnt].k=z; q[cnt].pos=i;
if( y>=x ) q[cnt].type=; else q[cnt].type=;
}
for(int i=; i<=n; ++i)
q[++cnt].pos=i, q[cnt].k=a[i], q[cnt].type=;
solve(,K+,,cnt);
for(int i=; i<=n; ++i)
if( ans[i]!=K+ ) print(ans[i]),putchar('\n');
else puts("NIE");
return ;
}
洛谷P3527 [POI2011]MET-Meteors [整体二分]的更多相关文章
- 洛谷P3527 [POI2011]MET-Meteors(整体二分)
传送门 整体二分 先二分一个答案,判断是否可行,把可行的全都扔到左边,不可行的扔到右边 判断是否可行用树状数组就行 具体细节看代码好了 整体二分细节真多……也可能是我大脑已经退化了? //minamo ...
- [洛谷P3527] [POI2011]MET-Meteors
洛谷题目链接:[POI2011]MET-Meteors 题意翻译 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1 ...
- 洛谷 P3527 [POI2011]MET-Meteors 解题报告
P3527 [POI2011]MET-Meteors 题意翻译 \(\tt{Byteotian \ Interstellar \ Union}\)有\(N\)个成员国.现在它发现了一颗新的星球,这颗星 ...
- 【BZOJ2527】【POI2011】Meteors [整体二分]
Meteors Time Limit: 60 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这个星球经常会下陨石雨.BI ...
- 洛谷P3242 接水果 [HNOI2015] 整体二分
正解:整体二分+树状数组 解题报告: 传送门! 题目还是大概解释下?虽然其实是看得懂的来着,,, 大概就是说给一棵树.给定一些询问,每个询问都是说在两个点之间的路径上的子路径的第k大是什么 然后看到这 ...
- 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)
传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...
- 洛谷P3513 [POI2011]KON-Conspiracy
洛谷P3513 [POI2011]KON-Conspiracy 题目描述 Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动. 国王需要选一些人来进行这场运动,而这些人被分为 ...
- 洛谷P3527 MET-Meteors [POI2011] 整体二分
正解:整体二分 解题报告: 传送门! 还有个双倍经验!(明明是一样的题目为什么你们一个紫一个黑啊喂! 这题首先要想到可以二分嘛,然后看到多组询问肯定就整体二分鸭 那就是基本套路啊,发现是区间修改单点查 ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
随机推荐
- 浏览器断点调试js
说了一些 Chrome 开发者工具的技巧,其实并没有涉及到开发者工具最核心的功能之一:断点调试.断点可以让程序运行到某一行的时候,把程序的整个运行状态进行冻结.你可以清晰地看到到这一行的所有的作用域变 ...
- 【C++】数组-二分法查找
1.原理 对于给定值的查找,如果大于该数组的中间元素,下一步在元素值大的区域继续与其中间元素比较:否则下一步在元素值小的区域内继续查找,直到找到目标元素.如果到最后还没有找到,则输出"数组中 ...
- rabbitmq之后台管理和用户设置(三)
前言 前面介绍了erlang环境的安装和rabbitmq环境安装,接下来介绍rabbitmq的web管理和用户设置. 启用后台管理插件 通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等. ...
- C++ 和 MFC的学习
1. 在Windows应用程序设计中,既可以使用个C的基本数据类型,也可以使用Windows自定义的数据类型.但要注意,凡是Windows自定义的关键字都要大写. 2. 什么是句柄? 在Windows ...
- Ubuntu server 搭建Git server【转】
转自:http://www.cnblogs.com/candle806/p/4064610.html Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客 ...
- python几种装饰器的用法
用函数装饰函数 这种比较常见首先定义装饰器函数 def cache(func): data = {} @wraps(func) def wrapper(*args, **kwargs): key = ...
- java递归遍历获取目录下所有文件
import java.io.File; import java.util.ArrayList; import java.util.List; public class GetFiles { Arra ...
- grpc 实现微服务生态笔记
微服务的发展可谓是一波三折,一代一代经历和N多技术成果,grpc只是其中一个,因为其东家是google,明显比较稳定.加上其强大的文档和技术支持和跨平台的支持,在企业级应用上有很大的可信任感,所以也有 ...
- 学习记录:mongodb里插入整型值
=============================================== 2018/1/24_第1次修改 ccb_warlock == ...
- python网络编程--事件驱动模型
论事件驱动与异步IO 事件驱动模型:根据事件的触发去干什么事,就是根据一个事件做反应 原文:http://www.cnblogs.com/alex3714/articles/5248247.html常 ...