线段树专题训练
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树专题训练相关的知识,希望对你有一定的参考价值。
Minimum Inversion Number
题意:找最小逆序数。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define lson l,m,rt<<1 4 #define rson m+1,r,rt<<1|1 5 6 const int maxn=5010; 7 int sum[maxn<<2]; 8 9 void pushup(int rt){ 10 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 11 } 12 void build(int l,int r,int rt){ 13 if(l==r){ 14 sum[rt]=1; 15 return ; 16 } 17 int m=(l+r)>>1; 18 build(lson); 19 build(rson); 20 pushup(rt); 21 } 22 23 void update(int p,int l,int r,int rt){ 24 if(l==r){ 25 sum[rt]=0; 26 return; 27 } 28 int m=(l+r)>>1; 29 if(p<=m) update(p,lson); 30 else update(p,rson); 31 pushup(rt); 32 } 33 int query(int L,int R,int l,int r,int rt){ 34 if(L<=l&&r<=R) { 35 return sum[rt]; 36 } 37 int m=(l+r)>>1; 38 int ans=0; 39 if(L<=m) ans+=query(L,R,lson); 40 if(R>m) ans+=query(L,R,rson); 41 return ans; 42 } 43 int a[maxn]; 44 int n; 45 46 int main(){ 47 while(scanf("%d",&n)!=EOF){ 48 build(1,n,1); 49 int ans=0; 50 for(int i=1;i<=n;i++){ 51 scanf("%d",&a[i]); 52 a[i]++; 53 update(a[i],1,n,1); 54 ans+=query(1,a[i],1,n,1); 55 } 56 //printf("逆序数==%d\n",ans); 57 int temp=ans; 58 for(int i=1;i<n;i++){ 59 temp=temp-(a[i]-1)+(n-a[i]); 60 ans=min(ans,temp); 61 } 62 printf("%d\n",ans); 63 } 64 }
Billboard
题意:在板子上贴海报,尽量从左下方开始贴,问最低贴在哪层。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define lson l,m,rt<<1 4 #define rson m+1,r,rt<<1|1 5 const int maxn=200010; 6 int maxx[maxn<<2]; 7 int h,w,m; 8 void pushup(int rt){ 9 maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]); 10 } 11 12 void build(int l,int r,int rt){ 13 if(l==r){ 14 maxx[rt]=w; 15 return ; 16 } 17 int m=(l+r)>>1; 18 build(lson); 19 build(rson); 20 pushup(rt); 21 } 22 23 int query(int x,int l,int r,int rt){ 24 if(l==r){ 25 maxx[rt]-=x; 26 return l; 27 } 28 int m=(l+r)>>1; 29 int ans; 30 if(maxx[rt<<1]>=x) ans=query(x,lson); 31 else ans=query(x,rson); 32 pushup(rt); 33 34 return ans; 35 } 36 37 int main(){ 38 while(scanf("%d%d%d",&h,&w,&m)!=EOF){ 39 int n=min(h,m); 40 build(1,n,1); 41 while(m--){ 42 int x; 43 scanf("%d",&x); 44 int ans; 45 if(maxx[1]<x) ans=-1; 46 else ans=query(x,1,n,1); 47 printf("%d\n",ans); 48 } 49 } 50 return 0; 51 }
以上是关于线段树专题训练的主要内容,如果未能解决你的问题,请参考以下文章