题意
给你n个数字,编号从1开始。 然后m个查询,问你l到r编号中有没有num这个数字。
#include<cstdio> #include<cstring> const int N=100010; const int mod=1e7+19; struct node { int x,next,order,tag; }e[N<<1]; struct edgt { int x,next; }f[N]; int first[mod+10],last[mod+10]; int sum[N]; int map[N],ans[N]; int cnt=0; inline void add(int d,int w,int di,int flag) { e[++cnt].x=w,e[cnt].tag=flag,e[cnt].order=di,e[cnt].next=first[d];first[d]=cnt; } int tot=0; inline int gethash(int x) { int t=x%mod; for(int k=last[t];k;k=f[k].next) if(f[k].x==x) return k; f[++tot].x=x,f[tot].next=last[t]; last[t]=tot; return tot; } inline int find(int x) { int t=x%mod; for(int k=last[t];k;k=f[k].next) if(f[k].x==x) return k; return 0; } int main() { freopen("statistic.in","r",stdin); freopen("statistic.out","w",stdout); int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&map[i]); int m; scanf("%d",&m); int l,r,p; for(int i=1;i<=m;i++) { scanf("%d %d %d",&l,&r,&p); add(l-1,p,i,-1);add(r,p,i,1); } for(int i=1;i<=n;i++) { int tr=gethash(map[i]); sum[tr]++; for(int j=first[i];j;j=e[j].next) { int tr1=find(e[j].x); ans[e[j].order]+=e[j].tag*sum[tr1]; } } for(int i=1;i<=m;i++) { if(ans[i]>0) printf("1"); else printf("0"); } return 0; }
可以去看看Brian551的csdn:
http://blog.csdn.net/brian551/article/details/77876635
还有用stl的:
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 100010; int n, m, l, r, a, v[maxn]; pair<int, int> P[maxn]; int main(){ for (int cases = 1; cases <= 10; cases++){ char inf[30], outf[30]; sprintf(inf, "statistic%d.in", cases); sprintf(outf, "statistic%d.out", cases); freopen(inf, "r", stdin); freopen(outf, "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++){ scanf("%d", &a); v[i - 1] = a; P[i - 1] = make_pair(a, i); } sort(P, P + n); for (scanf("%d", &m); m--;){ scanf("%d%d%d", &l, &r, &a); int index = lower_bound(P, P + n, make_pair(a, l)) - P; if (P[index].first == a && P[index].second <= r) putchar('1'); else putchar('0'); } printf("\n"); fclose(stdin); fclose(stdout); } }