这是一道考试题。。。。。。
这篇博客只是用来存代码的。。。
T1
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 template<typename type_> 5 void scan(type_ &x){ 6 type_ f=1;x=0;char s=getchar(); 7 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} 8 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} 9 x*=f; 10 } 11 ll a[200007],m,n,q,s,t,sum[200007]; 12 13 //void da(ll x,ll y){ 14 // m[x]=m[x-1]-s*y; 15 // return ; 16 //} 17 //void xi(ll x,ll y){ 18 // m[x]=m[x-1]+t*y; 19 // return ; 20 //} 21 //void xg(ll l,ll r,ll k){ 22 // for(int i=l;i<=r;i++){ 23 // a[i]+=k; 24 // } 25 // for(int i=1;i<=n;i++){ 26 // if(a[i]>a[i-1]){ 27 // da(i,a[i]-a[i-1]); 28 // }else{ 29 // xi(i,a[i-1]-a[i]); 30 // } 31 // } 32 // printf("%d ",m[n]); 33 // for(int i=l;i<=r;i++){ 34 // a[i]-=k; 35 // } 36 // memset(m,0,sizeof(m)); 37 //// cout<<"a="; 38 //// for(int i=1;i<=n;i++){ 39 //// printf("%d ",a[i]); 40 //// } 41 //// cout<<"m= "; 42 //// for(int i=1;i<=n;i++){ 43 //// printf("%d ",m[i]); 44 //// } 45 //// printf(" "); 46 //// printf("%lld ",m[n]); 47 //} 48 49 50 int main(){ 51 freopen("365.in","r",stdin); 52 freopen("365.out","w",stdout); 53 scan(n);scan(q);scan(s);scan(t); 54 for(int i=0;i<=n;i++){ 55 scan(a[i]); 56 if(i==0)continue; 57 if(a[i]>a[i-1]){ 58 sum[i]=-1*(s*(a[i]-a[i-1])); 59 }else{ 60 sum[i]=t*(a[i-1]-a[i]); 61 } 62 // scanf("%lld",&a[i]); 63 } 64 for(int i=1;i<=n;i++){ 65 m+=sum[i]; 66 // sum1[i]=sum[i]; 67 } 68 for(int j=1;j<=q;j++){ 69 ll lll,rr,kk,ans1=0,ans2=0; 70 scan(lll);scan(rr);scan(kk); 71 // scanf("%lld%lld%lld",&lll,&rr,&kk); 72 // if(rr==n)continue; 73 if(a[lll]+kk>a[lll-1]){ 74 ans1=sum[lll]-(-1*s*(a[lll]+kk-a[lll-1])); 75 }else{ 76 ans1=sum[lll]-(t*(a[lll-1]-a[lll]-kk)); 77 } 78 if(a[rr+1]>a[rr]+kk){ 79 ans2=sum[rr+1]-(-1*s*(a[rr+1]-a[rr]-kk)); 80 }else{ 81 ans2=sum[rr+1]-t*(a[rr]-a[rr+1]+kk); 82 } 83 if(rr==n)ans2=0; 84 printf("%lld ",m-ans1-ans2); 85 } 86 return 0; 87 }
T3
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 //#define ll long long 4 template<typename type> 5 void scan(type &x){ 6 type f=1;x=0;char s=getchar(); 7 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} 8 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} 9 x*=f; 10 } 11 int n,m,a[2007][2007]; 12 int gmax,gmin; 13 int check(int ch){ 14 int ss=0; 15 for(int i=0;i<n;i++){ 16 for(int j=0;j<m;j++){ 17 if(a[i][j]<gmax-ch){ 18 ss=max(ss,j+1);//求出有最大值的图的边界 19 } 20 } 21 for(int j=0;j<m;j++){ 22 if(a[i][j]>ch+gmin){ 23 if(j<ss)return 0;//判断最大值与最小值的图的边界是否冲突 24 //即判断图是否联通 25 } 26 } 27 } 28 return 1;//题目条件判断 29 } 30 int erfen(){ 31 int l=0,r=gmax-gmin; 32 while(l<r){ 33 int mid=(l+r)/2; 34 if(check(mid)){//如果这个值不满足条件 35 r=mid;//更新 36 }else{ 37 l=mid+1; 38 } 39 } 40 return l;//返回最小值 41 } 42 43 44 int main(){ 45 freopen("paint.in", "r", stdin); 46 freopen("paint.out", "w", stdout); 47 scan(n);scan(m); 48 for(int i=0;i<n;i++){ 49 for(int j=0;j<m;j++){ 50 scan(a[i][j]); 51 } 52 } 53 54 gmax=gmin=a[0][0]; 55 for(int i=0;i<n;i++){ 56 for(int j=0;j<m;j++){ 57 gmax=max(gmax,a[i][j]); 58 gmin=min(gmin,a[i][j]);//求出全图最大值 59 } 60 } 61 int ans; 62 ans=erfen();//求出原图的最小答案 63 for(int i=0;i<n/2;i++){ 64 for(int j=0;j<m;j++){ 65 swap(a[i][j],a[n-i-1][j]); 66 }//将图左右对称,即将出发点放到右上角。 67 } 68 ans=min(ans,erfen()); 69 for(int i=0;i<n;i++){ 70 for(int j=0;j<m/2;j++){ 71 swap(a[i][j],a[i][m-j-1]); 72 }//将图上下对称,即将出发点放到右下角。 73 } 74 ans=min(ans,erfen()); 75 for(int i=0;i<n/2;i++){ 76 for(int j=0;j<m;j++){ 77 swap(a[i][j],a[n-i-1][j]); 78 }//再次左右对称,将出发点放到左下角。 79 } 80 ans=min(ans,erfen()); 81 printf("%d ",ans); 82 return 0; 83 }