Advertisement
ec1117

Untitled

Nov 29th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. struct BIT{
  2.     int n;
  3.     vl bit;
  4.     void init(int N){
  5.         n=N;
  6.         bit.resize(n);
  7.     }
  8.     void upd(int i, int val){
  9.         for(int x=i;x<n;x+=x&-x){
  10.             bit[x]+=val;
  11.         }
  12.     }
  13.     void reset(){
  14.         For(i,n)bit[i]=0;
  15.     }
  16.     ll sum(int x){
  17.         ll ret=0;
  18.         for(int i=x;i>0;i-=i&-i){
  19.             ret+=bit[i];
  20.         }
  21.         return ret;
  22.     }
  23. };
  24.  
  25. int n,k;
  26. vi a[MX];
  27. ll mnsum=0;
  28. map<int,int> m;
  29. BIT bit;
  30.  
  31. void reset(){
  32.     For(i,n+5)bit.bit[i]=0;
  33. }
  34.  
  35. ll findAns(ll val){
  36.     ll cnt=1,cval=0, room=val-mnsum;
  37.     vi p(n,0), b[n];//at p is 0
  38.     For(i,n)b[i]=a[i];//by reference?
  39.     bit.reset();
  40.     BIT bit2;bit2.init(n+5);
  41.     priority_queue<pi,vpi,greater<pi>> pq;
  42.    
  43.     For(i,n){
  44.         FOR(j,1,sz(a[i])){
  45.             if(a[i][j]<=room){
  46.                 cnt++;
  47.                 cval+=a[i][j];
  48.             }
  49.             bit.upd(m[a[i][j]],1);
  50.             bit2.upd(m[a[i][j]],a[i][j]);
  51.         }
  52.         pq.push(mp(a[i][1],i));
  53.     }
  54.     while(!pq.empty() && cnt<=k && room>=0){
  55.         pi x=pq.top();pq.pop();
  56.         int i=x.s;p[i]++;
  57.         cval+=x.f*(k-cnt);
  58.         bit.upd(m[b[i][p[i]]],-1);
  59.         bit2.upd(m[b[i][p[i]]],-b[i][p[i]]);
  60.         FOR(j,p[i]+1,sz(b[i])){
  61.             bit.upd(m[b[i][j]],-1);
  62.             bit2.upd(m[b[i][j]],-b[i][j]);
  63.             b[i][j]-=b[i][p[i]];
  64.         }
  65.         if(p[i]<sz(b[i])-1)
  66.             pq.push(mp(b[i][p[i]+1],i));
  67.         room-=b[i][p[i]];if(room<0)break;
  68.         cnt+=bit.sum((--m.ub(room))->s);
  69.         cval+=bit2.sum((--m.ub(room))->s);
  70.         FOR(j,p[i]+1,sz(b[i])){
  71.             bit.upd(m[b[i][j]],1);
  72.             bit2.upd(m[b[i][j]],b[i][j]);
  73.         }
  74.         dbg("X");
  75.     }
  76.     return cval;
  77. }
  78. //ctrl f for a in works
  79. //everyting coord compressed
  80. //arrow operation
  81. ll works(ll val){
  82.     ll cnt=1, room=val-mnsum;
  83.     vi p(n,0), b[n];//at p is finished
  84.     For(i,n)b[i]=a[i];//by reference?
  85.     priority_queue<pi,vpi,greater<pi>> pq;
  86.     bit.reset();
  87.     For(i,n){
  88.         FOR(j,1,sz(a[i])){
  89.             if(a[i][j]<=room)cnt++;
  90.             bit.upd(m[a[i][j]],1);
  91.         }
  92.         pq.push(mp(a[i][1],i));
  93.     }
  94.     while(!pq.empty() && cnt<=k && room>=0){
  95.         pi x=pq.top();pq.pop();
  96.         int i=x.s;p[i]++;
  97.         bit.upd(m[b[i][p[i]]],-1);
  98.         FOR(j,p[i]+1,sz(b[i])){
  99.             bit.upd(m[b[i][j]],-1);
  100.             b[i][j]-=b[i][p[i]];
  101.         }
  102.         if(p[i]<sz(b[i])-1)
  103.             pq.push(mp(b[i][p[i]+1],i));
  104.         room-=b[i][p[i]];if(room<0)break;
  105.         cnt+=bit.sum((--m.ub(room))->s);
  106.         FOR(j,p[i]+1,sz(b[i])){
  107.             bit.upd(m[b[i][j]],1);
  108.         }
  109.     }
  110.     return cnt;
  111. }
  112.  
  113. void solve(){
  114.     re(n,k);
  115.     bit.init(n+5);
  116.     For(i,n){
  117.         int x;re(x);
  118.         a[i].resize(x);re(a[i]);
  119.         sort(all(a[i]));
  120.         mnsum+=a[i][0];
  121.         FOR(j,1,sz(a[i]))a[i][j]-=a[i][0];a[i][0]=0;
  122.         For(j,sz(a[i]))FOR(k,j+1,sz(a[i]))m[a[i][k]-a[i][j]]=1;
  123.         //5e6 map operations
  124.     }
  125.     m[0]=1;int con=1;
  126.     trav(x,m){
  127.         m[x.f]=con++;
  128.     }
  129.     ll l=mnsum, r=INF;
  130.     while(l!=r){
  131.         ll mid=(l+r)/2;
  132.         if(works(mid)>=k)r=mid;
  133.         else l=mid+1;
  134.     }
  135.     ll cnt=works(l);
  136.     ll ret=findAns(l);
  137.     ret-=(cnt-k)*l;
  138.     ret+=mnsum*k;
  139.     ps(ret);
  140. }
  141.  
  142. int main() {
  143.         setIO();
  144.         int t=1;
  145.         // re(t);
  146.         while(t--)solve();
  147.         // you should actually read the stuff at the bottom
  148. }
  149.  
  150. //psums, bsearch, two pointers
  151. /* stuff you should look for
  152.         * int overflow, array bounds
  153.         * special cases (n=1?)
  154.         * think of simple solution first
  155.         * do smth instead of nothing and stay organized
  156.         * WRITE STUFF DOWN
  157.         * DON'T GET STUCK ON ONE APPROACH
  158. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement