[POI2011]Meteors
嘟嘟嘟
做了几道题之后,对整体二分有点感觉了。
整体二分的本质就是二分答案。所以这道题二分的就是次数。
然后就是套路了,把小于\(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的更多相关文章
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)
[bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- 【bzoj 2527】[Poi2011]Meteors
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...
- bzoj 2527: [Poi2011]Meteors
昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的. (这里n,m,k我就不区分了) 首先一个城市的询问可以很容易的二分 check用树状数组维护区间(区间修改,单点查询的那种) 一次是\(O(n ...
随机推荐
- 通用的Sql存储过程
CREATE PROCEDURE [dbo].[P_ProcPager] ( @recordTotal INT OUTPUT, --输出记录总数 ), --表名 ) = '*', --查询字段 ) = ...
- Tomcat服务器的安装配置图文教程(推荐)
现在将使用Tomcat的一些经验和心得写到这里,作为记录和备忘.如果有朋友看到,也请不吝赐教. 1.首先是Tomcat的获取和安装. 获取当然得上Apache的官方网站下载,开源免费,而且带宽也足够. ...
- 撩课-Java每天5道面试题第19天
126.Struts2中的拦截器有什么用?列举框架提供的拦截器名称? )拦截器是struts2核心组成部分, 它提供了一种机制,使得开发者 可以定义一个特定的功能模块, 这个模块会在Action执行之 ...
- php+xml有什么用
很多招聘网上找php程序员的时候都说要懂xml,这个xml+php在web网站开发方面到底有什么应用呢,希望有知道的朋友能给我具体说说,谢谢了! 我说的是在网站中的实际应用有哪些,不是网上抄的xml的 ...
- 【代码笔记】iOS-将地址解析成经纬度
一,工程图. 二,代码. ViewController.h #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h& ...
- 自定义适用于手机和平板电脑的 Dynamics 365(二):窗体自定义项
适用于手机的 Dynamics 365 和 适用于平板电脑的 Dynamics 365 使用窗体作为 Web 应用. 窗体在应用程序中的显示方式为移动体验进行了优化. 下图显示了从 Web 应用程序到 ...
- RaPC栅格化多边形裁剪之——进化0.1
采用整数二维数组进行cell的归属标记,将所有符合条件的cell输出,不进行整体多边形重构,用以统计面积. 上图: INTERSECT: 网格区域为离散化的空间范围,黄色部分为求交结果. differ ...
- SVN CentOS7 下配置svn的安装及基础配置介绍
CentOS7 下配置svn的安装及基础配置介绍 by:授客 QQ:1033553122 目录 一. 二. 三. 四. 五. 六. 七. 一. 实践环境 CentOS 7操作系统(CentO ...
- JavaScript数字转字符串,字符串转数字
//--------------------字符串转数字--------------------------- var s = "234"; //1.纯数字转换 //1 字符串在运 ...
- 安卓测试【三】adb简单命令及monkey使用
Ⅰ 配置好android sdk环境变量之后,将android手机连接到电脑上,进行一些adb的简单命令的操作. adb,安卓调试桥,android sdk的一个工具.直接操作管理安卓模拟器或者真 ...