错了2个点,想不出错哪里,求样例
查看原帖
错了2个点,想不出错哪里,求样例
369353
dargrey楼主2021/2/10 10:52

这题类似合并排序吧,层层向上递推可能的结果。

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

int val[512 * 1024] = {0};
int k, m;
int base;
int ts[20];
vector<int> pos[256 * 1024];

void inits() {
	ts[0] = 1;
	for (int i = 1; i < 20; ++i)
		ts[i] = ts[i - 1] * 2;
}

// 这里是合并,向上计算可能的结果
void p2(int n) {
	int a = n, b = n + 1;
	int pa = 0, pb = 0;
	int dist = n / 2;
	while(pa < pos[a].size() && pos[a][pa] + m < pos[b][pb]) pa++;
	while(pb < pos[b].size() && pos[b][pb] + m < pos[a][pa]) pb++;
	while(pa < pos[a].size() && pb < pos[b].size()) {
		if (pos[a][pa] < pos[b][pb]) {
			pos[dist].push_back(pos[a][pa++]);
		} else if (pos[a][pa] > pos[b][pb])  {
			pos[dist].push_back(pos[b][pb++]);
		} else {
			pos[dist].push_back(pos[a][pa++]);
			pb++;
		}
	}
	while(pa < pos[a].size()) pos[dist].push_back(pos[a][pa++]);
	while(pb < pos[b].size()) pos[dist].push_back(pos[b][pb++]);
}

int p1(int num) {
	if (num == 0) {
		int temp;
		cin >> temp;
		return temp;
	}
	//初始化
	for (int i = 1; i < ts[num]; ++i)
		pos[i].clear();
	// 读入数据,并做第一步处理
	for (int i = ts[num]; i < ts[num + 1]; i += 2) {
		cin >> val[i] >> val[i + 1];
		if (val[i] > val[i + 1])
			swap(val[i], val[i + 1]);
		if (val[i] + m >= val[i + 1])
			pos[i/2].push_back(val[i]);
		if (val[i] != val[i + 1])
			pos[i/2].push_back(val[i + 1]);
	}
	// 层层向上计算
	while (num > 1) {
		num--;
		for (int i = ts[num]; i < ts[num + 1]; i += 2) {
			p2(i);
		}
	}
	// 最终结果
	return pos[1][0];
}

void p() {
	bool fail = false;
	cin >> k >> m;
	cin >> base;
	for (int i = 0; i < k; ++i) {
		int rs = p1(i);
		if (rs > base + m)
			fail = true;
	}
	if (fail)
		cout << "Yoshino" << endl;
	else 
		cout << "Kotori" << endl;
}

int main()
{
	inits();
	int q;
	cin >> q;
	for (int i = 0; i < q; ++i) {
		p();
	}
	return 0;
}
2021/2/10 10:52
加载中...