【BZOJ4241】【回滚莫队】历史研究 (非题解的学习分析)
来源:互联网 发布:小白软件管家 知乎 编辑:程序博客网 时间:2024/05/19 18:13
回滚莫队:用于处理难以删除但是易于添加(其实易于删除难以添加也可以,但是没见过这样题-_-)的莫队,排序照常,如果左右端点在同一块直接暴力,这部分最多n sqrt n,否则把左端点在一块的一起处理,清空莫队,然后直接令莫队左端点在块尾,这部分n sqrtn,右端点照常走,这部分n sqrtn ,左端点每次走的时候记录更改了哪些量,走到地方记录完答案把修改回滚回去,这部分也是n sqrtn,所以复杂度还是根号的,但是把删除干掉了
neither_nor dalao 上课讲到回滚莫队,好像网上只有他写过。Orz%%%
例题:BZOJ4241
neither_nor 大佬的Blog
题目:
Description
IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记。JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件。
日记中记录了连续N天发生的时间,大约每天发生一件。
事件有种类之分。第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大。
JOI教授决定用如下的方法分析这些日记:
1. 选择日记中连续的一些天作为分析的时间段
2. 事件种类t的重要度为t*(这段时间内重要度为t的事件数)
3. 计算出所有事件种类的重要度,输出其中的最大值
现在你被要求制作一个帮助教授分析的程序,每次给出分析的区间,你需要输出重要度的最大值。
Input
第一行两个空格分隔的整数N和Q,表示日记一共记录了N天,询问有Q次。
接下来一行N个空格分隔的整数X1…XN,Xi表示第i天发生的事件的种类
接下来Q行,第i行(1<=i<=Q)有两个空格分隔整数Ai和Bi,表示第i次询问的区间为[Ai,Bi]。
Output
输出Q行,第i行(1<=i<=Q)一个整数,表示第i次询问的最大重要度
Sample Input
5 5
9 8 7 8 9
1 2
3 4
4 4
1 4
2 4
Sample Output
9
8
8
16
16
HINT
1<=N<=10^5
1<=Q<=10^5
1<=Xi<=10^9 (1<=i<=N)
Source
JOI 2013~2014 春季training合宿 竞技1 By PoPoQQQ
思路见上
分块和莫队套些奇怪的东西也可以过这题
//By neither_nor#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<iomanip> #include<cstring> #include<cmath> #include<ctime> #include<vector> #include<stack> #include<queue> #include<set> #include<bitset> #include<map> using namespace std; #define MAXN 100010 #define MAXM 100010 #define INF 1000000000 #define MOD 1000000007 #define ll long long #define eps 1e-8 char xB[1<<15],*xS=xB,*xT=xB; #define getc() (xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)inline int read() { int x=0,f=1;char xch=getc(); while(xch<'0'|xch>'9'){if(xch=='-')f=-1;xch=getc();} while(xch>='0'&&xch<='9'){x=x*10+xch-'0';xch=getc();} return x*f;}struct que { int l; int r; int num; int k; friend bool operator < (que x, que y){ return x.k != y.k ? x.k < y.k : x.r < y.r; }};int siz;que q[MAXM];int a[MAXN];int cnt[MAXN];ll ans[MAXN];int num[MAXN];int visc[MAXN];ll ANS;map<int,int>h;int tls[MAXN],tln,mx;int g[MAXN];int n,m;int L,R;int T;int *st[MAXN];int stv[MAXN],tp;ll *sta[MAXN];ll stva[MAXN];int tpa;void roolback() { while(tp) (*st[tp]) = stv[tp--]; while(tpa) (*sta[tpa])=stva[tpa--];}int main() { int i,j; n = read(); m = read(); for(i = 1; i <= n; i++) a[i] = read(), tls[++tln] = a[i]; sort(tls+1, tls+tln+1); tls[0] = -INF; for(i = 1; i <= tln; i++) if(tls[i] != tls[i-1]) h[tls[i]] = ++mx, g[mx] = tls[i]; for(i = 1; i <= n; i++) a[i] = h[a[i]]; siz = sqrt(n); for(i = 1; i <= m; i++) { q[i].l = read(); q[i].r = read(); q[i].k = (q[i].l-1)/siz+1; q[i].num = i; } sort(q+1, q+m+1); for(i = 1; i <= m; i++) { if(q[i].k != q[i-1].k) { T++; L = siz*q[i].k+1; R = L-1; ANS = 0; } if(q[i].r < L) { ANS = 0; for(j = q[i].l; j <= q[i].r; j++) { if(visc[a[j]] != T) cnt[a[j]] = 0; visc[a[j]] = T; cnt[a[j]]++; if((ll)g[a[j]]*cnt[a[j]] > ANS) ANS = (ll)g[a[j]]*cnt[a[j]]; } ans[q[i].num] = ANS; T++; ANS = 0; continue ; } while(R < q[i].r) { R++; if(visc[a[R]] != T) cnt[a[R]] = 0; visc[a[R]] = T; cnt[a[R]]++; if((ll)g[a[R]]*cnt[a[R]] > ANS) ANS = (ll)g[a[R]]*cnt[a[R]]; } while(L > q[i].l) { L--; if(visc[a[L]] != T) cnt[a[L]] = 0; st[++tp] = &visc[a[L]]; stv[tp] = visc[a[L]]; visc[a[L]] = T; st[++tp] = &cnt[a[L]]; stv[tp] = cnt[a[L]]; cnt[a[L]]++; if((ll)g[a[L]]*cnt[a[L]] > ANS) { sta[++tpa] = &ANS; stva[tpa] = ANS; ANS = (ll)g[a[L]]*cnt[a[L]]; } } ans[q[i].num] = ANS; roolback(); L = siz*q[i].k+1; } for(i = 1; i <= m; i++) printf("%lld\n",ans[i]); return 0;}
- 【BZOJ4241】【回滚莫队】历史研究 (非题解的学习分析)
- bzoj4241 历史研究 (回滚莫队)
- bzoj4241 历史研究 回滚莫队
- [bzoj4241]历史研究 回滚莫队
- [BZOJ4241]-历史研究-回滚莫队
- BZOJ4241 历史研究 (分块 回滚莫队-教程向)
- 【bzoj4241】历史研究
- 【bzoj4241】历史研究 分块
- [bzoj4241]历史研究
- BZOJ4241 历史研究
- 【bzoj4241】 历史研究
- bzoj4241: 历史研究
- 【bzoj4241】历史研究
- Bzoj4241:历史研究:莫队算法
- BZOJ4241 历史研究 莫队算法 堆
- BZOJ 4241 历史研究 (回滚莫队)
- 并行计算的研究历史
- [BZOJ]4241 历史研究 回滚莫队
- Java锁工作机制
- 图解基于node.js实现前后端分离
- Android Studio 使用教程(十九)之引用library项目开源库
- JSON API免费接口
- el表达式
- 【BZOJ4241】【回滚莫队】历史研究 (非题解的学习分析)
- MySQL 学习<十五> 日志
- ASP.NET之旅--深入浅出解读IIS架构
- 给php安装redis拓展
- 仿淘宝支付密码输入框
- weex采坑之旅(二)JDK version环境搭建
- 微型技术博客-Qt实现简单界面.
- H5动画
- Android之service生命周期及启动方式