제출 #1345454

#제출 시각아이디문제언어결과실행 시간메모리
1345454enzy팀들 (IOI15_teams)C++20
0 / 100
4091 ms33868 KiB
#include "teams.h"
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
const int maxn=5e5+10;
vector<int>v[maxn];

int seg[4*maxn], lz[4*maxn], n;

void build(int id, int ini, int fim){
	// cerr << "> " << ini << ' ' << fim << endl;
	seg[id]=0; lz[id]=-1;
	if(ini==fim) return;
	int mid=(ini+fim)/2, e=2*id, d=2*id+1;
	build(e,ini,mid); build(d,mid+1,fim);
}

void refresh(int id, int ini, int fim){
	if(lz[id]==-1) return;
	if(ini!=fim){
		int e=2*id, d=2*id+1;
		lz[e]=lz[d]=lz[id];
	}
	seg[id]=lz[id];
	lz[id]=-1;
}

void update_set(int id, int ini, int fim, int l, int r){
	refresh(id,ini,fim);
	if(ini>r||fim<l) return;
	if(l<=ini&&fim<=r){
		lz[id]=0;
		refresh(id,ini,fim);
		return;
	}
	int mid=(ini+fim)/2, e=2*id, d=2*id+1;
	update_set(e,ini,mid,l,r); update_set(d,mid+1,fim,l,r);
}

void update_sum(int id, int ini, int fim, int cara, int val){
	refresh(id,ini,fim);
	if(ini==fim){
		seg[id]+=val;
		return;
	}
	int mid=(ini+fim)/2, e=2*id, d=2*id+1;
	if(cara<=mid) update_sum(e,ini,mid,cara,val);
	else update_sum(d,mid+1,fim,cara,val);
	seg[id]=seg[e]+seg[d];
}

int query_sum(int id, int ini, int fim, int l, int r){
	refresh(id,ini,fim);
	if(ini>r||fim<l) return 0;
	if(l<=ini&&fim<=r) return seg[id];
	int mid=(ini+fim)/2, e=2*id, d=2*id+1;
	return query_sum(e,ini,mid,l,r)+query_sum(d,mid+1,fim,l,r);
}

int query(int id, int ini, int fim, int l, int r, int qtd){
	refresh(id,ini,fim);
	if(ini==fim) return ini;
	int mid=(ini+fim)/2, e=2*id, d=2*id+1;
	refresh(e,ini,mid); refresh(d,mid+1,fim);
	if(seg[e]>=qtd) return query(e,ini,mid,l,r,qtd);
	return query(d,mid+1,fim,l,r,qtd-seg[e]);
}

void init(int N, int A[], int B[]){
	for(int i=0;i<N;i++) v[A[i]].push_back(B[i]);
	n=N;
}

int can(int M, int K[]){
	// cerr << "query" << endl; 
	sort(K,K+M);
	build(1,1,n);
	int id=0;
	for(int i=1;i<=n;i++){
		// cerr << "! " << i << endl;
		for(int x : v[i]) update_sum(1,1,n,x,1);
		while(id<M&&i==K[id]){
			if(query_sum(1,1,n,i,n)<i) return 0;
			int at=query(1,1,n,i,n,i);
			int subtrai=i-query_sum(1,1,n,i,at-1);
			// cerr << "? " << at << ' ' << subtrai << endl;
			update_set(1,1,n,i,at-1); update_sum(1,1,n,at,-subtrai);
			id++;
		}
	}
	return 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...