\(\text{Solution}\)

发现每个时刻的状态一定是所有点在一个最外围三角形的内部

设 \(f_{i,j,k,p}\) 表示排列填到第 \(p\) 位,此时图形最外围的三角形是以编号为 \(i,j,k\) 的三角形的方案数

那么考虑这个三角形是怎么来的,于是又两个转移

1.前 \(1~p-1\) 位已经填出了 \(i,j,k\) 这个三角形,那么这一位就可以填这个三角形内部还没填的点

2.到第 \(p\) 位才填出这个三角形,那么这个三角形一定是从一个小三角形转移过来,枚举内部一个点,令它与 \(i,j,k\) 中任意两点组成小三角形转移即可

判断一个点是否在某个三角形内部可以用面积,面积用叉乘算即可

显然这个 \(dp\) 是 \(O(n^5)\) 的

考虑优化,强制枚举的 \(i<j<k\)

这个就优秀很多了,\(JZOJ\) 上可以过,\(LG\) 上要开 \(O\)

\(\text{Code}\)

#include <cstdio>
#include <cmath>
#include <iostream>
#define LL long long
#define re register
using namespace std; const int N = 45;
const LL P = 1e9 + 7;
int n, h[N][N][N];
LL f[N][N][N][N];
struct Point{
double x, y;
inline Point(double xx = 0, double yy = 0){x = xx, y = yy;}
inline Point operator - (const Point &B){return Point(x - B.x, y - B.y);}
}a[N];
inline double Cross(const Point &A, const Point &B){return fabs(A.x * B.y - A.y * B.x);}
inline double Area(int i, int j, int k){return Cross(a[i] - a[j], a[k] - a[j]);}
inline int isIn(int i, int j, int k, int l)
{
return fabs(Area(i, j, k) - Area(i, j, l) - Area(j, k, l) - Area(i, k, l)) <= 1e-6;
} inline void Add(LL &x, LL y){x = (x + y) % P;}
inline void trans(int p, int i, int j, int k, int x, int y, int z)
{
if (z < x) swap(x, z);
if (z < y) swap(y, z);
Add(f[i][j][k][p], f[x][y][z][p - 1]);
} int main()
{
scanf("%d", &n);
for(re int i = 1, x, y; i <= n; i++) scanf("%d%d", &x, &y), a[i] = Point(x, y);
for(re int i = 1; i <= n - 2; i++)
for(re int j = i + 1; j <= n - 1; j++)
for(re int k = j + 1; k <= n; k++)
for(re int l = 1; l <= n; l++)
if (l ^ i && l ^ j && l ^ k) h[i][j][k] += isIn(i, j, k, l);
for(re int i = 1; i <= n - 2; i++)
for(re int j = i + 1; j <= n - 1; j++)
for(re int k = j + 1; k <= n; k++) f[i][j][k][3] = 6;
for(re int p = 4; p <= n; p++)
for(re int i = 1; i <= n - 2; i++)
for(re int j = i + 1; j <= n - 1; j++)
for(re int k = j + 1; k <= n; k++)
{
if (h[i][j][k] - p + 4 > 0) Add(f[i][j][k][p], f[i][j][k][p - 1] * (h[i][j][k] - p + 4) % P);
for(re int l = 1, x, y, z; l <= n; l++)
if (l ^ i && l ^ j && l ^ k && isIn(i, j, k, l))
trans(p, i, j, k, i, j, l), trans(p, i, j, k, i, k, l), trans(p, i, j, k, j, k, l);
}
LL ans = 0;
for(re int i = 1; i <= n - 2; i++)
for(re int j = i + 1; j <= n - 1; j++)
for(re int k = j + 1; k <= n; k++)
ans = (ans + f[i][j][k][n]) % P;
printf("%lld\n", ans);
}

