[EOJ439] 强制在线
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;
}
转载于:https://www.cnblogs.com/YoungNeal/p/9857615.html
[EOJ439] 强制在线相关推荐
- 强制在线带修区间LCM(线段树+质因子状压)
题目链接:信息学奥赛比赛系统 | 强制在线带修区间LCM (qduoj.com) 先说点题外话,这个题目困扰了我一天多,刚ac,真的是太爽了,感觉从这里面学到的东西挺多的,所以就来分享一下. 题目的意 ...
- [Luogu5105]不强制在线的动态快速排序
首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...
- ONTAK2010 Peaks加强版(离线在线)
题面 弱化版:luogu 强制在线版:bzoj 题解 本题有两种解法 离线算法:线段树合并 先看一道简单题[USACO18JAN]MooTube 本题就是在此基础上求第\(k\)高的点 首先把询问和路 ...
- hdu 6579 Operation (在线线性基)
传送门 •题意 一个数组a有n个数 m个操作 操作① 询问$[l,r]$区间的异或值 操作② 在数组末尾追加一个数x,数组长度变为$n+1$ 其中$l,r$不直接给出,其中$l=l%n+1,r=r%n ...
- Hdu-5919 Sequence II(主席树在线求区间不同数)
Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,an There a ...
- 在线版区间众数 hzw的代码。。
/* 查询区间众数,要求强制在线 设有T个块 1.众数只可能在大块[L,R]里或者两端[l,L) (R,r]里出现 2.大块的众数只要预处理打表一下即可,复杂度n*T(这样的区间有T*T个) 3.两端 ...
- [BZOJ2653]middle
[BZOJ2653]middle 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左 ...
- 【BZOJ1015】【JSOI2008】星球大战 并查集
题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...
- 可持久化线段树(主席树)【舰娘系列】【自编题】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...
最新文章
- No.7 nginx、nfs、集群
- TensorFlow 第一步 开门见山:Hello World!
- neo4jcypher基本语句
- 命令创建vue项目工程
- Java io流详解四
- c 语言小游戏坦克大战,C++实现坦克大战小游戏EGE图形界面
- SAP创建供应商及采购订单
- 面试题数组L型输出思路
- Python实现VRP常见求解算法——蚁群算法(ACO)
- 传感器i2c与arduino连接_如何在两个Arduino开发板之间使用I2C总线进行通信
- 前端实现elementUi table表格分页
- php和html的关系
- 想要成为数据分析师 需要具备哪些专业技能?
- 智慧书-永恒的处世经典格言:241-280
- 零基础学浙大翁恺C语言(4):进一步的判断与循环
- 使用 SSM 框架实现发送手机短信验证码
- 解决ifconfig command not found 问题
- 从魔兽看四种设计模式(转载)
- maching learning入门(二)
- 围棋AI.续一.Sabaki+Leela Zero+Leelasabaki.2018年6月26日