Submission #433098

#TimeUsernameProblemLanguageResultExecution timeMemory
433098biggHiring (IOI09_hiring)C++14
66 / 100
619 ms15500 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 10;
const int MAXQ =  2e4 + 10;
typedef long ll;

#define esq(x) x << 1 
#define dir(x) (x<<1) | 1
#define mid(x,y,t) ((x+y)>>1) + t
#define debug(args...) //debug(stderr, args)

int MAX = 2e4 + 10;
bool sorttwo;
struct worker{
	int id;
	double q, s;

	bool operator < (worker w) const{
		
		return s/q < w.s/w.q; 
		
	}
} workers[MAXN];

struct nodeseg{
	ll qaqui;
	int act;
	bool f;
	nodeseg(ll _q = 0, int _a = 0, bool _f = 0){
		qaqui = _q;
		act = _a;
		f = _f;
	}
	nodeseg operator + (nodeseg b){
		if(f && b.f) return nodeseg(0,0,1);
		if(f) return b;
		if(b.f) return *this;
		nodeseg ans = nodeseg(qaqui + b.qaqui, act + b.act, 0);
		return ans;
	}
} seg[4*MAXQ];

void update(int node, int x, int y, int q){
	debug(stderr, "oiu\n");
	if(x > q || y < q) return;
	if(x == y){
		seg[node].act++;
		seg[node].qaqui += q;
		return;
	}
	update(esq(node), x, mid(x,y,0), q);
	update(dir(node), mid(x,y,1), y, q);
	seg[node] = seg[esq(node)] + seg[dir(node)];
}

nodeseg query(int node, int x, int y, int l, int r){
	debug(stderr, "oiq\n");
	if(x > r || y < l) return nodeseg(0,0,1);
	if(x >= l && y <= r) return seg[node];
	nodeseg e = query(esq(node), x, mid(x,y,0), l, r);
	nodeseg d = query(dir(node), mid(x,y,1), y, l, r);
	return e + d;
}

int bb(int node, int x, int y, ll q){
	debug(stderr, "oi\n");
	debug("BB %lld\n", q);
	if(x == y) return x;
	if(seg[esq(node)].qaqui >= q){
		return bb(esq(node), x, mid(x,y,0), q);
	}
	return bb(dir(node), mid(x,y,1), y, q - seg[esq(node)].qaqui);
}

bool comp(worker i, worker j){
	return i.q < j.q;
}
double w;
int n;

int main(){
	scanf("%d %lf", &n, &w);

	for(int i = 1; i <= n; i++){
		scanf("%lf %lf", &workers[i].s, &workers[i].q );
		workers[i].q = (int)workers[i].q;
		workers[i].id = i;
		
	}
	sort(workers + 1, workers + 1 + n);
	
	double kfd;
	int qtd = 0;
	double tots = 1e18;
	for(int i = 1; i <= n; i++){
		
		double k = workers[i].s/workers[i].q;
		double aq = w/k;
		int tot = 0;
		double totq = 0;
		debug("%d %lf %lf\n", workers[i].id, k, aq);
		debug(stderr, "%d afs\n", i);
		debug(stderr, "%lf", workers[i].q);
		update(1,1,MAX,workers[i].q);

		if(seg[1].qaqui <= aq){
			tot = seg[1].act;
			totq = seg[1].qaqui;
		}else{
			int id = bb(1,1,MAX,(int)aq) - 1;
			tot = query(1,1,MAX,1,id).act;
			totq = query(1,1,MAX,1,id).qaqui;
		}
		if(tot == qtd){
			debug("T: %d\n", tot);
			if(tots > totq*k ){
				kfd = k;
				tots =totq*k;
			}
		}
		if(tot > qtd){
			debug("T: %d\n", tot);
			kfd = k;
			qtd = tot;
			tots = totq*k;
		}
	}
	vector<int> ans;
	sorttwo = 1;
	sort(workers + 1, workers + 1 + n, comp);
	double aq = 0;
	for(int j = 1; j <= n; j++){
		if(workers[j].q* kfd < workers[j].s) continue;
		aq += kfd*workers[j].q;
		if(aq > w){
			break;
		}
		ans.push_back(workers[j].id);
	}
	printf("%d\n",(int)ans.size() );
	for(int i : ans) printf("%d\n", i);
}

Compilation message (stderr)

hiring.cpp: In function 'int main()':
hiring.cpp:82:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |  scanf("%d %lf", &n, &w);
      |  ~~~~~^~~~~~~~~~~~~~~~~~
hiring.cpp:85:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |   scanf("%lf %lf", &workers[i].s, &workers[i].q );
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hiring.cpp:133:18: warning: 'kfd' may be used uninitialized in this function [-Wmaybe-uninitialized]
  133 |   if(workers[j].q* kfd < workers[j].s) continue;
      |      ~~~~~~~~~~~~^~~~~
#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...