2011-04-22 19:03:01 700ms过了数构,过不了FOJ!!!! #include<iostream> #include<algorithm> #define N 100010 using namespace std; struct Node { int value; int index; }a[N]; int b[N],c[N]; int cmp(Node a,Node b) { return a.value<b.value; } int main() { int n,i,j,t,first,last,quiry,count; while (scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&a[i].value); a[i].index=i; } sort(a,a+n,cmp); t=0; b[a[0].index]=t; for(i=1;i<n;i++) { if(a[i].value!=a[i-1].value) t++; b[a[i].index]=t; } scanf("%d",&quiry); for(i=0;i<quiry;i++) { scanf("%d%d",&first,&last); first--; last--; count=last-first+1; for(j=0;j<t+1;j++) c[j]=0; for(j=first;j<=last;j++) { if(!c[b[j]]) { c[b[j]]=1; } else { count--; } } printf("%d/n",count); } } return 0; } 687ms过OJ: #include<iostream> #include<string> #include<algorithm> #define N 100010 using namespace std; struct Data { int vlaue,index; }a[N]; int cnt[N]; int cmp(Data a,Data b) { return (a.vlaue<b.vlaue)||(a.vlaue==b.vlaue&&a.index<b.index); } int main() { int i,j,s,t,n,inquiry; while (scanf("%d",&n)==1) { for(i=1;i<=n;i++) { scanf("%d",&a[i].vlaue); a[i].index=i; } for(i=0;i<=n;i++) cnt[i]=0; sort(a+1,a+n+1,cmp); for(i=2;i<=n;i++) if(a[i].vlaue==a[i-1].vlaue) cnt[a[i].index]=a[i-1].index; scanf("%d",&inquiry); while (inquiry--) { int ans=0; scanf("%d%d",&s,&t); for(i=s;i<=t;i++) if(cnt[i]<s) ans++; printf("%d/n",ans); } } return 0; }