\(\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. HITsz 数据库笔记

    这是 HITsz 数据库笔记,欢迎到我的 GitHub 上查看,有笔记说明和源码,作业和实验报告,希望对你有帮助 博客园显示图片异常 数据库基本概念 数据抽象 通过抽象来对用户屏蔽复杂性,以简化用户与 ...

  2. for循环题目记录

    1.求1000以内的完数 /** * 一个数如果恰好等于它的因子之和,这个数就是完数,找出1000内的所有完数 * @author 努力Coding * @version * @data */ pub ...

  3. Keepalived高可用、四层负载均衡

    目录 Keepalived高可用 高可用简介 常用的工具 问题 名称解释 VRRP协议 部署keepalived 下载安装 Keepalived配置 保证nginx配置一样 解决keepalived的 ...

  4. JAVA8-STREAM 使用说明

    概述 本人在java开发过程中,有些知识点需要记录整理,我尽量严谨的叙述我学习的经过和心得,以便备份和和大家一起进步学习,此篇文章是在网上多出搜集整理验证,结尾会注明出处,今天学习一个java8新的功 ...

  5. MySQL注入点写webshell的五种方式

    0x00 写数据的前提 1,在mysql的配置文件 my.ini 中,secure_file_priv="c:/wamp64/tmp" 被注释 或者 `secure_file_pr ...

  6. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  7. [开发笔记usbTOcan]系统架构设计

    SYS.3 | 系统架构设计 系统架构设计过程的目的是建立一个系统体系结构设计,并确定哪些系统需求分配给系统的哪些元素,并根据确定的标准评估系统架构. 系统结构设计需要做一下工作: 开发系统架构设计. ...

  8. 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加

    如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.

  9. Using Swap

    # create swap file dd if=/dev/zero of=/.swap bs=1048576 count=4096 # format swap mkswap /.swap # sta ...

  10. 关于C++11共享数据带来的死锁问题的提出与解决

    举个例子,如果有一份资源,假如为list<int>资源,假设有两个线程要对该资源进行压入弹出操作,如果不进行锁的话,那么如果两个线程同时操作,那么必然乱套,得到的结果肯定不是我们想要的结果 ...