#2461. 「2018 集训队互测 Day 1」完美的队列

传送门:

https://loj.ac/problem/2461

题解:

直接做可能一次操作加入队列同时会弹出很多数字,无法维护;一个操作的有效区间是连续的,考虑找到操作x结束的时间ed[x],即执行(x,ed[x]]可以将x加入的数全部弹出,这样用一个vis记录数字次数就可以维护个数;

一种比较暴力的做法是:枚举x,用一个线段树维护还可以放多少个元素,枚举ed[x]更新,但是这样不满足单调性无法two-pointers;

考虑分块。ed[x]即对x的每一个块的ed取max

考虑整块。枚举每一个整块,用一个b维护还可以放的元素初始化为ai,cov维护整块被完整覆盖了多少次,枚举x,再枚举ed[x],当mx(bi)-cov==0时表示x的当前块在这里结束,更新ed[x],此时是有单调性的可以two-pointers,复杂度$O(m \sqrt{n})$;

考虑散块。在处理完整块的时候枚举整块里的元素处理散块,如果直接像整块那样枚举m个操作,复杂度是$O(nm)$的,但如果在处理整块时用一个d数组记录下每一个和当前整块相交但不覆盖的操作,这样就是$O(m \sqrt{n})$的,因为一个操作最多有$\sqrt{n}$个散块,同样枚举d的元素做two-pointers,注意这是一个散块的ed不一定只出现在d里,可能出现在d[i]和d[i-1]中间某个将整块完整覆盖的操作,所以还需要记录完全覆盖整块的操作的前缀和s[],  覆盖整块的编号c[] , d[i]前面的第一个覆盖整块的操作e[i]。

细节多;

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=;
int n,m,a[N],b[N],c[N],d[N],e[N],vis[N],num,cn,dn,l[N],r[N],v[N],ed[N],s[N];
inline void upd(int&x,int y){if(x<y)x=y;}
struct node{int x,y;};
vector<node>g[N];
char gc(){
static char*p1,*p2,S[];
if(p1==p2)p2=(p1=S)+fread(S,,,stdin);
return(p1==p2)?EOF:*p1++;
}//
int rd(){
int x=; char C=gc();
while(C<''||C>'')C=gc();
while(C>=''&&C<='')x=(x<<)+(x<<)+C-'',C=gc();
return x;
}//
int main(){
//freopen("loj2461.in","r",stdin);
//freopen("loj2461.out","w",stdout);
n=rd(); m=rd();
Run(i,,n)a[i]=rd();
Run(i,,m)l[i]=rd(),r[i]=rd(),v[i]=rd();
int B = sqrt(n);
for(int L=;L<=n;L+=B){
cn=dn=;
int R=min(n,L+B-),mx=,cov=;
Run(i,L,R)upd(mx,b[i]=a[i]);
for(int i=,j=;i<=m;i++){
if(l[i]<=L&&r[i]>=R)cov--;
else if(l[i]<=R&&r[i]>=L){
Run(k,max(l[i],L),min(r[i],R))b[k]++;
mx=;Run(k,L,R)upd(mx,b[k]);
}
while(j<=m&&mx-cov>){
j++;
if(l[j]<=L&&r[j]>=R)cov++;
else if(l[j]<=R&&r[j]>=L){
Run(k,max(l[j],L),min(r[j],R))b[k]--;
mx=;Run(k,L,R)upd(mx,b[k]);
}
}
s[i]=s[i-];
if(l[i]<=L&&r[i]>=R)upd(ed[i],j),s[c[++cn]=i]++;
else if(l[i]<=R&&r[i]>=L)d[++dn]=i,e[dn]=cn;
}//
for(int i=L;i<=R;i++){
mx=a[i];
for(int j=,k=;j<=dn;j++){
mx+=s[d[j]]-s[d[j-]];
if(l[d[j]]<=i&&r[d[j]]>=i){
mx++;
while(k<dn&&mx>)k++,mx-=s[d[k]]-s[d[k-]]+(l[d[k]]<=i&&r[d[k]]>=i);
if(mx>){
if(s[m]-s[d[k]]<mx)upd(ed[d[j]],m+);
else upd(ed[d[j]],c[e[k]+mx]);
continue;
}
if(l[d[k]]<=i&&r[d[k]]>=i)upd(ed[d[j]],mx<?c[e[k]+mx+]:d[k]);
else upd(ed[d[j]],c[e[k]+mx]);
}
}
}//
}//
Run(i,,m)g[i].push_back((node){v[i],}),g[ed[i]].push_back((node){v[i],-});
for(int i=;i<=m;i++){
for(int j=;j<(int)g[i].size();j++){
int x=g[i][j].x,y=g[i][j].y;
if((vis[x]+y==)^(vis[x]==))num+=y;
vis[x]+=y;
}
printf("%d\n",num);
}
return ;
}//by tkys_Austin;

