Description

题面

Solution

分块套分块,分别对时间和位置进行分块

差不多是一个定期保存信息的方法

对于询问我们不妨求出 \(>=x\) 的答案,然后用 \(m-(>=x)\) 的答案,避免了严格小于带来的麻烦

暴力做法是把数字从大到小加入,然后每一次做区间修改,主席树维护一下,但空间复杂度太大

我们同样这么做,想办法均摊时间和空间复杂度

我们设定一个 \(S\),每过 \(S\) 的时间就将主席树维护的东西暴力存下来

但是暴力存下来空间开不下,我们想办法对序列分块,分别保存每一个块内的最大值

每一个时刻的修改,我们就对块外暴力做,块内打标记,因为我们每过 \(S\) 的时间就要暴力存,留到这个时候再放标记,大致就是这样

inline void Modify(int k,int l,int r){
if(b[l]==b[r]){
for(int i=l;i<=r;i++)w[i]++;
return ;
}
for(int i=l;i<=br[b[l]];i++)w[i]++;
for(int i=b[l]+1;i<b[r];i++)la[i]++;
for(int i=bl[b[r]];i<=r;i++)w[i]++;
}

每过 \(S\) 时间我们暴力存下来,\(f[k][i]\) 表示前 \(k\) 个时刻的块,第 \(i\) 个块的 \(F\) 的最大值, \(st[k][i]\) 表示每一个块开头的 \(F\) 值

inline void rec(int k){
for(int i=1;i<=cnt;i++){
for(int j=bl[i];j<=br[i];j++)
f[k][i]=max(f[k][i],w[j]+=la[i]);
st[k][i]=w[bl[i]];la[i]=0;
}
}

对于询问,对于 \(>x\) 的块,我们只关心每一个块的最值,我们直接把 \(f\) 数组拿来用就行了,然后就是 \(x\) 所在块内的修改

我们还是按照 \(Modify\) 函数那样暴力改,但是每改一次需要花费 \(O(S)\) 的时间,复杂度不太对,但实际上这样有很多重复的计算

我们实际上是把某些块做区间加法 , 同一块内的元素相对值不变,所以最值也不会改变,用差分维护一下最值的增量就行了

块外的元素会改变,我们直接把改变之后的值记下来就好了

所以预处理出 \(pre[i],suf[i]\) 表示第 \(i\) 时刻的修改之后,这两个块外的元素所在的块的最值

这样一次修改复杂度就是 \(O(1)\) 的了

#include<bits/stdc++.h>
using namespace std;
const int N=200010,M=510;
int n,m,lis[N],a[N],bc,b[N],bl[N],br[N],p[N],cnt,v[N];
int f[M][M],la[N],w[N],st[M][M],pre[N],suf[N],ed[N];
inline bool comp(int i,int j){return a[i]>a[j];}
inline void Modify(int k,int l,int r){
if(b[l]==b[r]){
for(int i=l;i<=r;i++)w[i]++;
for(int i=bl[b[l]];i<=br[b[l]];i++)pre[k]=max(pre[k],w[i]);
return ;
}
for(int i=l;i<=br[b[l]];i++)w[i]++;
for(int i=bl[b[l]];i<=br[b[l]];i++)pre[k]=max(pre[k],w[i]);
for(int i=b[l]+1;i<b[r];i++)la[i]++;
for(int i=bl[b[r]];i<=r;i++)w[i]++;
for(int i=bl[b[r]];i<=br[b[r]];i++)suf[k]=max(suf[k],w[i]);
}
inline void rec(int k){
for(int i=1;i<=cnt;i++){
for(int j=bl[i];j<=br[i];j++)
f[k][i]=max(f[k][i],w[j]+=la[i]);
st[k][i]=w[bl[i]];la[i]=0;
}
}
inline int qry(int l,int r,int k,int x){
int now=v[k],ret=0;
for(int i=bl[k];i<l;i++)now+=(a[i+m]>=x)-(a[i]>=x);
for(int i=l;i<=r;i++)ret=max(ret,now),now+=(a[i+m]>=x)-(a[i]>=x);
return ret;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d%d",&n,&m);bc=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),lis[i]=a[i],p[i]=i;
sort(lis+1,lis+n+1);
int tp=unique(lis+1,lis+n+1)-lis-1,Q,ans=0;
for(int i=1;i<=n;i++)a[i]=lower_bound(lis+1,lis+tp+1,a[i])-lis;
for(int i=1,t;i<=n;i++)t=b[i]=(i-1)/bc+1,bl[t]=bl[t]?bl[t]:i,br[t]=i;
sort(p+1,p+n+1,comp);cnt=b[n];
for(int i=1;i<=n;i++){
Modify(i,max(1,p[i]-m+1),p[i]);
if(b[i]!=b[i+1])rec(b[i]),ed[b[i]]=a[p[i]];
}
cin>>Q;
while(Q--){
int l,r,x,t=1;
scanf("%d%d%d",&l,&r,&x);
x=lower_bound(lis+1,lis+tp+1,x^ans)-lis;
while(t<cnt && ed[t]>=x)t++;
for(int i=1;i<=cnt;i++)w[i]=f[t-1][i],v[i]=st[t-1][i],la[i]=0;
for(int i=bl[t];i<=br[t] && a[p[i]]>=x;i++){
int L=max(1,p[i]-m+1),R=p[i],A=b[L],B=b[R];
if(A==B)w[A]=pre[i];
else{
w[A]=pre[i];w[B]=suf[i];
la[A+1]++;la[B]--;
}
if(L<=bl[b[l]] && bl[b[l]]<=R)v[b[l]]++;
if(b[l]!=b[r] && L<=bl[b[r]] && bl[b[r]]<=R)v[b[r]]++;
}
for(int i=1;i<=cnt;i++)la[i]+=la[i-1];
int A=b[l],B=b[r];
if(A==B)ans=qry(l,r,A,x);
else{
ans=max(qry(l,br[A],A,x),qry(bl[B],r,B,x));
for(int i=A+1;i<B;i++)ans=max(ans,la[i]+w[i]);
}
ans=m-ans;
printf("%d\n",ans);
}
return 0;
}

