一场9h才做完的AGC,
我太菜了,哇的一声哭出来 (。﹏。)
*B.Holes
若所有点贡献则两个端点概率各为 0.5 0.5 0.5,其余点概率为 0 0 0
注意到 R = 1 0 1 0 1 0 10 R=10^{10^{10^{10}}} R=10101010实在太大了——求所有点的凸包,可以只计算凸包外的点到每个点的概率(凸包内的点可以忽略不计)。
凸包上每个点的概率即 π − θ i 2 π ( θ i \dfrac{\pi-\theta_i}{2\pi}(\theta_i 2ππ−θi(θi是点 i i i内夹角)
还有一种 O ( n 2 log n ) O(n^2\log n) O(n2logn)的很好写的算法,戳这里
*C.Tiling
划分成 4 × 4 4\times 4 4×4的小方格,若 n , m n,m n,m为奇,单独用 1 × 2 , 2 × 1 1\times 2,2\times 1 1×2,2×1去填补最后一行/列。
注意特判右下角 3 × 3 3\times 3 3×3的方格(3同3异换成2同2异):
<>^
^*v
v<>
code from yfzcsc
#include<bits/stdc++.h>
using namespace std;
char s[1010][1010];
int n,m,a,b;
int main(){
scanf("%d%d%d%d",&n,&m,&a,&b);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)s[i][j]='.';
if(n&1)for(int i=1;i<m&&a;i+=2)s[n][i]='<',s[n][i+1]='>',a--;
if(m&1)for(int i=1;i<n&&b;i+=2)s[i][m]='^',s[i+1][m]='v',b--;
for(int i=1;i<n;i+=2)
for(int j=1;j<m;j+=2){
if(a>=2){
a-=2;
s[i][j]='<',s[i][j+1]='>';
s[i+1][j]='<',s[i+1][j+1]='>';
} else if(b>=2){
b-=2;
s[i][j]='^',s[i][j+1]='^';
s[i+1][j]='v',s[i+1][j+1]='v';
} else if(a&&b&&i==n-2&&j==m-2){
a--,b--;
s[i][j]='<',s[i][j+1]='>',s[i][j+2]='^';
s[i+1][j]='^',s[i+1][j+2]='v';
s[i+2][j]='v',s[i+2][j+1]='<',s[i+2][j+2]='>';
} else if(a){
a--;
s[i][j]='<',s[i