求任意區間裡比x小的數的個數(樹狀陣列)
阿新 • • 發佈:2019-01-23
題意:對任意區間排序,問你第x個位置上的數的位置是否發生變化
在得知n^2能過這個題我的內心是崩潰的.........
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; const int maxn=30005; int aa[maxn],bb[maxn]; int C[maxn],ans[maxn]; int n,m; int lowbit(int x) { return x&(-x); } int sum(int x) { int ret=0; while(x>0) { ret+=C[x]; x-=lowbit(x); } return ret; } void add(int x,int d) { while(x<=n) { C[x]+=d; x+=lowbit(x); } } struct node { int id,num; bool operator < (const node &other) const { return num < other.num; } }a[maxn]; struct note { int l,r,id,value; bool operator < (const note &other)const { return value <other.value; } }b[maxn]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { int x; scanf("%d",&a[i].num); a[i].id=i; } for(int i=1;i<=m;i++) { scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].value); bb[i]=b[i].value; b[i].value=a[b[i].value].num; b[i].id=i; aa[i]=b[i].l; } sort(a+1,a+n+1); sort(b+1,b+m+1); // memset(C,0,sizeof(C)); int k=1; for(int i=1;i<=m;i++) { while(k<=n&&a[k].num<b[i].value) { add(a[k].id,1); k++; } ans[b[i].id]=sum(b[i].r)-sum(b[i].l-1); } for(int i=1;i<=m;i++) { if(ans[i]!=bb[i]-aa[i]) printf("No\n"); else printf("Yes\n"); // printf("%d\n",ans[i]); } return 0; }