Advertisement
Guest User

Untitled

a guest
Aug 2nd, 2019
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. #pragma GCC target("avx2")
  2. #pragma GCC optimization("O3")
  3. #pragma GCC optimization("unroll-loops")
  4. #include<bits/stdc++.h>
  5. //#include "tournament.h"
  6. #define rc(x) return cout<<x<<endl,0
  7. #define pb push_back
  8. #define mkp make_pair
  9. #define in insert
  10. #define er erase
  11. #define fd find
  12. #define fr first
  13. #define sc second
  14. typedef long long ll;
  15. typedef long double ld;
  16. const ll INF=0x3f3f3f3f3f3f3f3f;
  17. const ll llinf=(1LL<<62);
  18. const int inf=(1<<30);
  19. const int nmax=1e5+50;
  20. const int mod=1e9+7;
  21. using namespace std;
  22. int n,i,s[nmax],e[nmax],st[4*nmax],rs[nmax],mn[nmax],j,t,x,y,r,c,a[nmax],mx,id,l,fw[nmax],p[nmax];
  23. int smn[4*nmax],smx[4*nmax],lzy[4*nmax],eq[4*nmax];
  24. vector<pair<int,int> >lb[nmax],rb[nmax];
  25. vector<int>vc[nmax];
  26. void upd(int x,int l,int r,int p,int v)
  27. {
  28. if(l==r)
  29. {
  30. st[x]=min(st[x],v);
  31. return;
  32. }
  33. int mid=(l+r)/2;
  34. if(mid>=p)upd(2*x,l,mid,p,v);
  35. else upd(2*x+1,mid+1,r,p,v);
  36. st[x]=min(st[2*x],st[2*x+1]);
  37. }
  38. int qry(int x,int l,int r,int tl,int tr)
  39. {
  40. if(l>tr || r<tl)return inf;
  41. if(tl<=l && r<=tr)return st[x];
  42. int mid=(l+r)/2;
  43. return min(qry(2*x,l,mid,tl,tr),qry(2*x+1,mid+1,r,tl,tr));
  44. }
  45. void upd(int i,int v)
  46. {
  47. for(;i<=n;i+=i&(-i))fw[i]+=v;
  48. }
  49. int qry(int i)
  50. {
  51. int ans=0;
  52. for(;i>=1;i-=i&(-i))ans+=fw[i];
  53. return ans;
  54. }
  55. void build(int x,int l,int r)
  56. {
  57. eq[x]=inf;
  58. if(l==r)
  59. {
  60. smn[x]=smx[x]=l;
  61. return;
  62. }
  63. int mid=(l+r)/2;
  64. build(2*x,l,mid);
  65. build(2*x+1,mid+1,r);
  66. smn[x]=min(smn[2*x],smn[2*x+1]);
  67. smx[x]=max(smx[2*x],smx[2*x+1]);
  68. }
  69. void push(int nod,int l,int r)
  70. {
  71. if(eq[nod]!=inf)
  72. {
  73. smx[nod]=smn[nod]=eq[nod];
  74. if(l!=r)
  75. {
  76. eq[2*nod]=min(eq[2*nod],eq[nod]);
  77. eq[2*nod+1]=min(eq[2*nod+1],eq[nod]);
  78. }
  79. eq[nod]=inf;
  80. lzy[nod]=0;
  81. }
  82. if(!lzy[nod])return;
  83. smx[nod]-=lzy[nod];
  84. smn[nod]-=lzy[nod];
  85. if(l!=r)
  86. {
  87. lzy[nod*2]+=lzy[nod];
  88. lzy[nod*2+1]+=lzy[nod];
  89. }
  90. lzy[nod]=0;
  91. }
  92. void up(int nod,int l,int r,int tl,int tr,int v,int t)
  93. {
  94. push(nod,l,r);
  95. if(tl<=l && r<=tr)
  96. {
  97. if(!t)eq[nod]=v;
  98. else lzy[nod]+=v;
  99. push(nod,l,r);
  100. return;
  101. }
  102. int mid=(l+r)/2;
  103. if(tl<=mid)up(nod*2,l,mid,tl,tr,v,t);
  104. if(mid<tr)up(nod*2+1,mid+1,r,tl,tr,v,t);
  105. push(nod*2,l,mid);
  106. push(nod*2+1,mid+1,r);
  107. smx[nod]=max(smx[2*nod],smx[2*nod+1]);
  108. smn[nod]=min(smn[2*nod],smn[2*nod+1]);
  109. }
  110. int kth(int nod,int l,int r,int k)
  111. {
  112. if(l>r || !k)return 0;
  113. push(nod,l,r);
  114. if(l==r)return l;
  115. int mid=(l+r)/2;
  116. push(2*nod,l,mid);
  117. push(2*nod+1,mid+1,r);
  118. if(smx[2*nod]>k || (smx[2*nod]==k && smn[2*nod+1]>k))return kth(2*nod,l,mid,k);
  119. else return kth(2*nod+1,mid+1,r,k);
  120. }
  121. int GetBestPosition(int N,int C,int R,int K[],int S[],int E[])
  122. {
  123. n=N,c=C,r=R+1;
  124. for(i=1;i<n;i++)a[i]=K[i-1]+1;
  125. for(i=1;i<=c;i++)
  126. {
  127. s[i]=S[i-1]+1;
  128. e[i]=E[i-1]+1;
  129. }
  130. build(1,1,n);
  131. for(i=1;i<=n;i++)p[i]=i;
  132. for(i=1;i<=c;i++)
  133. {
  134. push(1,1,n);
  135. if(smn[1]==s[i])x=1;
  136. else x=kth(1,1,n,s[i]-1)+1;
  137. if(smx[1]==e[i])y=n;
  138. else y=kth(1,1,n,e[i]);
  139. if(x>=1 && x<=n && y>=1 && y<=n && x<y)up(1,1,n,x,y,s[i],0);
  140. if(x>=1 && x<=n && y>=1 && y<n && x<y)up(1,1,n,y+1,n,e[i]-s[i],1);
  141. lb[x].pb(mkp(y,i));
  142. rb[y].pb(mkp(x,i));
  143. s[i]=x,e[i]=y;
  144. }
  145. for(i=1;i<=4*n;i++)st[i]=c;
  146. j=1,l=0;
  147. for(i=1;i<=n;i++)
  148. {
  149. for(;j<=l;j++)
  150. {
  151. for(t=0;t<lb[j].size();t++)
  152. {
  153. upd(1,1,n,lb[j][t].fr,lb[j][t].sc);
  154. }
  155. }
  156. mn[i]=qry(1,1,n,i,n);
  157. if(a[i]>r)l=i;
  158. }
  159. for(i=1;i<=4*n;i++)st[i]=c;
  160. j=n,l=n+1;
  161. for(i=n;i>=1;i--)
  162. {
  163. if(a[i]>r)l=i;
  164. for(;j>l;j--)
  165. {
  166. for(t=0;t<rb[j].size();t++)
  167. {
  168. upd(1,1,n,rb[j][t].fr,rb[j][t].sc);
  169. }
  170. }
  171. mn[i]=min(mn[i],qry(1,1,n,1,i));
  172. vc[mn[i]].pb(i);
  173. }
  174. for(i=1;i<=c;i++)
  175. {
  176. for(j=0;j<vc[i].size();j++)
  177. {
  178. rs[vc[i][j]]=qry(vc[i][j]);
  179. }
  180. upd(s[i],1);
  181. upd(e[i]+1,-1);
  182. }
  183. mx=-1;
  184. for(i=1;i<=n;i++)
  185. {
  186. if(mx<rs[i])
  187. {
  188. mx=rs[i];
  189. id=i;
  190. }
  191. }
  192. return id-1;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement