【USACO 2021 US Open, Gold】Permutation
\(\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的更多相关文章
- 孤独的照片【USACO 2021 December Contest Bronze】
孤独的照片 Farmer John 最近购入了 \(N\) 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一. 奶牛目前排成一排,Farmer John 想要为 ...
- 洛谷 P2812 校园网络【[USACO]Network of Schools加强版】 解题报告
P2812 校园网络[[USACO]Network of Schools加强版] 题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是 ...
- jzoj6002. 【PKUWC2019模拟2019.1.15】Permutation (组合数)
题面 题解 设\(lim=(n-1)/2\)(这里是下取整),那么\(x\)位置的值最大不能超过\(lim\),而\(y\)处的值不能小于\(y\),于是有\[Ans=\sum_{i=1}^{lim} ...
- P2812 校园网络【[USACO]Network of Schools加强版】
题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...
- luogu P2812 校园网络【[USACO]Network of Schools加强版】|Tarjan
题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...
- 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题
[Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...
- 【USACO 2019 Feburary Contest】Gold
模拟二月金组,三个半小时AK. USACO 2019 Feburary Contest, Gold T1 题意:给定一棵树,每个点有点权,每次可以进行以下操作之一: 更改一个点的点权 求某条路径上的点 ...
- 【USACO】草地排水
Drainage Ditches 草地排水 usaco 4.2.1描述在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一 ...
随机推荐
- 小米路由器局域网设备ping不通
问题 手机和电脑在同一个局域网内,都连接上小米路由器,我发现电脑部署的服务局域网设备都访问不到,甚至ping不到,排除了防火墙问题,最终发现是路由器一个设置导致的. 解决 将原来的混合加密,更换为强加 ...
- Execute Crond Service on openEuler
一.Execute Crond Service on openEuler 1 crond 概述 crond就是计划任务/定时任务 常见有闹钟.PC端定时关机 shutdown -s -t 200,定时 ...
- 使用python玩转二维码!速学速用!⛵
作者:韩信子@ShowMeAI Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 本文地址:https://showmeai.tech/art ...
- <一>智能指针基础
代码1 int main(){ //裸指针,手动开辟,需要自己释放,如果忘记了或者因为 //程序逻辑导致p没有释放,那么就会导致内存泄漏 int *p=new int(10); if(***){ re ...
- 【Spark】Day04-Spark Streaming:与离线批量比较、架构特点、入门案例、创建(队列、数据源)、转换(有状态、无状态)、输出方式、进阶(累加、转换为DF、缓存持久化)、实战(窗口统计)
一.概述 1.离线和实时计算 离线:数据量大,数据不会变化,MapReduce 实时:数据量小,计算过程要短 2.批量和流式处理 批量:冷数据,数据量大,速度慢 流:在线.实时产生的数据(快速持续到达 ...
- 5V升压12.6V
产品概述 PW4053 是一款 5V 输入,最大 1.2A 充电电流,支持三节锂离子电池的升压充电管理 IC.PW4053 集成功率 MOS,采用异步开关架构,使其在应用时仅需极少的外围器件,可有效减 ...
- 【JUC】循环屏障CyclicBarrier详解
欢迎关注专栏[JAVA并发] 前言 jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕.而jdk还有一个功能类似并发工具类 ...
- Java的两大、三类代理模式
简述 代理,是一种设计模式,主要作用是为其他对象提供一种代理,以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 主要分 ...
- OpenVINO计算机视觉模型加速
OpenVINO计算机视觉模型加速 OpenVINO介绍 计算机视觉部署框架,支持多种边缘硬件平台 Intel开发并开源使用的计算机视觉库 支持多个场景视觉任务场景的快速演示 四个主要模块: 1.开发 ...
- [opencv]一些重配遇到的问题(只针对我自己的电脑)
1.我的opencv版本是4.5.3 2.环境变量这样配 3.对于每个项目,项目属性这样配: 其中包含目录: C:\Users\dxd\OPCV\opencv\build\include\opencv ...