Advertisement
Guest User

Untitled

a guest
Apr 10th, 2022
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<vector>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<queue>
  10.  
  11. #define ls(x) (x<<1)
  12. #define rs(x) (x<<1|1)
  13. #define pb push_back
  14. #define MP make_pair
  15.  
  16. using namespace std;
  17.  
  18. typedef long long LL;
  19.  
  20. const int maxn=5e5+5;
  21.  
  22. int n,cst;
  23. int to_nxt[maxn],del[maxn];
  24. int id[maxn];
  25.  
  26. LL sum[maxn];
  27.  
  28. vector<int> vec[maxn];
  29.  
  30. struct Seg1{
  31. LL mi[maxn<<2];
  32.  
  33. void pushup(int x)
  34. {
  35. mi[x]=min(mi[ls(x)],mi[rs(x)]);
  36. }
  37.  
  38. void build(int x,int l,int r)
  39. {
  40. if(l==r){
  41. mi[x]=sum[l];
  42. return;
  43. }
  44.  
  45. int mid=(l+r)>>1;
  46. build(ls(x),l,mid),build(rs(x),mid+1,r);
  47. pushup(x);
  48. }
  49.  
  50. int query_nxt(int x,int l,int r,int ql,int qr,LL k)
  51. {
  52. if(l>qr||r<ql)
  53. return n+1;
  54. if(l>=ql&&r<=qr){
  55. if(l==r){
  56. if(mi[x]<k)
  57. return l;
  58. else
  59. return n+1;
  60. }
  61.  
  62. int mid=(l+r)>>1;
  63. if(mi[ls(x)]<k)
  64. return query_nxt(ls(x),l,mid,ql,qr,k);
  65. else if(mi[rs(x)]<k)
  66. return query_nxt(rs(x),mid+1,r,ql,qr,k);
  67. else
  68. return n+1;
  69. }
  70.  
  71. int mid=(l+r)>>1;
  72. return min(query_nxt(ls(x),l,mid,ql,qr,k),query_nxt(rs(x),mid+1,r,ql,qr,k));
  73. }
  74.  
  75. }ST1;
  76.  
  77.  
  78. struct Seg2{
  79. LL rsum[maxn<<2],lsum[maxn<<2];
  80. LL siz[maxn<<2],mark[maxn<<2];
  81.  
  82. void pushup(int x)
  83. {
  84. siz[x]=siz[ls(x)]+siz[rs(x)];
  85. lsum[x]=lsum[ls(x)]+lsum[rs(x)];
  86. rsum[x]=rsum[ls(x)]+rsum[rs(x)];
  87. }
  88.  
  89. void down(int x,int l,int r)
  90. {
  91. if(!mark[x])
  92. return;
  93. rsum[ls(x)]=siz[ls(x)]*mark[x];
  94. rsum[rs(x)]=siz[rs(x)]*mark[x];
  95. mark[x]=0;
  96. }
  97. void update(int x,int l,int r,int ql,int qr,LL k)
  98. {
  99. if(r<ql||l>qr)
  100. return;
  101. if(l>=ql&&r<=qr){
  102. rsum[x]=siz[x]*k;
  103. mark[x]=k;
  104. return;
  105. }
  106.  
  107. int mid=(l+r)>>1;
  108. down(x,l,r);
  109. update(ls(x),l,mid,ql,qr,k),update(rs(x),mid+1,r,ql,qr,k);
  110. pushup(x);
  111. }
  112. void modify(int x,int l,int r,int pos,LL k1,LL k2)
  113. {
  114. if(l==r){
  115. lsum[x]=k1,rsum[x]=k2,siz[x]+=k1?1:-1;
  116. return;
  117. }
  118.  
  119. int mid=(l+r)>>1;
  120. down(x,l,r);
  121. if(pos<=mid)
  122. modify(ls(x),l,mid,pos,k1,k2);
  123. else
  124. modify(rs(x),mid+1,r,pos,k1,k2);
  125. pushup(x);
  126. }
  127. }ST2;
  128.  
  129.  
  130. void work()
  131. {
  132. LL anosum=0;
  133. ST1.build(1,1,n);
  134.  
  135. for(int i=1;i<=n;++i){
  136. int nxt=ST1.query_nxt(1,1,n,i,n,sum[i-1]);
  137. vec[nxt].pb(i);
  138. to_nxt[i]=nxt;
  139. anosum+=nxt-i;
  140. }
  141.  
  142. vector<pair<LL,int>> disp;
  143. for(int i=0;i<=n;++i)
  144. disp.pb({sum[i],i+1});
  145. sort(disp.begin(),disp.end());
  146. for(int i=0;i<disp.size();++i)
  147. id[disp[i].second]=i+1;
  148.  
  149.  
  150.  
  151. LL ans=0;
  152. for(auto v:vec[n+1]){
  153. anosum-=to_nxt[v]-v;
  154. ST2.modify(1,1,disp.size(),id[v],v,n+1);
  155. }
  156.  
  157.  
  158. for(int i=n;i>=1;--i){
  159. for(auto v:vec[i]){
  160. anosum-=to_nxt[v]-v;
  161. int nxnxt=ST1.query_nxt(1,1,n,i,n,sum[v-1]-cst);
  162. ST2.modify(1,1,disp.size(),id[v],v,nxnxt);
  163. }
  164.  
  165. int l=lower_bound(disp.begin(),disp.end(),MP(sum[i]+cst+1,0))-disp.begin()+1;
  166. ST2.update(1,1,disp.size(),l,disp.size(),i);
  167.  
  168. ans=max(ans,anosum+ST2.rsum[1]-ST2.lsum[1]);
  169.  
  170. ST2.modify(1,1,disp.size(),id[i],0,0);
  171. anosum+=to_nxt[i]-i;
  172. }
  173.  
  174. printf("%lld",ans);
  175. }
  176.  
  177. int main()
  178. {
  179. scanf("%d%d",&cst,&n);
  180.  
  181. for(int i=1;i<=n;++i)
  182. scanf("%lld",&sum[i]),sum[i]+=sum[i-1];
  183.  
  184. work();
  185.  
  186. return 0;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement