标签:HERE red case cep 之间 预处理 panel lse query
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1446 Accepted Submission(s): 449
1 #include <iostream> 2 #include<cmath> 3 using namespace std; 4 int N,a[100100]; 5 int f[100100][20],dp[2][100100]; 6 void init(){ 7 for(int i=1;i<=N;++i)f[i][0]=i; 8 for(int k=1;(1<<k)<=N;++k){ 9 for(int i=1;i+(1<<k)-1<=N;++i){ 10 if(a[f[i][k-1]]>=a[f[i+(1<<(k-1))][k-1]]) f[i][k]=f[i][k-1]; 11 else f[i][k]=f[i+(1<<(k-1))][k-1]; 12 } 13 } 14 } 15 int query(int L,int R){ 16 if(R<L)return 0; 17 int k=0; 18 while((1<<(k+1))-1<=R-L) k++; 19 if(a[f[L][k]]>=a[f[R-(1<<k)+1][k]]) return f[L][k]; 20 else return f[R-(1<<k)+1][k]; 21 } 22 int main() { 23 int t,n,m,i,p,q; 24 cin>>t; 25 while(t--){ 26 scanf("%d%d",&n,&m); 27 for(i=1;i<=n;++i)scanf("%d",a+i); 28 N=n,init(); 29 dp[0][1]=1; 30 int maxn=1; 31 for(i=2;i<=n;++i){ 32 if(a[i]>a[maxn]){ 33 dp[0][i]=dp[0][maxn]+1; 34 maxn=i; 35 } 36 else dp[0][i]=-1; 37 } 38 39 dp[1][n]=1; 40 for(i=n-1;i>=1;--i){ 41 int l=i+1,r=n; 42 while(l<r){ 43 int mid=l+(r-l)/2; 44 if(a[query(l,mid)]>a[i]) r=mid; 45 else l=mid+1; 46 } 47 dp[1][i]=a[r]>a[i]?dp[1][l]+1:1; 48 } 49 while(m--){ 50 scanf("%d%d",&p,&q); 51 int x=query(1,p-1),xx=a[x],ans=dp[0][x]; 52 if(q>a[x]) xx=q,ans++; 53 int l=p+1,r=n; 54 while(l<r){ 55 int mid=l+(r-l)/2; 56 if(a[query(p+1,mid)]>xx)r=mid; 57 else l=mid+1; 58 } 59 if(a[l]>xx) ans+=dp[1][l]; 60 cout<<ans<<endl; 61 } 62 } 63 return 0; 64 }
标签:HERE red case cep 之间 预处理 panel lse query
原文地址:https://www.cnblogs.com/zzqc/p/9490772.html