bzoj 1878(莫队)(主席树)
来源:互联网 发布:提取网页数据到excel 编辑:程序博客网 时间:2024/06/16 07:37
传送门
解法:
1.莫队
2.主席树
3.(离线)树状数组
理论时间复杂度第二/三个要快一点,logn比根号n小一些,但是不知道为什么贴的别人的代码(含读优)跑出来反而慢ㄟ( ▔, ▔ )ㄏ
#include<bits/stdc++.h>using namespace std;const int MAXN=5e4+4,MAXM=2e5+4;int n,m,siz;int cnt[MAXM*5],bel[MAXN],num[MAXN],ans[MAXM];struct Q { int l,r,id; friend bool operator <(const Q &x,const Q &y) { return bel[x.l]==bel[y.l]?x.r<y.r:x.l<y.l; }}q[MAXM];inline int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*f;}int main() {// freopen("bzoj 1878.in","r",stdin); n=read(); for (register int i=1;i<=n;++i) num[i]=read(); siz=(int)sqrt((double)n); for (register int i=1;i<=n;++i) bel[i]=i/siz; m=read(); for (register int i=1;i<=m;++i) q[i].l=read(),q[i].r=read(),q[i].id=i; sort(q+1,q+m+1); for (register int i=1,l=1,r=0,ret=0;i<=m;++i) { while (l>q[i].l) {++cnt[num[--l]];if (cnt[num[l]]==1) ++ret;} while (r<q[i].r) {++cnt[num[++r]];if (cnt[num[r]]==1) ++ret;} while (l<q[i].l) {--cnt[num[l++]];if (cnt[num[l-1]]==0) --ret;}//-1!!! while (r>q[i].r) {--cnt[num[r--]];if (cnt[num[r+1]]==0) --ret;}//+1!!! ans[q[i].id]=ret; } for (register int i=1;i<=m;++i) printf("%d\n",ans[i]); return 0;}
主席树:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=5e4+4;int n,m,a[MAXN],nxt[1000004];int root[MAXN<<1],sum[(MAXN<<1)*22],lc[(MAXN<<1)*22],rc[(MAXN<<1)*22],tim=0;inline int read() { int x=0;char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x;}void Insert(int pre,int &rt,int l,int r,int pos,int delta) { rt=++tim; sum[rt]=sum[pre]+delta,rc[rt]=rc[pre],lc[rt]=lc[pre]; if (l==r) return ; int mid=l+r>>1; if (pos<=mid) Insert(lc[pre],lc[rt],l,mid,pos,delta); else Insert(rc[pre],rc[rt],mid+1,r,pos,delta);}int query(int rt,int l,int r,int L,int R) { if (L<=l&&r<=R) return sum[rt]; int mid=l+r>>1,ret=0; if (L<=mid) ret+=query(lc[rt],l,mid,L,R); if (mid<R) ret+=query(rc[rt],mid+1,r,L,R); return ret;}int main() { memset(nxt,-1,sizeof(nxt)); n=read(); for (register int i=1;i<=n;++i) { a[i]=read(); if (~nxt[a[i]]) { Insert(root[i-1],root[i],1,n,nxt[a[i]],-1); Insert(root[i],root[i],1,n,i,1); } else Insert(root[i-1],root[i],1,n,i,1); nxt[a[i]]=i; } m=read(); for (register int i=0;i<m;++i) { int u=read(),v=read(); printf("%d\n",query(root[v],1,n,u,v)); } return 0;}
阅读全文
0 0
- bzoj 1878(莫队)(主席树)
- bzoj 1803(主席树)
- Bzoj 2653 middle(二分+主席树)
- bzoj 3524: [Poi2014]Couriers(主席树)
- bzoj 2653: middle (二分+主席树)
- BZOJ 4448 主席树+树链剖分(在线)
- bzoj 3207(主席树+hash)
- bzoj 2653(主席树+二分)
- bzoj 3123(主席树+启发式合并)
- bzoj 3524(主席树+二分)
- bzoj 1803(DFS序+主席树)
- bzoj 4539: [Hnoi2016]树(缩点+主席树+lca)
- [BZOJ]2809: [Apio2012]dispatching 主席树(线段树合并)
- bzoj 4448(LCA+主席树)(离线)
- Bzoj 1901 Zju2112 Dynamic Rankings(树状数组+主席树)
- bzoj 4448: [Scoi2015]情报传递 (树上主席树)
- bzoj 3772: 精神污染 (主席树+dfs序)
- bzoj 3653: 谈笑风生 (主席树+dfs序)
- configure: error: xml2-config not found. Please check your libxml2 installation
- 基于OpenCV的简易四肢位置识别与动作识别
- Min Stack 最小栈
- 八、JDBC——分页查询(mysql的limit方法)
- 高质量深度学习资源总结:128篇论文,21大领域
- bzoj 1878(莫队)(主席树)
- 排序算法(七)-堆排序
- 代理服务器的原理,代理服务器和vpn的区别
- Maven搭建SSH案例(二)-----SSH框架在maven中的配置
- 2016年,某猎头给我的面试准备资料
- 排序算法(八)-基数排序
- OGNL基本使用
- 《推拿》
- 工程中js代码小技巧