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\)表示区间还有多少灯是亮着的. ...
随机推荐
- Go语言系列之并发编程
Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(宏观上并行,微观上并发). 并行:同一时刻执行多个任务(宏观和微观都是并行). Go语言的并发通过goroutine实现.gorout ...
- SpringBoot学习笔记三之表述层
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6803355920697917965/ 首先配置learn-admin-webui中的web.xml文件 配置Con ...
- 嵌入式学习第四步—C语言学习用软件安装
学习一门计算机语言,不能光靠看书,最主要的是要动手联系.不记得从哪里看到过,要成为一名网络大牛,要有10万行以上的程序才是基础. 首先需要一个能够编辑程序的地方(IDE),经过大约10天的网上看各种视 ...
- 【Android】安卓开发中的布局与事件
[Android]安卓开发中的布局与事件 1.Android Studio下载配置 非常简单的百度然后点击下载安装就好了.注意的是,本来我是打算使用评价还不错的Genymotion这个软件来充当虚拟机 ...
- JavaScript DOM 基础操作
JavaScript DOM 基础操作 一.获取元素的六方式 document.getElementById('id名称') //根据id名称获取 document.getElementsByclas ...
- 抓包分析与mock实战
Charles下载安装 官网下载安装:https://www.charlesproxy.com/ 电脑证书配置 如果不配置证书,无法抓取https协议 配置证书: 1 - 打开Charles,在hel ...
- lsof恢复误删文件
用 lsof 恢复 误删除文件实验: 先模拟一个进程: [tiger@root:/home/tiger]$ echo "hello deletede" >> test. ...
- Python初学笔记之字符串
一.字符串的定义 字符串是就一堆字符,可以使用""(双引号).''(单引号)来创建. 1 one_str = "定义字符串" 字符串内容中包含引号时,可以使用转 ...
- python 小兵(6)函数进阶
阅读目录 函数参数-动态参数 名称空间 函数的嵌套 gloabal.nonlocal 回到顶部 函数参数-动态参数 之前我们说过传参,如果我们在传参数的时候不很清楚有哪些的时候,或者说给一个函数传了很 ...
- response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别
感谢原文作者:krismile__qh 原文链接:https://blog.csdn.net/krismile__qh/article/details/89926001 一.response.getW ...