标签:hang chmod contain tac include lse NPU can tput
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8365 Accepted Submission(s): 3540
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> #include<vector> using namespace std; const int MAXN=1e5+10; int a[MAXN],root[MAXN]; int t,n,m,l,r,x; vector<int>v; int get_id(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;} //因为每个数的范围很大,需要进行离散化处理 struct node { int l; int r; int h; }qes[MAXN]; struct Node { int l; int r; int sum; }T[MAXN*40]; int cnt; int ans; void Update(int l,int r,int &x,int y,int pos) { T[++cnt]=T[y],T[cnt].sum++,x=cnt; if(l==r)return; int mid=(l+r)>>1; if(pos<=mid)Update(l,mid,T[x].l,T[y].l,pos); else Update(mid+1,r,T[x].r,T[y].r,pos); } void query(int l,int r,int x,int y,int k) { int mid=(l+r)>>1; if(mid==k)// 如果小于等于k的数刚好全部在左边区域,加上它的权值,直接结束 { ans+=T[T[y].l].sum-T[T[x].l].sum; return; } else if(k<mid) //左边存在部分小于等于k的数,查询左边区域 query(l,mid,T[x].l,T[y].l,k); else//右边存在部分小于k的数,则加上左边的权值,并查询右边区域。 { ans+=T[T[y].l].sum-T[T[x].l].sum; query(mid+1,r,T[x].r,T[y].r,k); } } int main() { scanf("%d",&t); int Case=0; while(t--) { Case++; cnt=0; v.clear(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); v.push_back(a[i]); } for(int i=1;i<=m;i++) { scanf("%d%d%d",&qes[i].l,&qes[i].r,&qes[i].h); v.push_back(qes[i].h); } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); int sz=v.size(); for(int i=1;i<=n;i++) Update(1,sz,root[i],root[i-1],get_id(a[i])); printf("Case %d:\n",Case); for(int i=1;i<=m;i++) { ans=0; query(1,sz,root[qes[i].l],root[qes[i].r+1],get_id(qes[i].h)); printf("%d\n",ans); } } return 0; }
标签:hang chmod contain tac include lse NPU can tput
原文地址:https://www.cnblogs.com/a249189046/p/8885884.html