解决限制条件。
- 我们可以通过在网格上画图来找到规律,具体就不讲了。
- 如果不考虑第三个限制条件,我们可以通过枚举所有三角形的交集来解决,如果一个图是
n
个三角形的交集,我们直接减掉n为偶数的,加上
n
为奇数的。
- 这里有很多的方法,但本质上就是容斥。
- 我们可以通过找规律来发现每个小三角形的面积对答案贡献的系数
ans+=Scnt−1∗−1cnt−1
- 同时我们也可以利用扫描线暴力的解决。。。
- 上面的量方法都太迷了,这里还有一种比较正常的办法。
- 我们发现类似于下面的图片中有效的部分只有覆盖奇数次的区域,我们可以直观的考虑把每个面积都计算出来。
- 但是我们没有办法直接求得
A
的面积,因为A是仅仅只有1,2含有的交集但可以通过求1∩2-
1∩2∩3
来得到。
- 所以我们看可以枚举所以的交集并减去多余的部分
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int M=1<<11;
ll n,S[M],ans,pre[M];
struct P{
ll x,y,r;
P operator&(const P&A)const{
P B=(P){max(A.x,x),max(A.y,y),0};
B.r=min(x+y+r,A.x+A.y+A.r)-B.x-B.y;
if(B.r<0)B.r=0;return B;
}void rd(){scanf("%d %d %d",&x,&y,&r);}
}A[M];
ll calc(int mask){
P t=(P){0,0,0};
for(int i=0;i<n;i++)if(mask&(1<<i)){
if(!t.r)t=A[i];
else {t=t&A[i];if(!t.r)return 0;}
}return 1ll*t.r*t.r;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)A[i].rd();
for(int i=1;i<1<<n;i++)S[i]=calc(i);
for(int i=1;i<1<<n;i++){
int I=i,c=0;
while(I)c++,I-=I&-I;
if(c%2==0)continue;
pre[i]=S[i];
for(int j=1;j<1<<n;j++)if(!(i&j)){
int c=0,J=j;
while(J)c++,J-=J&-J;
if(c&1)pre[i]-=S[i|j];
else pre[i]+=S[i|j];
}
ans+=pre[i];
}
printf("%lld.%d",ans/2,(ans&1)?5:0);
return 0;
}
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int M=1e5+5;
struct node{
int x,y,r;
void rd(){scanf("%d%d%d",&x,&y,&r);}
}A[M];
int n,D[M],num;
vector<int>yy[2];
long long ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)A[i].rd();
for(int i=1;i<=n;i++)D[++num]=A[i].x,D[++num]=A[i].x+A[i].r;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)if(i!=j){
if(A[i].y<=A[j].y&&A[j].y<=A[i].y+A[i].r){
int X=A[i].x+(A[i].y+A[i].r-A[j].y);
if(A[j].x<=X&&X<=A[j].x+A[j].r)D[++num]=X;
}
}
sort(D+1,D+num+1);
num=unique(D+1,D+num+1)-(D+1);
for(int c=1;c<num;++c){
yy[0].clear();yy[1].clear();
for(int i=1;i<=n;++i)
if(A[i].x<=D[c]&&D[c]<A[i].x+A[i].r){
yy[0].pb(A[i].y);
yy[0].pb(A[i].y+(A[i].x+A[i].r-D[c]));
}
for(int i=1;i<=n;++i)
if(A[i].x<D[c+1]&&D[c+1]<=A[i].x+A[i].r){
yy[1].pb(A[i].y);
yy[1].pb(A[i].y+(A[i].x+A[i].r-D[c+1]));
}
sort(yy[0].begin(),yy[0].end());
sort(yy[1].begin(),yy[1].end());
int sz=yy[0].size();
for(int i=0;i+1<sz;++i)if(i%2==0){
ans+=1ll*(yy[0][i+1]-yy[0][i]+yy[1][i+1]-yy[1][i])*(D[c+1]-D[c]);
}
}
printf("%.1f",0.5*ans);
return 0;
}