Submission #25008

#TimeUsernameProblemLanguageResultExecution timeMemory
25008minimarioTug of War (BOI15_tug)C++14
23 / 100
39 ms9248 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX = 30005;

set<int> left1[MAX];
set<int> right1[MAX];
int l[MAX], r[MAX], s[MAX]; // the people

int leftpts = 0;
int rightpts = 0;
int ropel[MAX], roper[MAX];

void nosolution() {
	printf("NO\n"); exit(0);
}
int main() {
	//freopen("a.in", "r", stdin);
	//freopen("a.out", "w", stdout);
	int n, k; scanf("%d %d", &n, &k);
	set<int> students;
	for (int i=1; i<=2*n; i++) {
		scanf("%d %d %d", &l[i], &r[i], &s[i]);
		right1[r[i]].insert(i);
		left1[l[i]].insert(i);
		students.insert(i);
	}
	set<pair<int, int>> left_data, right_data;

	for (int i=1; i<=n; i++) {
		if (left1[i].empty() || right1[i].empty()) {
			nosolution();
		}
		left_data.insert({left1[i].size(), i});
		right_data.insert({right1[i].size(), i});
	}

	bool repeat = true;
	while (repeat) {
		repeat = false;
		if (!left_data.empty() && left_data.begin()->first <= 0) {
			nosolution();
		}
		if (!left_data.empty() && left_data.begin()->first == 1) {
			pair<int, int> fixed = *left_data.begin();
			int pos = fixed.second;
			int student = *(left1[pos].begin());
			leftpts += s[student];
			left_data.erase(fixed);
			left1[pos].erase(student);
			students.erase(student);
			ropel[pos] = student; // assign the student to the position on the rope
			int rightpos = r[student];
			right_data.erase({right1[rightpos].size(), rightpos});
			right1[rightpos].erase(student);
			right_data.insert({right1[rightpos].size(), rightpos});
			repeat = true;
		}
		if (!right_data.empty() && right_data.begin()->first <= 0) {
			nosolution();
		}
		if (!right_data.empty() && right_data.begin()->first == 1) {
			pair<int, int> fixed = *right_data.begin();
			int pos = fixed.second;
			int student = *right1[pos].begin();
			rightpts += s[student];
			right_data.erase(fixed);
			right1[pos].erase(student);
			students.erase(student);
			roper[pos] = student; // assign the student to the position on the rope
			int leftpos = l[student];
			left_data.erase({left1[leftpos].size(), leftpos});
			left1[leftpos].erase(student);
			left_data.insert({left1[leftpos].size(), leftpos});
			repeat = true;
		}
	}
	printf("YES\n"); return 0;
	for (int i : students) { cout << i << " "; } 
	set<int> lefts; // the collection of left values
	set<int> rights;
	vector<pair<int, int> > matches[MAX]; // the 2 pairs (right, strength) of a given left
	vector<int> inverse[MAX]; // the left values with a right value of i
	vector<pair<int, pair<int, int> > > g[MAX]; // [dest, [w1, w2]]
	bool v[MAX];

	for (int i : students) {
		lefts.insert(l[i]);
		rights.insert(r[i]);
		matches[l[i]].push_back({r[i], s[i]});
		inverse[r[i]].push_back(l[i]);
	}

	for (int i : lefts) { 
		pair<int, int> e1 = matches[i][0];
		pair<int, int> e2 = matches[i][1];
		//cout << "left value: " << i << endl;
		//cout << "two rights: " << e1.first << " " << e2.first << endl;
		//cout << "strengths: " << e1.second << " " << e2.second << endl;

		g[e1.first].push_back({e2.first, {e1.second, e2.second}});
		g[e2.first].push_back({e1.first, {e2.second, e1.second}});
	}

	vector<int> choices;
	for (int i : rights) {
		if (v[i]) { continue; }
		cout << "cycling from... " << i << endl;
		v[i] = true;
		int start = i;
		if (g[start][0].first == g[start][1].first && g[start][0].first == start) {
			choices.push_back(abs(g[start][0].second.first-g[start][0].second.second));
			cout << "choices" << endl;
			for (int i : choices) { cout << i << " "; } cout << endl;	
			continue;
		}
		else {
			cout << "next level: " << i << endl;
			int sum1 = g[start][0].second.first;
			int sum2 = g[start][0].second.second;
			int last = start;
			int next = g[start][0].first;
			int its = 0;
			
			while (next != start) {

				v[next] = true;
				if (g[next][0].first != last) {
					sum1 += g[next][0].second.first;
					sum2 += g[next][0].second.second;
					last = next;
					next = g[next][0].first;
				}
				else if (g[next][1].first != last) {
					sum1 += g[next][1].second.first;
					sum2 += g[next][1].second.second;
					last = next;
					next = g[next][1].first;
				}
				else { 
					//cout << start << endl;
					//cout << g[start][0].second.first << " " << g[start][0].second.second << "." << endl;
					//cout << g[start][1].second.first << " " << g[start][1].second.second << "." << endl;
					sum1 = g[start][0].second.first + g[start][1].second.second;
					sum2 = g[start][1].second.first + g[start][0].second.second;
					//cout << sum1 << " " << sum2 << endl;
					break;
				}
			}
			choices.push_back(abs(sum1-sum2));
		}
	}
	/*
	cout << choices.size() << endl;
	for (int i : choices) {
		cout << i << endl;
	}
	*/

}

Compilation message (stderr)

tug.cpp: In function 'int main()':
tug.cpp:124:8: warning: unused variable 'its' [-Wunused-variable]
    int its = 0;
        ^
tug.cpp:21:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int n, k; scanf("%d %d", &n, &k);
                                  ^
tug.cpp:24:41: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &l[i], &r[i], &s[i]);
                                         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...