結果

問題 No.568 じゃんじゃん 落とす 委員会
ユーザー 王源成
提出日時 2025-05-20 21:56:24
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
RE  
実行時間 -
コード長 2,056 bytes
コンパイル時間 2,275 ms
コンパイル使用メモリ 196,268 KB
実行使用メモリ 817,024 KB
最終ジャッジ日時 2025-05-20 21:56:32
合計ジャッジ時間 7,867 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other RE * 6 MLE * 1 -- * 19
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In member function ‘int tree::pushup(int, int)’:
main.cpp:17:9: warning: no return statement in function returning non-void [-Wreturn-type]
   17 |         }
      |         ^

ソースコード

diff #

#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 int 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,1,n,m-s,0);
	}
	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(){
	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=n;i>=1;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;
}
0