【USACO 2021 US Open, Gold】Permutation的更多相关文章

  1. 孤独的照片【USACO 2021 December Contest Bronze】

    孤独的照片 Farmer John 最近购入了 \(N\) 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一. 奶牛目前排成一排,Farmer John 想要为 ...

  2. 洛谷 P2812 校园网络【[USACO]Network of Schools加强版】 解题报告

    P2812 校园网络[[USACO]Network of Schools加强版] 题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是 ...

  3. jzoj6002. 【PKUWC2019模拟2019.1.15】Permutation (组合数)

    题面 题解 设\(lim=(n-1)/2\)(这里是下取整),那么\(x\)位置的值最大不能超过\(lim\),而\(y\)处的值不能小于\(y\),于是有\[Ans=\sum_{i=1}^{lim} ...

  4. P2812 校园网络【[USACO]Network of Schools加强版】

    题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...

  5. luogu P2812 校园网络【[USACO]Network of Schools加强版】|Tarjan

    题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...

  6. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...

  7. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...

  8. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  9. 【USACO 2019 Feburary Contest】Gold

    模拟二月金组,三个半小时AK. USACO 2019 Feburary Contest, Gold T1 题意:给定一棵树,每个点有点权,每次可以进行以下操作之一: 更改一个点的点权 求某条路径上的点 ...

  10. 【USACO】草地排水

    Drainage Ditches 草地排水 usaco 4.2.1描述在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一 ...

随机推荐

  1. linux mint 归档管理器报错Extraction not performd

    解决办法 后缀名的问题,后缀名与文件的真正类型不符合,至于到底是上面压缩类型,那只能靠尝试了,比如我这个是rar, 实际是zip,很坑,网上也没有这个问题的描述 其他 感觉 linux 对于文件类型方 ...

  2. ArcObjects SDK开发 008 从mxd地图文件说起

    1.Mxd文件介绍 ArcGIS的地图文件为.mxd扩展名.Mxd文件的是有版本的,和ArcGIS的版本对应.可以在ArcMap中的File-Save A Copy,保存一个地图拷贝的时候选择Mxd文 ...

  3. Day27:异常详解

    异常 1.1 异常概述 异常(Exception)指程序运行中出现的不正常情况:文件找不到.网络异常.非法参数等等. 我们通过代码来了解一下: public class Demo{ public st ...

  4. Isaac SDK & Sim 环境

    Isaac 是 NVIDIA 开放的机器人平台.其 Isaac SDK 包括以下内容: Isaac Apps: 各种机器人应用示例,突出 Engine 特性或专注 GEM 功能 Isaac Engin ...

  5. shell编写循环检查脚本

    背景:如下脚本实现当微服务重启后,检查微服务的启动端口正常,可通过轮询的方式来实现所需要用到配置文件config.properties信息如下: onlineService:8001 algorthS ...

  6. 【Java EE】Day02 MySQL概念、软件、语句

    〇.总结 1. 一.数据库的基本概念 1.概念 用于存储和管理数据的仓库 特点: 持久化存储,本质是文件系统 方便存储和管理数据 使用统一方式(MySQL)操作 常见的数据库软件: MySQL:Ora ...

  7. 协程- gevent模块

    协程 1.什么是协助:在单线程下实现并发效果 2.协程的原理: 通过代码监听IO操作一旦遇到 IO 操作就立刻切换下一个程序 让cpu一直在工作 这样就可以一直占用CPU的效率 提高程序执行效率 切换 ...

  8. 【leetcode】剑指offer04二维数组查找

    很巧妙地把矩阵转化为二叉搜索树(不过好像没什用) class Solution { public: bool findNumberIn2DArray(vector<vector<int&g ...

  9. python文件的写入与读出

    Python对文件的处理,新建目录,写入一个txt文件然后读取刚才写入的内容.这里是在windows系统演示,目录用"\".如果在linux系统,区别就是目录的斜杠号要用" ...

  10. vue3+ts 全局事件总线mitt

    Mitt 在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了.然而我们习惯了使用EventBus,对于这种情况 ...