求条这次ABC D
  • 板块学术版
  • 楼主Guoguo2013
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/30 21:46
  • 上次更新2025/8/31 14:19:02
查看原帖
求条这次ABC D
1070982
Guoguo2013楼主2025/8/30 21:46

被大型分类讨论创飞了

#include<bits/stdc++.h>
#define int long long
#define PII pair< int, int >

using namespace std;

const int N = 1e5 + 5, mod = 998244353;
int n, m, l, rs, cs, rt, ct, aa, bb, daan;
pair< char, int > a[N], b[N]; 

template< typename T >inline void read(T &x){bool f=1;x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=!f;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=(f?x:-x);return;}
template< typename T, typename ... L > void read(T &a , L && ... b) { read(a); read(b ...); }
int ksm(int a, int b, int p){int ans = 1;while(b){if(b & 1)ans =(ans*a)%p;b >>= 1;a = (a*a) % p;}return ans;}
signed main(){
//	freopen("a.in", "r", stdin);
//	freopen("a.out","w",stdout);
	read(rs, cs, rt, ct);
	read(n, m, l);
	for (int i = 1; i <= m; i++){
		cin >> a[i].first;
		read(a[i].second);
	}
	for (int i = 1; i <= l; i++){
		cin >> b[i].first;
		read(b[i].second);
	} 
	for (aa = 1, bb = 1; aa <= m && bb <= l; ){
		if (rs == rt && cs == ct && a[aa].first == b[bb].first) daan += min(a[aa].second, b[bb].second);
		else if (rs + cs == rt + ct && abs(rt - rs) <= min(a[aa].second, b[bb].second)){
			if (rs > rt){
				if (a[aa].first == 'U' && b[bb].first == 'L' || a[aa].first == 'R' && b[bb].first == 'D')
					daan++;
			}
			else {
				if (a[aa].first == 'D' && b[bb].first == 'R' || a[aa].first == 'L' && b[bb].first == 'U')
					daan++;
			}
		}
		else if (rt - rs == ct - cs && abs(rt - rs) <= min(a[aa].second, b[bb].second)){
			if (rs > rt){
				if (a[aa].first == 'U' && b[bb].first == 'R' || a[aa].first == 'L' && b[bb].first == 'D')
					daan++;
			}
			else {
				if (a[aa].first == 'D' && b[bb].first == 'L' || a[aa].first == 'R' && b[bb].first == 'U')
					daan++;
			}
		}
		else if (rs == rt && !(abs(cs - ct) & 1) && min(a[aa].second, b[bb].second) >= (abs(cs - ct) >> 1)){
			if (cs > ct && a[aa].first == 'L' && b[bb].first == 'R') daan++;
			if (cs < ct && a[aa].first == 'R' && b[bb].first == 'L') daan++;
		}
		else if (cs == ct && !(abs(rs - rt) & 1) && min(a[aa].second, b[bb].second) >= (abs(rs - rt) >> 1)){
			if (rs > rt && a[aa].first == 'U' && b[bb].first == 'D') daan++;
			if (rs < rt && a[aa].first == 'D' && b[bb].first == 'U') daan++;
		}
		if (a[aa].first == 'U') rs -= min(a[aa].second, b[bb].second);
		if (a[aa].first == 'D') rs += min(a[aa].second, b[bb].second);
		if (a[aa].first == 'L') cs -= min(a[aa].second, b[bb].second);
		if (a[aa].first == 'R') cs += min(a[aa].second, b[bb].second);
		if (b[bb].first == 'U') rt -= min(a[aa].second, b[bb].second);
		if (b[bb].first == 'D') rt += min(a[aa].second, b[bb].second);
		if (b[bb].first == 'L') ct -= min(a[aa].second, b[bb].second);
		if (b[bb].first == 'R') ct += min(a[aa].second, b[bb].second);
		if (a[aa].second < b[bb].second){
			b[bb].second -= a[aa].second;
			aa++;
		}
		else if (a[aa].second > b[bb].second){
			a[aa].second -= b[bb].second;
			bb++;
		}
		else {
			aa++;
			bb++;
		} 
//		printf("%lld %lld %lld %lld %lld\n", rs, cs, rt, ct, daan); 
	}
	printf("%lld", daan);
	return 0;
}
2025/8/30 21:46
加载中...