Description

EOJ439

Solution

先考虑不强制在线怎么做。

按询问区间右端点排序,从左往右扫,维护所有后缀的答案。

如果扫到 \(a[i]\),那么让统计个数的 \(cnt[a[i]]++\).

如果\(cnt[a[i]]<a[i]\),那么在当前的右端点固定的情况下这个\(a[i]\)不会有任何的贡献。

如果\(cnt[a[i]]=a[i]\),那么可以让\([1,pre[i]]\)区间加\(1\),其中\(pre[i]\)代表从\(i\)向前第\(a[i]\)个\(a[i]\)出现的位置。

如果\(cnt[a[i]]>a[i]\),那么需要让\((pos[pos[pre[i]]],pos[pre[i]]]\)区间减\(1\),其中\(pos[i]\)代表从\(i\)向前第\(1\)个\(a[i]\)出现的位置,同时还需要让\((pos[pre[i]],pre[i]]\)区间加\(1\)。

这个放上线段树区间修改单点查询就好了。

但是要求强制在线。

推上主席树。

还要区间修改。

pushdown空间巨大?

标记永久化。

Code

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cctype>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using std::min;
using std::max;
using std::swap;
using std::vector;
const int N=1e5+5;
typedef double db;
const int maxn=1e5;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B) vector<int> v[N];
int n,q,a[N],sum[N*30],cov[N*30];
int root[N],ch[N*30][2],cnts[N],tot; int getint(){
int X=0,w=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
} int modify(int pre,int l,int r,int ql,int qr,int c){
int cur=++tot;
ch[cur][0]=ch[pre][0];ch[cur][1]=ch[pre][1];
sum[cur]=sum[pre]+c*(qr-ql+1);cov[cur]=cov[pre];
if(ql<=l and r<=qr){
cov[cur]+=c;
return cur;
} int mid=l+r>>1;
if(qr<=mid) ch[cur][0]=modify(ch[pre][0],l,mid,ql,qr,c);
else if(ql>mid) ch[cur][1]=modify(ch[pre][1],mid+1,r,ql,qr,c);
else{
ch[cur][0]=modify(ch[pre][0],l,mid,ql,mid,c);
ch[cur][1]=modify(ch[pre][1],mid+1,r,mid+1,qr,c);
} return cur;
} int query(int cur,int l,int r,int ql,int qr,int add){
if(ql<=l and r<=qr) return sum[cur]+add*(r-l+1);
int mid=l+r>>1;
if(qr<=mid) return query(ch[cur][0],l,mid,ql,qr,add+cov[cur]);
else if(ql>mid) return query(ch[cur][1],mid+1,r,ql,qr,add+cov[cur]);
else return query(ch[cur][0],l,mid,ql,mid,add+cov[cur])+query(ch[cur][1],mid+1,r,mid+1,qr,add+cov[cur]);
} signed main(){
n=getint(),q=getint();
for(int i=1;i<=n;i++) v[i].pb(0);
for(int i=1;i<=n;i++){
a[i]=getint();
root[i]=root[i-1];
if(a[i]>n)
continue;
cnts[a[i]]++;
v[a[i]].pb(i);
if(cnts[a[i]]==a[i])
root[i]=modify(root[i],1,n,1,v[a[i]][1],1);
else if(cnts[a[i]]>a[i]){
int sze=v[a[i]].size();
root[i]=modify(root[i],1,n,v[a[i]][sze-a[i]-2]+1,v[a[i]][sze-a[i]-1],-1);
root[i]=modify(root[i],1,n,v[a[i]][sze-a[i]-1]+1,v[a[i]][sze-a[i]],1);
}
} int lasans=0;
while(q--){
int x=getint()^lasans,y=getint()^lasans;
printf("%d\n",lasans=query(root[y],1,n,x,x,0));
} return 0;
}

[EOJ439] 强制在线的更多相关文章

  1. hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)

    链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...

  2. 洛谷 P5105 不强制在线的动态快速排序

    P5105 不强制在线的动态快速排序 题目背景 曦月最近学会了快速排序,但是她很快地想到了,如果要动态地排序,那要怎么办呢? 题目描述 为了研究这个问题,曦月提出了一个十分简单的问题 曦月希望维护一个 ...

  3. luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set

    不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...

  4. luoguP5105 不强制在线的动态快速排序

    emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...

  5. [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树

    jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔   http://blog.csdn.net/jiangyuze831/article/de ...

  6. 倍增 - 强制在线的LCA

    LCA 描述 给一棵有根树,以及一些询问,每次询问树上的 2 个节点 A.B,求它们的最近公共祖先. !强制在线! 输入 第一行一个整数 N. 接下来 N 个数,第 i 个数 F i 表示 i 的父亲 ...

  7. P5105 不强制在线的动态快速排序

    P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...

  8. [Luogu5105]不强制在线的动态快速排序

    首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...

  9. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

随机推荐

  1. 解决win10系统无法安装.NET Framework 3.5

    方法1:“我的电脑”,单击右键选择“管理” 在打开的“计算机管理”窗口中依路径“服务和应用程序—服务”打开,在列表中找到“Windows Update”并双击打开. 启动类型:自动. 服务状态下面点击 ...

  2. List,set,Map理解

    集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  3. nginx简单权限配置

    一.指定ip段 location / { allow 172.17.0.1/24; deny all; } 二.指定认证账户 location / { auth_basic "please ...

  4. LVS、Nginx 及 HAProxy 工作原理

    当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器 ...

  5. php,mysql存储过程的简单例子

    一.连接mysql 使用phpmyadmin: 打开test数据库: 二.创建存储过程 参数如图. 三.php中调用存储过程 <?php $user = "root"; // ...

  6. Vuejs(14)——在v-for中,利用index来对第一项添加class

    版权声明:出处http://blog.csdn.net/qq20004604 (1)在v-for中,利用index来对第一项添加class <a class="list-group-i ...

  7. SDWebImage之SDWebImageCompat

    SDWebImageCompat 是SDWebImage 的配置文件,里面利用条件编译对Apple 的各个平台进行了兼容.从源码中可以看到SDWebImage 支持当前的MAC/iOS/TV/WATC ...

  8. 在Azure DevOps Server (TFS 2019) 流水线传递参数

    变量概述 在Azure DevOps Server的流水线中,变量是衔接不同任务和不通代理之间的桥梁,它可以使相对松散.各自独立的任务之间相关影响并共享数据.在流水线中使用变量,可以在各任务之间相互调 ...

  9. HSmartWindowControl 之 显示图像

    概述:使用Halcon在VS中的控件显示一张图片. 要点:使用了图像缩放和图像显示函数,以及鼠标滚轮响应函数. 1.创建WinForm项目 首先在VS中添加Halcon所需的控件HSmartWindo ...

  10. xampp/apache启动失败解决方法

    我的问题是: 9:15:53 AM  [Apache] Error: Apache shutdown unexpectedly.9:15:53 AM  [Apache] This may be due ...