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;
}
浙公网安备 33010602011771号