BZOJ 1878: [SDOI2009]HH的项链 树状数组+乱搞
2016-10-14 09:50
363 查看
时空隧道
分析:
以前看过一道类似的题目(具体是啥不记得了)….所以这次还有点思路…
我们考虑如果没有重复的数字直接算就好了…有重复的数字就应该每个数字只计算一次…怎么实现这种思想….
考虑对于一个询问,第一次出现的数字就是最靠左的数字,那么我们就把这个区间中第一次出现的数字设为1,求个前缀和就好了…
所以说我们可以离线做…把所有询问按照左端点排序…对于当前的询问答案就直接计算前缀和就好…计算完之后,对于s[i].l~s[i+1].l-1这些数字,insert(j,-1),insert(nxt[j],1),这样就保证了对于当前的询问数组中设为1的数字都是不重复的….而且也不会漏掉一些数字…
代码如下:
by >_< NeighThorn
分析:
以前看过一道类似的题目(具体是啥不记得了)….所以这次还有点思路…
我们考虑如果没有重复的数字直接算就好了…有重复的数字就应该每个数字只计算一次…怎么实现这种思想….
考虑对于一个询问,第一次出现的数字就是最靠左的数字,那么我们就把这个区间中第一次出现的数字设为1,求个前缀和就好了…
所以说我们可以离线做…把所有询问按照左端点排序…对于当前的询问答案就直接计算前缀和就好…计算完之后,对于s[i].l~s[i+1].l-1这些数字,insert(j,-1),insert(nxt[j],1),这样就保证了对于当前的询问数组中设为1的数字都是不重复的….而且也不会漏掉一些数字…
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn using namespace std; const int maxn=50000+5,maxm=1000000+5; int n,m,a[maxn],tr[maxn],pos[maxm],nxt[maxn]; struct M{ int l,r,id,ans; }s[200000+5]; inline bool cmp1(M a,M b){ if(a.l==b.l) return a.r<b.r; return a.l<b.l; } inline bool cmp2(M a,M b){ return a.id<b.id; } inline void insert(int x,int y){ for(;x<=1000000;x+=x&(-x)) tr[x]+=y; } inline int query(int x){ int sum=0; for(;x;x-=x&(-x)) sum+=tr[x]; return sum; } signed main(void){ scanf("%d",&n);memset(tr,0,sizeof(tr)); memset(pos,0,sizeof(pos)); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(pos[a[i]]==0) insert(i,1),pos[a[i]]=i; else nxt[pos[a[i]]]=i,pos[a[i]]=i; } scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d%d",&s[i].l,&s[i].r),s[i].id=i; sort(s+1,s+m+1,cmp1);s[0].l=0; for(int i=1;i<=m;i++){ // cout<<s[i].l<<" "<<s[i].r<<endl; s[i].ans=query(s[i].r); // cout<<s[i].ans<<endl; if(i<m&&s[i].l!=s[i+1].l) for(int j=s[i].l;j<s[i+1].l;j++){ insert(j,-1); if(nxt[j]) insert(nxt[j],1); } } sort(s+1,s+m+1,cmp2); for(int i=1;i<=m;i++) printf("%d\n",s[i].ans); return 0; }
by >_< NeighThorn
相关文章推荐
- BZOJ 1878 【SDOI2009】HH的项链(离线+树状数组)
- BZOJ 1878 【SDOI2009】HH的项链(离线+树状数组)
- [树状数组(离线)]BZOJ 1878: [SDOI2009]HH的项链 题解
- 【SDOI2009】【bzoj1878】HH的项链(离线+树状数组)
- BZOJ 1878 [SDOI2009]HH的项链 离线+树状数组
- 【bzoj1878】[SDOI2009]HH的项链 树状数组
- BZOJ 1878 [SDOI2009]HH的项链(扫描线+树状数组)
- [BZOJ 1878][SDOI2009]HH的项链 (离线,树状数组)
- BZOJ1878: [SDOI2009]HH的项链
- 【BZOJ1878】[SDOI2009]HH的项链 树状数组
- 洛谷 P1972 BZOJ 1878 [SDOI2009]HH的项链
- [bzoj1878][SDOI2009]HH的项链
- 1878: [SDOI2009]HH的项链 树状数组
- BZOJ 1878 [SDOI2009]HH的项链
- bzoj 1878: [SDOI2009]HH的项链(莫队算法)
- BZOJ1878: [SDOI2009]HH的项链
- BZOJ1878:[SDOI2009]HH的项链——题解
- bzoj 1878: [SDOI2009]HH的项链
- bzoj1878 [SDOI2009]HH的项链(离线+树状数组/莫队)
- 【主席树|莫队|离线树状数组】BZOJ1878 [SDOI 2009]HH的项链