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. 学习Acegi应用到实际项目中(2)

    Acegi应用到实际项目中(1)是基于BasicProcessingFilter的基本认证,这篇改用AuthenticationProcessingFilter基于表单的认证方式. 1.authent ...

  2. 2019.03.01 bzoj3075: [Usaco2013]Necklace(kmp+dp)

    传送门 题意简述:给出S,TS,TS,T两个字串,∣S∣≤10000,∣T∣≤1000|S|\le10000,|T|\le1000∣S∣≤10000,∣T∣≤1000,问至少从SSS中删去几个字符能够 ...

  3. js计算器---转

    至今见过的一个还没问题的计算器,收藏在此. 转自javascript写的简单的计算器原文链接,谢分享! js部分 ar num=0,result=0,numshow="0"; va ...

  4. 如何监控redis的cpu使用率

    redis默认是单线程运行的,为了充分利用机器的cpu,正常情况下一台服务器上会装多个实例.如果通过top命令监控机器的cpu的话,监控值很笼统,不能精确到单redis实例的cpu使用率监控.而且ce ...

  5. [ 9.29 ]CF每日一题系列—— 765B字符串规律

    Description: 遇到了ogo可以变成***如果ogo后面有go统统忽略,输出结果 Solution: 哎如果我一开始对题意的解读如上的话,就不会被整的那么麻烦了 Code: #include ...

  6. A - 饭卡

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...

  7. Mybatis关系映射

    一.一对一关系映射 使用resultType+包装类实现 1.假设问题背景是要求在某一个购物平台的后台程序中添加一个这样的功能:查询某个订单的信息和下该订单的用户信息.首先我们可以知道,一般这样的平台 ...

  8. Javascript高级编程学习笔记(10)—— 作用域、作用域链

    昨天介绍了,JS中函数的作用域 什么词法环境之类的,可能很多小伙伴不太明白. 在今天的内容开始之前,先做个简短的声明: 词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let.const声 ...

  9. 关于elasticsearch function_score的使用

    最近做新闻推荐系统,新闻搜索采用的是elasticsearch引擎,为了使推荐更接近用户偏好,搜索时使用了function_score功能对文档进行了重新打分,改变排序规则.以下介绍关于functio ...

  10. 开源性能测试工具Locust使用篇(三)

    脚本增强 面对较复杂的测试场景,我们可能还是会感觉无从下手:例如,很多时候脚本需要做关联或参数化处理,Locust中就不知道怎么实现了.可能也是这方面的原因,感觉难以将Locust应用到实际的性能测试 ...