【loj2461】【2018集训队互测Day 1】完美的队列的更多相关文章

  1. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  2. 【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)

    点此看题面 大致题意: 让你维护\(n\)个有限定长度的队列,每次区间往队列里加数,求每次加完后的队列里剩余元素种类数. 核心思路 这道题可以用分块+双指针去搞. 考虑求出每个操作插入的元素在队列中被 ...

  3. [JZOJ6088] [BZOJ5376] [loj #2463]【2018集训队互测Day 1】完美的旅行【线性递推】【多项式】【FWT】

    Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记 ...

  4. @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列

    目录 @description@ @solution@ @part - 0@ @part - 1@ @accepted code@ @details@ @description@ 小 D 有 n 个 ...

  5. LOJ2476. 「2018 集训队互测 Day 3」蒜头的奖杯 & LOJ2565. 「SDOI2018」旧试题(莫比乌斯反演)

    题目链接 LOJ2476:https://loj.ac/problem/2476 LOJ2565:https://loj.ac/problem/2565 题解 参考照搬了 wxh 的博客. 为了方便, ...

  6. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  7. EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)

    享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...

  8. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  9. UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...

随机推荐

  1. Raft 一致性协议算法 《In search of an Understandable Consensus Algorithm (Extended Version)》

    <In search of an Understandable Consensus Algorithm (Extended Version)>   Raft是一种用于管理日志复制的一致性算 ...

  2. NOIP2018出征策

    蒟蒻的风之旅人即将退役,现在分享一下退休前的故事 首先,经过这么多时间的划水训练,我成功从一个萌新变成了一个蒟蒻.我学会了各种奇怪玄学的算法,比如说昨天老师讲的NOIP第三题通用的算法,叫做XG算法, ...

  3. Vue.js项目中,当图片无法显示时则显示默认图片

    使用require将图片进入,写法如下: data: () => ({logo: 'this.src="' + require('../assets/img.png') + '&quo ...

  4. “错误: 编码GBK的不可映射字符” 的解决方案

    命令行下,用javac命令编译java程序时,如果文档的编码为“utf-8”,并且含有中文字符时,会出现乱码现象,编译通过不了.如图: 解决方案:编译时指定编码方式,防止乱码.如下:

  5. 高可用Kubernetes集群-2. ca证书与秘钥

    四.CA证书与秘钥 kubernetes集群安全访问有两种方式:"基于CA签名的双向数字证书认证"与"基于BASE或TOKEN的简单认证",生产环境推荐使用&q ...

  6. centos 6.5 双网卡 上网 virtualbox nat hostonly

    虚拟机两张网卡:分别调成NAT(eth0)和host only(eht1)模式. nat的网卡不用设置,host only网卡调为(vi /etc/sysconfig/network-scripts/ ...

  7. NO.1:自学python之路------Hello world、判断、循环

    引言 人工智能如今越来越贴近生活,在这里将记录我自学python与tensorflow的过程.编程使用IDE:visual studio 2017,python版本3.6.4,tensorflow版本 ...

  8. 【Python进阶】用 Python 统计字数

    问题描述: 用 Python 实现函数 count_words(),该函数输入字符串 s 和数字 n,返回 s 中 n 个出现频率最高的单词.返回值是一个元组列表,包含出现次数最高的 n 个单词及其次 ...

  9. Amazon 成功的秘訣是…

    從任何的標準去看,今日的 Amazon,都是一家超級成功的企業 — 它的線上書城和其他 B2C 電子商務業務,全球第一,年營業額超過 200 億美金.它的 AWS (Amazon Web Servic ...

  10. Access连接数据源配置(新手必知)

    今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...