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 }
luogu P4515 [COCI2009-2010#6] XOR

 

posted @ 2018-09-07 19:13  KingSann  阅读(269)  评论(0编辑  收藏  举报