Solution -「POI 2011」「洛谷 P3527」MET-Meteors
\(\mathcal{Description}\)
Link.
给定一个大小为 \(n\) 的环,每个结点有一个所属国家。\(k\) 次事件,每次对 \([l,r]\) 区间上的每个点点权加上一个值。对于每个国家,求操作多少次事件后其拥有的结点权值总和不小于给定值。
\(n,k\le3\times10^5\)。
\(\mathcal{Soltuion}\)
新初二大佬切掉的题兔子都不会 qwq。
于是补习了一下整体二分。
考虑一个单点的情况,显然二分,不过每个点单独二分答案的复杂度是不能接受的。我们考虑“整体二分”——把一段点的答案一起二分。具体地,设当前处理询问(此后会打乱国家顺序,所以说“询问”会更准确)区间 \([q_l,q_r]\),已知答案区间 \([a_l,a_r]\),取出答案终点 \(mid=\lfloor\frac{a_l+a_r}2\rfloor\),在树状数组上作用 \([a_l,mid]\) 内的所有事件。把此时满足“不小于给定值”的询问放到左边,其余放到右边并将其要求的值减去当前这些事件的贡献,最后还原树状数组,递归处理两端询问区间即可。
复杂度 \(\mathcal O(n\log n\log k)\)。
\(\mathcal{Code}\)
#include <cstdio>
#include <vector>
typedef long long LL;
const int MAXN = 3e5;
int n, m, K, L[MAXN + 5], R[MAXN + 5], A[MAXN + 5], ans[MAXN + 5];
std::vector<int> station[MAXN + 5];
LL bit[MAXN * 2 + 5];
struct Country { int expt, id; } qry[MAXN + 5], tqry[MAXN * 2 + 5];
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
inline int lowbit ( const int x ) { return x & -x; }
inline void update ( int x, const int k ) { for ( ; x <= m << 1; x += lowbit ( x ) ) bit[x] += k; }
inline LL sum ( int x ) { LL ret = 0; for ( ; x; x -= lowbit ( x ) ) ret += bit[x]; return ret; }
inline void solve ( const int ql, const int qr, const int al, const int ar ) {
if ( al == ar ) {
for ( int i = ql; i <= qr; ++ i ) ans[qry[i].id] = al;
return ;
}
int mid = al + ar >> 1, inL = 0, inR = n;
for ( int i = al; i <= mid; ++ i ) update ( L[i], A[i] ), update ( R[i] + 1, -A[i] );
for ( int i = ql; i <= qr; ++ i ) {
LL curs = 0;
for ( int st: station[qry[i].id] ) {
curs += sum ( st ) + sum ( st + m );
if ( curs >= qry[i].expt ) break;
}
if ( curs >= qry[i].expt ) tqry[++ inL] = qry[i];
else qry[i].expt -= curs, tqry[++ inR] = qry[i];
}
for ( int i = al; i <= mid; ++ i ) update ( L[i], -A[i] ), update ( R[i] + 1, A[i] );
for ( int i = 1; i <= inL; ++ i ) qry[ql + i - 1] = tqry[i];
for ( int i = 1; i <= inR - n; ++ i ) qry[ql + inL + i - 1] = tqry[n + i];
solve ( ql, ql + inL - 1, al, mid ), solve ( qr - inR + n + 1, qr, mid + 1, ar );
}
int main () {
n = rint (), m = rint ();
for ( int i = 1; i <= m; ++ i ) station[rint ()].push_back ( i );
for ( int i = 1; i <= n; ++ i ) qry[i].expt = rint (), qry[i].id = i;
K = rint ();
for ( int i = 1; i <= K; ++ i ) {
L[i] = rint (), R[i] = rint (), A[i] = rint ();
if ( R[i] < L[i] ) R[i] += m;
}
solve ( 1, n, 1, K + 1 );
for ( int i = 1; i <= n; ++ i ) {
if ( ans[i] == K + 1 ) puts ( "NIE" );
else printf ( "%d\n", ans[i] );
}
return 0;
}
Solution -「POI 2011」「洛谷 P3527」MET-Meteors的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 「洛谷3870」「TJOI2009」开关【线段树】
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...
随机推荐
- Elasticsearch打造全文搜索引擎(二)
一.Es的文档.索引的CURD操作 1. elasticsearch概念 集群:一个或多个节点组织在一起 节点:一个节点是集群中的一个服务器,有一个名字来标识,默认是一个随机的漫画角色的名字 分片:将 ...
- Java 集合详解 | 一篇文章解决Java 三大集合
更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...
- 【Java】注解Annotation
注解 Annotation 理解Annotation jdk 5.0 新增的功能 Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通 ...
- Linux防止文件被误删除或修改
chattr简介 Linux没有回收站,一旦文件或文件夹被误删除,要寻找回来很麻烦,不如事先对一些重要的文件做一些保护,这时我们需要一个命令chattr,其使用格式为 chattr 操作符 属性 文件 ...
- jQuery ajax get与post后台交互中的奥秘
这两天在做关注功能模块(类似于Instagram).多处页面都需要通过一个"关注"按钮进行关注或者取消该好友的操作.一个页面对应的放一个按钮,进行操作.效率低维护性差.因此想通过j ...
- centos下APUE 例程编译-解决报错与改写例子名字。
首先是编译生成libapue.a的库文件.按照readme的说法很简单改个目录make一下就好,但是在centos下还是有错.通过下面这篇博文<<UNIX环境高级编程中的apue.h错误& ...
- POSIX之消息队列
my_semqueue_send.c: #include<stdio.h> #include<errno.h> #include<mqueue.h> #includ ...
- Cobbler批量安装操作系统
1,关闭selinux getenforce 查看selinux状态 Disabled 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=di ...
- Docker常用命令速查
docker pull ${CONTAINER NAME} #拉取镜像 docker images #查看本地所有镜像 docker ps #查看所有正在运行的容器,加-q返回id docker ps ...
- kubernetes之Pod水平自动伸缩(HPA)
https://k8smeetup.github.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ Horizon ...