90 pts WA #9 求助
查看原帖
90 pts WA #9 求助
1268478
時空楼主2024/12/13 23:27

RT,Hack 全过。大家都是 WA #7,感觉 WA #9 非常奇葩。

#include <bits/stdc++.h>

#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair <ll, ll>
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)

using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;

const ll N = 2e6 + 7, M = 1e3 + 5;
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;

ll n;

ll p[N], d[N], v[N];
ll s[N], t[N];

bool f[N];

// i -> i : all 

void pushup(ll k) { t[k] = min(t[k << 1], t[k << 1 | 1]); }

void build(ll k, ll l, ll r)
{
	if (l == r) { t[k] = s[l]; return ; }
	ll mid = l + r >> 1;
	build(k << 1, l, mid);
	build(k << 1 | 1, mid + 1, r);
	pushup(k);
}
ll Q(ll k, ll l, ll r, ll ql, ll qr)
{
//	cout << "query " << l << ' ' << r << ' ' << ql << ' ' << qr << '\n';
	if (ql <= l && r <= qr) return t[k];
	ll mid = l + r >> 1, cc = 1e18;
	if (ql <= mid) cc = min(cc, Q(k << 1, l, mid, ql, qr));
	if (qr > mid) cc = min(cc, Q(k << 1 | 1, mid + 1, r, ql, qr));
	return cc;
}

// 2 -1 3 -1 1

/*
3
1 2
2 1
1 1

3
1 100
10000 500
298 200
*/

// -1 1 0
// 5 4 3 2 1 5 4 3 2 1 

ll lst(ll x)
{
	if (x == 1) return n;
	return x - 1;
}

signed main()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	
	FstIO;
	
	cin >> n;
	for (ll i = 1; i <= n; ++ i ) cin >> p[i] >> d[i];
	for (ll i = 0; i <= (n << 2); ++ i ) t[i] = 1e18;
	for (ll i = 1; i <= (n << 1); ++ i ) 
	{
		if (i <= n) v[i] = p[i] - d[i];
		else v[i] = p[i - n] - d[i - n];
		s[i] = s[i - 1] + v[i];
	}
//	for (ll i = 1; i <= (n << 1); ++ i ) cout << s[i] << ' '; cout << '\n';
	build(1, 1, (n << 1));
	for (ll i = 1; i <= n; ++ i )
	{
		ll v = Q(1, 1, (n << 1), i, i + n - 1);
//		cout << v << ' ' << s[i - 1] << ' ';
		if (v - s[i - 1] >= 0) f[i] = true;
		else f[i] = false;
		 
//		cout << i << ' ' << f[i] << '\n';
	}
	
	
	
	for (ll i = 0; i <= (n << 2); ++ i ) t[i] = 1e18;
	for (ll i = 0; i <= (n << 1); ++ i ) s[i] = 0;
	for (ll i = 1; i <= n; ++ i )
	{
		v[i] = p[i] - d[lst(i)];
	}
	for (ll i = n + 1; i <= (n << 1); ++ i ) v[i] = p[i - n] - d[lst(i - n)];
	
//	s[1] = p[n];
	for (ll i = 1; i <= n; ++ i ) 
	{
		ll q = n - i + 1;
		s[i] = s[i - 1] + v[q];
	}
	for (ll i = n + 1; i <= (n << 1); ++ i )
	{
		ll q = i - n; q = n - q + 1;
		s[i] = s[i - 1] + v[q]; 
	}
	build(1, 1, (n << 1));
//	for (ll i = 1; i <= (n << 1); ++ i ) cout << v[i] << ' '; cout << '\n';
//	for (ll i = 1; i <= (n << 1); ++ i ) cout << s[i] << ' '; cout << '\n';
//	for (ll i = 1; i <= (n << 1); ++ i ) cout << t[i] << ' '; cout << '\n';
	
	
	for (ll i = 1; i <= n; ++ i )
	{
		if (f[n - i + 1]) continue;
		ll v = Q(1, 1, (n << 1), i, i + n - 1); 	
//		cout << n - i + 1 << ' ' << i << ' ' << i + n - 1 << ' ' << v << ' ' << s[i - 1] << '\n';
//		cout << "deb \n";
//		for (ll j = i; j <= i + n - 1; ++ j ) cout << s[j] << ' '; cout << '\n';
		if (v - s[i - 1] >= 0) f[n - i + 1] = true;
	}
	
	for (ll i = 1; i <= n; ++ i ) cout << (f[i] ? "TAK\n" : "NIE\n");
	

	return 0;
	
	cout.flush();
}
2024/12/13 23:27
加载中...