\(\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的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  3. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  4. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  5. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  6. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  7. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  8. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

  9. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

随机推荐

  1. Go语言系列之并发编程

    Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(宏观上并行,微观上并发). 并行:同一时刻执行多个任务(宏观和微观都是并行). Go语言的并发通过goroutine实现.gorout ...

  2. SpringBoot学习笔记三之表述层

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6803355920697917965/ 首先配置learn-admin-webui中的web.xml文件 配置Con ...

  3. 嵌入式学习第四步—C语言学习用软件安装

    学习一门计算机语言,不能光靠看书,最主要的是要动手联系.不记得从哪里看到过,要成为一名网络大牛,要有10万行以上的程序才是基础. 首先需要一个能够编辑程序的地方(IDE),经过大约10天的网上看各种视 ...

  4. 【Android】安卓开发中的布局与事件

    [Android]安卓开发中的布局与事件 1.Android Studio下载配置 非常简单的百度然后点击下载安装就好了.注意的是,本来我是打算使用评价还不错的Genymotion这个软件来充当虚拟机 ...

  5. JavaScript DOM 基础操作

    JavaScript DOM 基础操作 一.获取元素的六方式 document.getElementById('id名称') //根据id名称获取 document.getElementsByclas ...

  6. 抓包分析与mock实战

    Charles下载安装 官网下载安装:https://www.charlesproxy.com/ 电脑证书配置 如果不配置证书,无法抓取https协议 配置证书: 1 - 打开Charles,在hel ...

  7. lsof恢复误删文件

    用 lsof 恢复 误删除文件实验: 先模拟一个进程: [tiger@root:/home/tiger]$ echo "hello deletede" >> test. ...

  8. Python初学笔记之字符串

    一.字符串的定义 字符串是就一堆字符,可以使用""(双引号).''(单引号)来创建. 1 one_str = "定义字符串" 字符串内容中包含引号时,可以使用转 ...

  9. python 小兵(6)函数进阶

    阅读目录 函数参数-动态参数 名称空间 函数的嵌套 gloabal.nonlocal 回到顶部 函数参数-动态参数 之前我们说过传参,如果我们在传参数的时候不很清楚有哪些的时候,或者说给一个函数传了很 ...

  10. response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别

    感谢原文作者:krismile__qh 原文链接:https://blog.csdn.net/krismile__qh/article/details/89926001 一.response.getW ...