Codeforces 543E. Listening to Music的更多相关文章

  1. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  2. Codeforces Round #164 (Div. 2) E. Playlist 贪心+概率dp

    题目链接: http://codeforces.com/problemset/problem/268/E E. Playlist time limit per test 1 secondmemory ...

  3. Codeforces Round #188 (Div. 2) B. Strings of Power 水题

    B. Strings of Power Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/318/p ...

  4. CodeForces 569A 第六周比赛C踢

    C - C Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  5. codeforces 569A Music

    codeforces  569A   Music   解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88890#pro ...

  6. Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale 二分

    C. Anton and Fairy Tale 题目连接: http://codeforces.com/contest/785/problem/C Description Anton likes to ...

  7. Codeforces Round #289 (Div. 2, ACM ICPC Rules) E. Pretty Song 算贡献+前缀和

    E. Pretty Song time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. Codeforces Round #404 (Div. 2) A,B,C,D,E 暴力,暴力,二分,范德蒙恒等式,树状数组+分块

    题目链接:http://codeforces.com/contest/785 A. Anton and Polyhedrons time limit per test 2 seconds memory ...

  9. Codeforces Round #315 (Div. 2) (ABCD题解)

    比赛链接:http://codeforces.com/contest/569 A. Music time limit per test:2 seconds memory limit per test: ...

随机推荐

  1. asp.net——Ajax与ashx异步请求的简单案例

    Ajax与ashx异步请求的简单案例: 前台页面(aspx): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  2. Apache 中httpd.conf文件配置详解(转载)

    httpd.conf文件配置详解   Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现.下面让我们来看看htt ...

  3. python urllib2 对 http 的 get,put,post,delete

    #GET: #!/usr/bin/env python# -*- coding:utf-8 -*-import urllib2def get():    URL = 'www.baidu.com'   ...

  4. 洛谷P5273 【模板】多项式幂函数 (加强版)

    题面 传送门 题解 这里最麻烦的问题就是它不保证\(A_0=1\) 如果\(A_0>1\),那么直接整个多项式乘上个\(A_0\)的逆元,最后输出答案的时候再把答案乘上\({A_0}^m\) 如 ...

  5. bzoj4241: 历史研究(回滚莫队)

    传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...

  6. SSO单点登录入门

    1,SSO简介 SSO(Single Sign-On,单点登录)是身份管理中的一部分.SSO 的一种较为通俗的定义是:SSO 是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过 ...

  7. redis 3.0 集群__监控警报工具(sentinel)

    参考文档 http://redis.readthedocs.org/en/latest/topic/sentinel.html 因为目前还处于开发阶段,就先不研究了,待续

  8. UIEvent笔记

    UIEvent是什么 代表iOS系统中的一个事件. UIEvent分为三类,touch events, motion events, and remote-control events touch e ...

  9. 解决mysql最大允许传输包不足的问题

    一.报错提示内容和原因 在执行“数据传输”或者“运行SQL文件”时报错误:Got a packet bigger than 'max_allowed_packet' bytes With,表明当前所传 ...

  10. iis+php(FastCGI)

    1. 安装 IIS 时选择添加 CGI 功能 2. 安装 PHP, 2.1 下载 nts 版本 (非线程安全版本) zip 压缩包,下载对应的 vc++ 运行时(php官网下载页面左侧有下载链接) 2 ...