Advertisement
yicongli

HDU6444

Mar 17th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e4+7;
  17.  
  18. bool vis[N];
  19. int Q[N*3];
  20. ll A[N*3];
  21. int a[N];
  22.  
  23. int main(){
  24.     int T;r(T);
  25.     for(int cas=1;cas<=T;++cas){
  26.         int n,m,k;
  27.         ll s,ans=0;
  28.         r(n),r(s),r(m),r(k);
  29.         memset(vis,0,n);
  30.         for(int i=0;i<n;++i){
  31.             r(a[i]);
  32.         }
  33.         for(int i=0;i<n;++i){
  34.             if(vis[i])continue;
  35.             int len=0;
  36.             ll sum=0;
  37.             for(int j=i;!vis[j];j=(j+k)%n){
  38.                 vis[j]=1;
  39.                 A[len++]=a[j];
  40.                 sum+=a[j];
  41.             }
  42.             int x=m/len,y=m%len;
  43.             ll ret=0;
  44.             if(x>0){
  45.                 --x;
  46.                 y+=len;
  47.                 for(int i=0;i<len;++i){
  48.                     A[i+2*len]=A[i+len]=A[i];
  49.                 }
  50.                 len*=3;
  51.             }
  52.             else {
  53.                 for(int i=0;i<len;++i){
  54.                     A[i+len]=A[i];
  55.                 }
  56.                 len*=2;
  57.             }
  58.             for(int i=1;i<len;++i){
  59.                 A[i]+=A[i-1];
  60.             }
  61.             int tail=0,head=1;
  62.             for(int i=0;i<len;++i){
  63.                 while(head<=tail&&A[Q[tail]]>=A[i])tail--;
  64.                 while(head<=tail&&Q[head]<i-y)head++;
  65.                 Q[++tail]=i;
  66.                 ret=max(ret,A[i]-A[Q[head]]);
  67.             }
  68.             ret+=max(0ll,sum*x);
  69.             ans=max(ans,ret);
  70.         }
  71.         printf("Case #%d: %lld\n",cas,max(0ll,s-ans));
  72.     }
  73. }
  74. /*
  75. 1
  76. 5 10 3 1
  77. 1 -1 3 2 -5
  78.  
  79. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement