嘟嘟嘟




做了几道题之后,对整体二分有点感觉了。




整体二分的本质就是二分答案。所以这道题二分的就是次数。

然后就是套路了,把小于\(mid\)的操作都添加减去,然后查询,如果查询的值\(x\)比给定值大,就把这个询问放到左区间,否则减去\(x\),放到右区间。

具体的操作,要支持区间加和单点查,第一反应是线段树,结果有两个点TLE的很惨。所以改成了树状数组差分维护前缀和,竟然过了,而且还跑的特别块。常数真是致命啊……

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 3e5 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n, m, k, val[maxn];
vector<int> con[maxn];
struct Node
{
int L, R, w, id;
}t[maxn << 1], tl[maxn << 1], tr[maxn << 1];
int ans[maxn]; ll c[maxn];
int lowbit(int x) {return x & -x;}
inline void clear(int pos)
{
for(; pos <= m; pos += lowbit(pos))
if(c[pos]) c[pos] = 0;
else break;
}
inline void add(int pos, int d)
{
if(!pos) return;
for(; pos <= m; pos += lowbit(pos)) c[pos] += d;
}
inline ll query(int pos)
{
ll ret = 0;
for(; pos; pos -= lowbit(pos)) ret += c[pos];
return ret;
} inline void Change(Node q)
{
if(q.L > q.R) add(q.L, q.w), add(1, q.w), add(q.R + 1, -q.w);
else add(q.L, q.w), add(q.R + 1, -q.w);
}
inline void Clear(Node q)
{
if(q.L > q.R) clear(q.L), clear(1), clear(q.R + 1);
else clear(q.L), clear(q.R + 1);
} inline void solve(int kl, int kr, int ql, int qr)
{
if(ql > qr) return;
if(kl == kr)
{
for(int i = ql; i <= qr; ++i)
if(t[i].id > k + 1) ans[t[i].id - k - 1] = kl;
return;
}
int mid = (kl + kr) >> 1, id1 = 0, id2 = 0;
for(int i = ql; i <= qr; ++i)
{
if(t[i].id <= k + 1)
{
if(t[i].id <= mid) Change(t[i]), tl[++id1] = t[i];
else tr[++id2] = t[i];
}
else
{
ll tot = 0; int x = t[i].id - k - 1;
for(int j = 0; j < (int)con[x].size(); ++j)
if((tot += query(con[x][j])) >= t[i].w) break;
if(tot >= t[i].w) tl[++id1] = t[i];
else t[i].w -= tot, tr[++id2] = t[i];
}
}
for(int i = 1; i <= id1; ++i) if(tl[i].id <= k + 1 && tl[i].id <= mid) Clear(tl[i]);
for(int i = 1; i <= id1; ++i) t[ql + i - 1] = tl[i];
for(int i = 1; i <= id2; ++i) t[ql + id1 + i - 1] = tr[i];
solve(kl, mid, ql, ql + id1 - 1);
solve(mid + 1, kr, ql + id1, qr);
} int main()
{
n = read(); m = read();
for(int i = 1, x; i <= m; ++i) x = read(), con[x].push_back(i);
for(int i = 1; i <= n; ++i) val[i] = read();
k = read();
for(int i = 1; i <= k; ++i)
t[i].L = read(), t[i].R = read(), t[i].w = read(), t[i].id = i;
t[k + 1] = (Node){1, m, INF, k + 1};
for(int i = 1; i <= n; ++i) t[k + 1 + i] = (Node){0, 0, val[i], k + 1 + i};
solve(1, k + 1, 1, k + n + 1);
for(int i = 1; i <= n; ++i)
if(ans[i] > k) puts("NIE");
else write(ans[i]), enter;
return 0;
}

[POI2011]Meteors的更多相关文章

  1. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

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

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

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

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

  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. 【bzoj 2527】[Poi2011]Meteors

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

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

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

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

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

  10. bzoj 2527: [Poi2011]Meteors

    昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的. (这里n,m,k我就不区分了) 首先一个城市的询问可以很容易的二分 check用树状数组维护区间(区间修改,单点查询的那种) 一次是\(O(n ...

随机推荐

  1. [android] 轮播图-无限循环

    实现无限循环 在getCount()方法中,返回一个很大的值,Integer.MAX_VALUE 在instantiateItem()方法中,获取当前View的索引时,进行取于操作,传递进来的int ...

  2. 奇妙的数字-2015省赛C语言A组第三题

    奇妙的数字 小明发现了一个奇妙的数字.它的平方和立方正好把0~9的10个数字每个用且只用了一次.你能猜出这个数字是多少吗? 请填写该数字,不要填写任何多余的内容.

  3. MVC--DefaultModelBinder解析request参数

    转载:http://www.cnblogs.com/leotsai/p/ASPNET-MVC-DefaultModelBinder.html 看到很多ASP.NET MVC项目还在从request.q ...

  4. 在Linux上实现SVN用户密码自助修改

    1.首先本文是在一篇百度经验的基础上修改而成,将网址记录上,以示尊重. https://jingyan.baidu.com/article/48b37f8dd4bbb31a646488c2.html ...

  5. python基础技巧综合训练题2

    1,判断一个字符串中的每一个字母是否都在另一个字符串中,可以利用集合的特性来解,集合的元素如果存在,再次更新(update) 是添加不进集合的,那么集合的长度还是跟原来一样,如果添加进去,集合长度就会 ...

  6. macbook 外接显示器黑屏,不显示

    我的mac本有点老了,11年底的那款 整了个显示器,刚开始连上没问题,后来开机状态拔了雷电线,再插  或者关机后莫名的原因再启动,显示器黑屏 网上好多方法都不行,自己总结了一个方法 拔掉连接线,关闭m ...

  7. js同时获取多个同name的input框的值

    demo代码 <!doctype html> <html ng-app="a3_4"> <head> <title>表头排序< ...

  8. WEB服务器、应用程序服务器、HTTP服务器的区别

    WEB服务器.应用程序服务器.HTTP服务器的区别 Web服务器: 基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.与客户端的网络浏览器配合.因为Web服务器主要 ...

  9. python 类之间的关系

    类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻 ...

  10. 【代码笔记】iOS-plist获得城市列表

    一,工程图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...