Submission #40418

# Submission time Handle Problem Language Result Execution time Memory
40418 2018-02-01T12:30:02 Z IvanC Meteors (POI11_met) C++14
74 / 100
6000 ms 34804 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct pergunta{
	int ini,fim,meio,resp,id;
	pergunta(int _ini = 0,int _fim = 0,int _id = 0){
		ini = _ini;
		fim = _fim;
		id = _id;
		meio = -1;
		resp = -1;
	}
	bool operator<(const pergunta &other)const{
		return meio < other.meio;
	}
};
const int MAXN = 300010;
vector<int> estados[MAXN];
vector<pergunta> P;
ll seg[4*MAXN],lazy[4*MAXN];
int N,M,K,li[MAXN],ri[MAXN],ai[MAXN],qtd[MAXN];
void propagate(int pos,int left,int right){
	seg[pos] += lazy[pos];
	if(left != right){
		lazy[2*pos] += lazy[pos];
		lazy[2*pos+1] += lazy[pos];
	}
	lazy[pos] = 0;
}
void build(int pos,int left,int right){
	seg[pos] = lazy[pos] = 0;
	if(left == right) return;
	int mid = (left+right)/2;
	build(2*pos,left,mid);
	build(2*pos+1,mid+1,right);
}
void update(int pos,int left,int right,int i,int j,ll val){
	propagate(pos,left,right);
	if(left > right || left > j || right < i) return;
	if(left >= i && right <= j){
		lazy[pos] += val;
		propagate(pos,left,right);
		return;
	}
	int mid = (left+right)/2;
	update(2*pos,left,mid,i,j,val);
	update(2*pos+1,mid+1,right,i,j,val);
}
ll query(int pos,int left,int right,int x){
	propagate(pos,left,right);
	if(left == right) return seg[pos];
	int mid = (left+right)/2;
	if(x <= mid) return query(2*pos,left,mid,x);
	else return query(2*pos+1,mid+1,right,x);
}
void do_update(int i){
	if(li[i] <= ri[i]){
		update(1,1,M,li[i],ri[i],ai[i]);
	}
	else{
		update(1,1,M,li[i],M,ai[i]);
		update(1,1,M,1,ri[i],ai[i]);
	}
}
int main(){
	scanf("%d %d",&N,&M);
	for(int i = 1;i<=M;i++){
		int x;
		scanf("%d",&x);
		estados[x].push_back(i);
	}
	for(int i = 1;i<=N;i++) scanf("%d",&qtd[i]);
	scanf("%d",&K);
	for(int i = 1;i<=N;i++){
		pergunta davez(1,K,i);
		P.push_back(davez);
	}
	for(int i = 1;i<=K;i++){
		scanf("%d %d %d",&li[i],&ri[i],&ai[i]);
	}
	int limite = ceil(log(K)/log(2)) + 1;
	for(int iteracao = 1;iteracao<=limite;iteracao++){
		build(1,1,M);
		for(int i = 0;i<N;i++){
			if(P[i].ini > P[i].fim) P[i].meio = -1;
			P[i].meio = (P[i].ini + P[i].fim)/2;
		}
		sort(P.begin(),P.end());
		int atualizacao = 1;
		for(int i = 0;i<N;i++){
			if(P[i].meio == -1) continue;
			while(atualizacao <= P[i].meio){
				do_update(atualizacao);
				atualizacao++;
			}
			ll tot = qtd[P[i].id];
			for(int j : estados[P[i].id]){
				tot -= query(1,1,M,j);
				if(tot <= 0) break;
			}
			if(tot <= 0){
				P[i].resp = P[i].meio;
				P[i].fim = P[i].meio - 1;
			}
			else{
				P[i].ini = P[i].meio + 1;
			}
		}
	}
	for(int i = 0;i<N;i++){
		qtd[P[i].id] = P[i].resp; 
	}
	for(int i = 1;i<=N;i++){
		if(qtd[i] == -1) printf("NIE\n");
		else printf("%d\n",qtd[i]);
	}
	return 0;
}

Compilation message

met.cpp: In function 'int main()':
met.cpp:66:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&N,&M);
                      ^
met.cpp:69:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&x);
                 ^
met.cpp:72:45: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i = 1;i<=N;i++) scanf("%d",&qtd[i]);
                                             ^
met.cpp:73:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&K);
                ^
met.cpp:79:41: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d",&li[i],&ri[i],&ai[i]);
                                         ^
# Verdict Execution time Memory Grader output
1 Correct 11 ms 7416 KB Output is correct
2 Correct 12 ms 7536 KB Output is correct
3 Correct 13 ms 7628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 7644 KB Output is correct
2 Correct 11 ms 7664 KB Output is correct
3 Correct 13 ms 7704 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 591 ms 11784 KB Output is correct
2 Correct 850 ms 12776 KB Output is correct
3 Correct 756 ms 12776 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 684 ms 12776 KB Output is correct
2 Correct 663 ms 12776 KB Output is correct
3 Correct 690 ms 12868 KB Output is correct
4 Correct 151 ms 12868 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 383 ms 12868 KB Output is correct
2 Correct 662 ms 13000 KB Output is correct
3 Correct 122 ms 13000 KB Output is correct
4 Correct 691 ms 13000 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 251 ms 13000 KB Output is correct
2 Correct 609 ms 13000 KB Output is correct
3 Correct 675 ms 13000 KB Output is correct
4 Correct 726 ms 13004 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 6100 ms 34804 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 6038 ms 34804 KB Time limit exceeded
2 Halted 0 ms 0 KB -