luogu P4515 [COCI2009-2010#6] XOR
题目描述
坐标系下有若干个等腰直角三角形,且每个等腰直角三角形的直角顶点都在左下方,两腰与坐标轴平行。
被奇数个三角形覆盖的面积部分为灰色,被偶数个三角形覆盖的面积部分为白色,如下图所示。
已知N个等腰直角三角形的顶点坐标及腰长,求灰色部分面积。
$1 \le N \le 10,1 \le X,Y,R \le 10^6$
首先要解决一个问题,如何求一堆三角形的面积交?
首先$S=R^2$,求最终交出来的三角形的直角边长也行
设第$i$个三角形的左下角顶点坐标为$(x_i,y_i)$,边长为$r_i$,记$c_i=x_i+y_i+r_i$
则$R_{\cap}=\max(0,\min(c_i)-\max(x_i)-\max(y_i))$
既$S_{\cap}=R_{\cap}^2$
证明:
如果最终可以交出来三角形,那么无非也就如下几种情况(黑色为$c_i$最小的三角形,红色为交出的三角形):
将变量设出来后显然得证
设$f(S)$表示选用集合$S$的三角形所交出来的三角形的面积
现在的目标是求$ans=\sum_{\emptyset \subsetneq S \subseteq U} f(S)g(| S |)$
也就是凑容斥系数
实际上$g(|S|)=(-1)^{|S|+1}2^{|S|-1}=(-2)^{|S|-1}$
证明:
对于一个交出来的三角形,设一共有$k$个三角形中包含这个三角形
即证:
$$\sum_{i=1}^{k}{k \choose i}(-1)^{i+1}2^{i-1}=[2 \nmid k]$$
也就是
$$\begin{aligned}\sum_{i=1}^{k}{k \choose i}(-1)^{i+1}2^{i-1}&=\sum_{i=1}^{k}{k \choose i}(-2)^{i-1} \\&=\frac{1}{-2}\sum_{i=1}^{k}{k \choose i}(-2)^{i} \\&=\frac{-{k \choose 0}(-2)^0+\sum_{i=0}^{k}{k \choose i}(-2)^{i}}{-2} \\&=\frac{-1+(-2+1)^{k}}{-2} \\&=\frac{1-(-1)^{k}}{2} \\ &=[2 \nmid k]\end{aligned}$$
于是就做完了
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct TRI { ll x, y, r, c; } tri[12]; 5 ll ans; int n; 6 void dfs(int i, ll x, ll y, ll c, int sz, int sig) { 7 if(x + y >= c) return ; 8 if(i == n + 1) sz ? (ans += sig * (1ll << (sz - 1)) * (c - x - y) * (c - x - y)) : 0; 9 else dfs(i + 1, x, y, c, sz, sig), dfs(i + 1, max(x, tri[i].x), max(y, tri[i].y), min(c, tri[i].c), sz + 1, -sig); 10 } 11 int main() { 12 cin >> n; 13 for(int i = 1 ; i <= n ; ++ i) cin >> tri[i].x >> tri[i].y >> tri[i].r, tri[i].c = tri[i].x + tri[i].y + tri[i].r; 14 dfs(1, 0, 0, 1e18, 0, -1); 15 printf("%.1lf\n", ans / 2.0); 16 }