【LG3527】[POI2011]MET-Meteors
【LG3527】[POI2011]MET-Meteors
题面
题解
整体二分。
每次二分\(mid\),如果到时间\(mid\)以收集过\(P_i\)就存入子序列\(L\),否则存入子序列\(R\)
修改可以树状数组区间修改单点查询做
每个王国的掉落地点用\(vector\)存一下即可
看起来复杂度是平方的实则为线性的
总复杂度\(O(nlog^2)\)
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
namespace IO {
const int BUFSIZE = 1 << 20;
char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
inline char gc() {
if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
return *is++;
}
}
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = IO::gc();
if (ch == '-') w = -1 , ch = IO::gc();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = IO::gc();
return w * data;
}
typedef long long ll;
const int MAX_N = 300005;
struct Node { ll p; int id; } q[MAX_N], lq[MAX_N], rq[MAX_N];
struct Option { int l, r, v; } p[MAX_N];
vector<int> G[MAX_N];
int N, M, K, ans[MAX_N];
ll c[MAX_N];
inline int lb(int x) { return x & -x; }
void add(int x, int v) { while (x <= M) c[x] += v, x += lb(x); }
ll sum(int x) { ll res = 0; while (x > 0) res += c[x], x -= lb(x); return res; }
void modify(int x, int w) {
int l = p[x].l, r = p[x].r, v = p[x].v;
if (l <= r) add(l, w * v), add(r + 1, -w * v);
else add(1, v * w), add(r + 1, -v * w), add(l, v * w);
}
void Div(int lval, int rval, int st, int ed) {
if (st > ed) return ;
if (lval == rval) { for (int i = st; i <= ed; i++) ans[q[i].id] = lval; return ; }
int mid = (lval + rval) >> 1;
int lt = 0, rt = 0; ll res = 0;
for (int i = lval; i <= mid; i++) modify(i, 1);
for (int i = st; i <= ed; i++) {
res = 0; vector<int> :: iterator ite; int x = q[i].id;
for (ite = G[x].begin(); ite != G[x].end(); ++ite) { res += sum(*ite); if (res >= q[i].p) break; }
if (res >= q[i].p) lq[++lt] = q[i];
else q[i].p -= res, rq[++rt] = q[i];
}
for (int i = lval; i <= mid; i++) modify(i, -1);
for (int i = 1; i <= lt; i++) q[st + i - 1] = lq[i];
for (int i = 1; i <= rt; i++) q[st + lt + i - 1] = rq[i];
Div(lval, mid, st, st + lt - 1);
Div(mid + 1, rval, st + lt, ed);
}
int main () {
N = gi(), M = gi();
for (int i = 1; i <= M; i++) G[gi()].push_back(i);
for (int i = 1; i <= N; i++) q[i] = (Node){gi(), i};
K = gi();
for (int i = 1; i <= K; i++) p[i] = (Option){gi(), gi(), gi()};
++K; p[K] = (Option){1, M, 1e9};
Div(1, K, 1, N);
for (int i = 1; i <= N; i++) ans[i] == K ? puts("NIE") : printf("%d\n", ans[i]);
return 0;
}
【LG3527】[POI2011]MET-Meteors的更多相关文章
- 【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 ...
- 【BZOJ2217】[Poi2011]Lollipop 乱搞
[BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...
- 【BZOJ2525】[Poi2011]Dynamite 二分+树形DP
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- 【BZOJ2213】[Poi2011]Difference DP
[BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...
- 【BZOJ2530】[Poi2011]Party (xia)构造
[BZOJ2530][Poi2011]Party Description 给定一张N(保证N是3的倍数)个节点M条边的图,并且保证该图存在一个大小至少为2N/3的团. 请输出该图的任意一个大小为N/3 ...
- 【BZOJ2216】[Poi2011]Lightning Conductor 决策单调性
[BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负 ...
- 【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
随机推荐
- 树莓派(Raspberry Pi)上手小记
引言 本日志中有不少软广告,博主并没有收他们任何好处,完全是给想入手的小伙伴们指条路而已.不喜勿看,不喜勿闻,不喜勿喷. 介绍 之前两三个月突然听说了这么个东西,也没有留意,某天突然在一个微信公众号上 ...
- git branch 进入编辑状态
命令行输入git branch,发现进入编辑状态,都要:wq,非常不方便,这样配置 git config --global core.pager ''
- 微信小程序开发工具快捷键
格式调整 //保存文件 Ctrl+S //代码行缩进 Ctrl+[, Ctrl+] //折叠打开代码块 Ctrl+Shift+[, Ctrl+Shift+] //复制粘贴,如果没有选中任何文字则复制粘 ...
- 【题解】洛谷P1879 [USACO06NOV] Corn Fields(状压DP)
洛谷P1879:https://www.luogu.org/problemnew/show/P1879 思路 把题目翻译成人话 在n*m的棋盘 每个格子不是0就是1 1表示可以种 0表示不能种 相邻的 ...
- TCP Congestion Control
TCP Congestion Control Congestion occurs when total arrival rate from all packet flows exceeds R ove ...
- 再看redux
redux提供了一个全局的唯一状态树,不代表就不需要组建本身的state. 何时用react组件的state.props?? state只表示一些‘临时的’‘内部的’状态数据.临时的:代表你可以临时改 ...
- CSS 高级选择器
相信各位如我一样的“抠图崽”和前端大佬们,在写网页样式的实话,总是免不了写下各种各样的选择器,再给选择的元素写入样式.最基本的元素选择器.class选择器.ID选择器等就不再过多的说了,相信大家都熟的 ...
- HDBS之应用代码优化
一.目录结构树 总体概述 代码检测工具sonar HDBS代码优化 总结开发注意点 二.总体概述 进入现在这家公司我的第一个任务就是对HDBS进行代码质量优化.HDBS可能大家不是很了解,现在给大家简 ...
- Linux -- date 日期命令
Linux -- date 日期命令 date 用法:date [选项]... [+格式] 以给定的格式显示当前时间,或是设置系统日期. 1.使用 date 命令查看当前日期或当前时间 [root@l ...
- Flask—07-建立自己的博客(01)
博客项目 一局王者的时间轻松学会用Flask建立一个属于自己的博客. 需求分析 用户注册登录 用户信息管理 博客发表回复 博客列表展示 博客分页展示 博客收藏点赞 搜索.统计.排序.… 目录结构 bl ...