Submission #856027

#TimeUsernameProblemLanguageResultExecution timeMemory
856027MilosMilutinovicHiring (IOI09_hiring)C++14
0 / 100
196 ms16152 KiB
#include <bits/stdc++.h>

#define pb push_back
#define fi first
#define se second
#define mp make_pair

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

ll readint(){
	ll x=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

int n,s[500005],q[500005],ord[500005];
ll W,num[80005][2];

bool cmp(int i,int j){ return s[i]*q[j]<s[j]*q[i]; }

void build(int id,int l,int r){
	num[id][0]=0;
	num[id][1]=0;
	if(l==r) return;
	int mid=(l+r)/2;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
}

void update(int id,int l,int r,int p){
	if(l==r) return (void)(num[id][0]+=p,num[id][1]+=1);
	int mid=(l+r)/2;
	if(p<=mid) update(id<<1,l,mid,p);
	else update(id<<1|1,mid+1,r,p);
	num[id][0]=num[id<<1][0]+num[id<<1|1][0];
	num[id][1]=num[id<<1][1]+num[id<<1|1][1];
}

int walk(int id,int l,int r,ll x){
	if(l==r) return num[id][0]>=x?l:-1;
	int mid=(l+r)/2;
	if(num[id<<1][0]>=x) return walk(id<<1,l,mid,x);
	else return walk(id<<1|1,mid+1,r,x);
}

ll get(int id,int l,int r,int ql,int qr,int t){
	if(ql<=l&&r<=qr) return num[id][t];
	int mid=(l+r)/2;
	if(qr<=mid) return get(id<<1,l,mid,ql,qr,t);
	else if(ql>mid) return get(id<<1|1,mid+1,r,ql,qr,t);
	else return get(id<<1,l,mid,ql,qr,t)+get(id<<1|1,mid+1,r,ql,qr,t);
}

int query(ll v,ll c){
	v/=c;
	int p=walk(1,1,20000,v);
	if(p==-1) return num[1][1];
	if(p==1) return v/c;
	return get(1,1,20000,1,p-1,1)+(v-get(1,1,20000,1,p-1,0))/p;
}

int main(){
	n=readint(); W=readint();
	for(int i=1;i<=n;i++) s[i]=readint(),q[i]=readint();
	for(int i=1;i<=n;i++) ord[i]=i;
	sort(ord+1,ord+n+1,cmp);
	build(1,1,20000);
	int ans=0,pos=-1;
	for(int _i=1;_i<=n;_i++){
		int i=ord[_i];
		if(s[i]>W){ update(1,1,20000,q[i]); continue; }
		int cur=1+query((W-s[i])*q[i],s[i]);
		ans=max(ans,cur);
		update(1,1,20000,q[i]);
	}
	printf("%d",ans);
	for(int i=1;i<=ans;i++) printf("%d ",i);
	return 0;
}

Compilation message (stderr)

hiring.cpp: In function 'int main()':
hiring.cpp:72:12: warning: unused variable 'pos' [-Wunused-variable]
   72 |  int ans=0,pos=-1;
      |            ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...