萌新求助,第一个点和第三个点RE(80分)
查看原帖
萌新求助,第一个点和第三个点RE(80分)
553469
huangsibo楼主2024/9/13 16:00
#include <bits/stdc++.h>
#define ll long long 
using namespace std;

const ll N = 5e4 + 5;

int n, m;
ll a[N], b[N];
map <ll, bool> tong;

struct Line_Segment_Tree {
	int l, r, maxxid;
	ll maxx;
	bool is;
} t[4 * N];

void build_tree (ll p, ll l, ll r) {
	t[p].l = a[l];
	t[p].r = a[r];
	t[p].is = false;
	
	if (l == r) {
		t[p].maxx = b[l];
		t[p].maxxid = l;
		return ;
	}
	
	ll mid = (l + r) / 2;
	build_tree (p * 2, l, mid);
	build_tree (p * 2 + 1, mid + 1, r);
	
	if (t[p * 2].is == true || t[p * 2 + 1].is == true || t[p * 2].r + 1 != t[p * 2 + 1].l)
		t[p].is = true;
	
	if (t[p * 2].maxx >= t[p * 2 + 1].maxx) {
		t[p].maxx = t[p * 2].maxx;
		t[p].maxxid = t[p * 2].maxxid;
	} else {
		t[p].maxx = t[p * 2 + 1].maxx;
		t[p].maxxid = t[p * 2 + 1].maxxid;
	}
}

bool maybe (ll p, ll mbl, ll mbr) {
	if (mbl <= t[p].l && t[p].r <= mbr)
		return t[p].is;
	
	bool ans = false, ans1 = false;
	bool left = false, right = false;
	if (mbl <= t[p * 2].r) {
		ans = maybe (p * 2, mbl, mbr);
		left = true;
	}
	if (mbr >= t[p * 2 + 1].l) {
		ans1 = maybe (p * 2 + 1, mbl, mbr);
		right = true; 
	}
	if (ans == true || ans1 == true || (left == true && right == true && t[p * 2].r + 1 != t[p * 2 + 1].l))
		return true;
	return false;
}

int ask_maxx (ll p, ll mbl, ll mbr) {
	if (mbl <= t[p].l && t[p].r <= mbr)
		return t[p].maxxid;
	
	int ans = n + 1, ans1 = n + 1;
	if (mbl <= t[p * 2].r)
		ans = ask_maxx (p * 2, mbl, mbr);
	if (mbr >= t[p * 2 + 1].l)
		ans1 = ask_maxx (p * 2 + 1, mbl, mbr);
	
	if (b[ans] >= b[ans1])
		return ans;
	if (b[ans] < b[ans1])
		return ans1;
}

int main () {
	ios :: sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i] >> b[i];
		tong[a[i]] = i;
	} 
	
	build_tree (1, 1, n);
	
	cin >> m;
	for (int i = 1; i <= m; i ++) {
		ll mbr, mbl;
		cin >> mbl >> mbr;
		
		bool is_maybe = maybe (1, mbl, mbr);
		int ans = ask_maxx (1, mbl + 1, mbr), ans1 = ask_maxx (1, mbl, mbr);
		if ((tong[mbl] != 0 && a[ans1] != mbl) || (tong[mbr] != 0 && a[ans] != mbr)) 
			cout << "false";
		else if (tong[mbl] == 0 || tong[mbr] == 0 || (tong[mbl] != 0 && tong[mbr] != 0 && is_maybe == true))
			cout << "maybe";
		else
			cout << "true";
		cout << endl;
	}
	return 0;
}

把测试点1下了下来,就输出了一部分数据:

maybe
maybe
maybe
maybe
false
maybe
false
true
true
true
maybe

但是都对

2024/9/13 16:00
加载中...