ABC449D题解

D题

我们可以将所有点分为 \(|x| < |y|\)\(|x| \ge |y|\)(好像是废话),通过枚举 \(x\),找到 \(l\)\(r\) 满足 \(u \le l \le r \le d\),使 \(\forall l \le y \le r \ \ |x| \ge |y|\),然后分 \([u,l-1]\)\([l,r]\)\([r+1,d]\) 三个区间讨论就可以了,具体统计方法详见代码(其实手玩一下就出来了)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int l,r,d,u,ans;
int get(int l,int r){
	int x=l%2,y=r%2;
	if(!x&&!y) return (r-l)/2+1;
	if(x&&y) return (r-l)/2;
	return (r-l+1)/2;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>l>>r>>d>>u;
	for(int i=l;i<=r;i++){
		int mn=max(-abs(i),d);
		int mx=min(abs(i),u);
		if(mn>mx) ans+=get(d,u);
		else{
			if(mn>d) ans+=get(d,mn-1);
			if(mx<u) ans+=get(mx+1,u);
			if(i%2==0) ans+=mx-mn+1;
		}
	}
	cout<<ans;
} 
posted @ 2026-03-14 21:55  hwc2011  阅读(5)  评论(0)    收藏  举报