結果
問題 |
No.568 じゃんじゃん 落とす 委員会
|
ユーザー |
|
提出日時 | 2025-05-20 22:19:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 140 ms / 1,000 ms |
コード長 | 2,139 bytes |
コンパイル時間 | 2,565 ms |
コンパイル使用メモリ | 204,520 KB |
実行使用メモリ | 15,456 KB |
最終ジャッジ日時 | 2025-05-20 22:19:52 |
合計ジャッジ時間 | 5,290 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 26 |
ソースコード
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; #define mid (l+r)/2 int n,m; struct node{ int a,b,id; }c[N]; bool cmp(node x,node y){ if(x.a==y.a) return x.b<y.b; return x.a>y.a; } struct tree{ int sum[N<<2][2]; inline void pushup(int u,int id){ sum[u][id]=sum[u<<1][id]+sum[u<<1|1][id]; } void update(int u,int l,int r,int x,int d,int id){ if(l==r){ sum[u][id]+=d; return; } if(x<=mid) update(u<<1,l,mid,x,d,id); else update(u<<1|1,mid+1,r,x,d,id); pushup(u,id); return; } int query(int u,int l,int r,int k,int id){//kth biggest if(l==r) return l; if(sum[u<<1|1][id]>=k) return query(u<<1|1,mid+1,r,k,id); return query(u<<1,l,mid,k-sum[u<<1|1][id],id); } int query(int u,int l,int r,int ql,int qr,int id){ if(ql<=l&&r<=qr) return sum[u][id]; if(qr<l||r<ql) return 0; return query(u<<1,l,mid,ql,qr,id)+query(u<<1|1,mid+1,r,ql,qr,id); } inline void add(node x){ update(1,1,n,x.a,1,0); update(1,0,1e5,x.b,1,1); //cout<<x.b<<"++\n"; } inline void del(node x){ update(1,1,n,x.a,-1,0); update(1,0,1e5,x.b,-1,1); //cout<<x.b<<"--\n"; } }x[4]; int ans=N; inline void calc(){ int s=x[2].sum[1][0]+x[3].sum[1][0]; int t=N; if(s<m){ if(x[1].sum[1][0]<m-s){ //cout<<"break\n"; return; } t=x[1].query(1,0,1e5,m-s,1); } ans=min(ans,x[3].sum[1][1]+x[2].query(1,0,1e5,t,1e5,1)); /* cout<<"s= "<<s<<" t= "<<t<<" ans= "<<ans<<"\n"; for(int i:{0,1,2,3}) cout<<x[i].sum[1][0]<<" "; cout<<"\n"; for(int i=0;i<=11;i++){ for(int j=1;j<=x[1].query(1,0,1e5,i,i,1);j++) cout<<i<<" "; } cout<<"\n"; for(int i=0;i<=11;i++){ for(int j=1;j<=x[2].query(1,0,1e5,i,i,1);j++) cout<<i<<" "; } cout<<"\n"; */ return; } signed main(){ //freopen("difficulty.in","r",stdin); //freopen("difficulty.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>c[i].id>>c[i].a>>c[i].b; x[c[i].id].add(c[i]); } sort(c+1,c+1+n,cmp); calc(); for(int i=1;i<=n;i++){ if(c[i].id<3){ x[c[i].id].del(c[i]); x[c[i].id+1].add(c[i]); } if(c[i].a!=c[i+1].a) calc(); } calc(); cout<<ans<<"\n"; return 0; }