[EOJ439] 强制在线
Description
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] 强制在线的更多相关文章
- hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)
链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...
- 洛谷 P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 题目背景 曦月最近学会了快速排序,但是她很快地想到了,如果要动态地排序,那要怎么办呢? 题目描述 为了研究这个问题,曦月提出了一个十分简单的问题 曦月希望维护一个 ...
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...
- luoguP5105 不强制在线的动态快速排序
emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...
- [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔 http://blog.csdn.net/jiangyuze831/article/de ...
- 倍增 - 强制在线的LCA
LCA 描述 给一棵有根树,以及一些询问,每次询问树上的 2 个节点 A.B,求它们的最近公共祖先. !强制在线! 输入 第一行一个整数 N. 接下来 N 个数,第 i 个数 F i 表示 i 的父亲 ...
- P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...
- [Luogu5105]不强制在线的动态快速排序
首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...
- 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组
F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...
随机推荐
- 第五次spring会议
昨天所做之事: 昨天我对软件加上了换肤和透明度等功能. 今天所做之事: 我对软件加上了保密功能. private void 一键转密文ToolStripMenuItem_Click(object se ...
- zabbix简介与部署
zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管 ...
- 手动上传图片到nginx下可访问,程序上传后访问图片报403
1. 首先查看文件权限 2. 初步确定是服务器权限问题 2.1 解决方案一:更改文件权限 2.2 解决方案二:修改nginx运行用户 1. 首先查看文件权限 #指令如下 ls -l 2. 初步确定是服 ...
- ubuntu下签名命令
Platform: RockchipOS: Android 6.0Kernel: 3.10.92 拷贝签名文件/signapk.jar和apk到同一目录下. 签名文件:rk3288/build/tar ...
- GIS中空间数据和非空间数据
- BASH 基本语法
本节内容 1. 什么是shell script 2. 变量 3. 运算符 4. 流程控制 5. 函数 6. 计划任务 crontab 一 什么是shell script 将OS命令堆积到 ...
- vue高级组件之provide / inject
转载:https://blog.csdn.net/Garrettzxd/article/details/81407199 在vue中不同组件通信方式如下 1.父子组件,通过prop 2.非父子组件,通 ...
- Sublime Text3176激活码
此激活码为版本号为3176的激活码: 首先更改hosts文件防止Sublime Text3联网验证: Mac上hosts文件路径为/etc/hosts,所以需要sudo vim /etc/hosts ...
- JavaScripts中关于数字的精确计算方法
问题描述: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) ,我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这 ...
- 【金三银四跳槽季】Java工程师如何在1个月内做好面试准备?
目录 一.写在前面 二.技术广度的快速准备 三.技术深度的快速准备 四.基础功底的快速准备 五.下篇预告 一.写在前面 春节长假转眼已过,即将迎来的是一年一度的金三银四跳槽季. 假如你准备在金三银四跳 ...