답안 #198586

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
198586 2020-01-26T17:33:46 Z Akashi Restore Array (RMI19_restore) C++14
0 / 100
600 ms 26140 KB
/**
	daca val = 0 atunci inseamna ca intervalul meu are cel putin k de 0 deci
	suma maxima pe intervalul meu este (r - l + 1) - k
	* sum[r] - sum[l - 1] <= (r - l + 1) - k
	
	daca val = 1 atunci inseamna ca am maxim k - 1 de 0 deci 
	suma minima pe intervalul meu este (r - l + 1) - (k - 1)
	* sum[r] - sum[l - 1] >= (r - l + 1) - (k - 1)
	* sum[l - 1] - sum[r] <= (k - 1) - (r - l + 1)
	
	intre doua adiacente am : 
	* sum[i] - sum[i - 1] <= 1
	   
	 muchiile j->i : xi - xj <= c, (in shortest path devine : di <= dj + c)
**/

#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;
int n, m;

vector <pair <int, int> > v[5005];
void add_edge(int x, int y, int c){
	v[x].push_back({y, c});
}


int d[5005], viz[5005];
queue <int> q;
bool bellman(){
	for(int i = 1; i <= n ; ++i) d[i] = INF;
	
	q.push(0);
	d[0] = 0;
	while(!q.empty()){
		int nod = q.front();
		q.pop();
	
		++viz[nod];
		if(viz[nod] >= n + 1) return 0;
		
		for(auto it : v[nod]){
			if(d[it.first] > d[nod] + it.second){
				d[it.first] = d[nod] + it.second;
				q.push(it.first);
			}
		}
	}
	
	return 1;
}

int main(){
	
	scanf("%d%d", &n, &m);
	int l, r, k, val;
	
	for(int i = 1; i <= n ; ++i) add_edge(i - 1, i, 1);
		
	for(int i = 1; i <= m ; ++i){
		scanf("%d%d%d%d", &l, &r, &k, &val);
		++l; ++r;
		
		if(val == 1) add_edge(r, l - 1, (k - 1) - (r - l + 1));
		else add_edge(l - 1, r, (r - l + 1) - k);
	}
	
	bool ok = bellman();
	if(!ok) printf("-1");
	else{
		for(int i = 1; i <= n ; ++i) 
			printf("%d ", d[i] - d[i - 1]);
	}
 	
	return 0;
}

Compilation message

restore.cpp: In function 'int main()':
restore.cpp:56:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~
restore.cpp:62:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d", &l, &r, &k, &val);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 376 KB Output is correct
2 Incorrect 5 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 760 KB Output is correct
2 Correct 18 ms 760 KB Output is correct
3 Correct 18 ms 760 KB Output is correct
4 Correct 16 ms 760 KB Output is correct
5 Execution timed out 619 ms 26140 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 760 KB Output is correct
2 Correct 18 ms 760 KB Output is correct
3 Correct 18 ms 760 KB Output is correct
4 Correct 16 ms 760 KB Output is correct
5 Execution timed out 619 ms 26140 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 376 KB Output is correct
2 Incorrect 5 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -