HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一
段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一
个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只
好求助睿智的你,来解决这个问题。
标签:isp 带来 img put 一个 class 依次 output 不难
M行,每行一个整数,依次表示询问对应的答案。
#include<bits/stdc++.h> using namespace std; struct question{ int l,r,ans,idx; }q[200005]; int n,m,mx=0; int necklace[50005],pos[1000005],nextx[50005],node[50005]; int lowbit(int a) { return a&(-a); } int add(int k,int val) { for(;k<=n;k+=lowbit(k)) node[k]+=val; } int ask(int k) { int sum=0; for(;k>0;k-=lowbit(k)) sum+=node[k]; return sum; } int maxn(int a,int b) { return a>b?a:b; } bool cmp1(question a,question b) { return a.l<b.l; } bool cmp2(question a,question b) { return a.idx<b.idx; } int main() { memset(pos,0,sizeof(pos)); memset(nextx,0,sizeof(nextx)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&necklace[i]); mx=maxn(mx,necklace[i]); } for(int i=n;i>=1;i--) { nextx[i]=pos[necklace[i]]; pos[necklace[i]]=i; } for(int i=1;i<=mx;i++) if(pos[i]) add(pos[i],1); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d%d",&q[i].l,&q[i].r); q[i].idx=i; } sort(q+1,q+1+m,cmp1); int L=1; for(int i=1;i<=m;i++) { while(L<q[i].l) { if(nextx[L]) add(nextx[L],1); L++; } q[i].ans=ask(q[i].r)-ask(q[i].l-1); } sort(q+1,q+1+m,cmp2); for(int i=1;i<=m;i++) printf("%d\n",q[i].ans); }
标签:isp 带来 img put 一个 class 依次 output 不难
原文地址:https://www.cnblogs.com/nanjolno/p/8974131.html