10-22 训练 T2 plate
题目大意
有N个圆盘,每个圆盘的圆周上均匀分布了P个点(可连成正P边形),编号到 。这P个点 中有M个关键点,所有关键点都是相同的。给出每个圆盘关键点位置的数据(对应的 ),现在 可以随意转动圆盘,问有多少对圆盘最终可以变成相同的形态。
思路
我们想要对两个序列进行比较,由于编号不一样,很明显想到比较间距。但是间距数列的首项不固定,如果在所有数列的循环同构(把数列首尾接成环,所有的展开而成数列都是循环同构)中暴力比较,复杂度为 ,不太 。这时就出现了一个神奇的算法:最小表示。
通过最小表示将序列按间距的字典序最小的方式排列,然后 就可以比较了。
于是重点变成了如何以 处理最小表示。
最小表示法
将数列 复制一份塞在其后来模拟环结构。
定义两个指针 , (初始为 和 )记录两个长度为 的数列的开头,定义 为正在比较的位置距列首的距离。遍历 ,当比较发现 和 有差别时(这里不妨设是 ),说明 都不会是最小表示,那么我们将 跳到 ,并且如果 时,我们将 再加一以保证比较的是两个不一样的排列。
如过 遍历到了 ,说明两个排列完全相等,由于我们保证了不对比两个一样的排列,说明这时数列中的元素全部是一样的。这时跳出函数以任意点做起点就行了。
如果 或 有一个超过了 那么所有的排列都被比较完了,那么仍在 范围内的那个指针就作为数列的起点。
Code
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,p,ans;
int a[501][1001],dis[501][1001];
int st[501],num[501],fa[501];
int findd(int x){
if(x!=fa[x]) return fa[x]=findd(fa[x]);
else return fa[x];
}
void add(int x,int y){
int anx=findd(x),any=findd(y);
if(anx==any) return ;
ans+=num[x];
num[x]+=num[y];
num[y]=0;
fa[any]=anx;
}
int main()
{
scanf("%d %d %d",&n,&m,&p);
for(int i=1;i<=n;i++){
fa[i]=i;
num[i]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
sort(a[i]+1,a[i]+1+m);
for(int j=2;j<=m;j++){
dis[i][j-1]=a[i][j]-a[i][j-1];
}
dis[i][m]=a[i][1]-a[i][m]+p;
for(int j=1;j<=m;j++){
dis[i][m+j]=dis[i][j];
}
int x=1,y=2,k=0;
while(x<=m && y<=m){
while(k<m && dis[i][x+k]==dis[i][y+k]) k++;
if(k==m) break;
if(dis[i][x+k] > dis[i][y+k]){
x=x+k+1;
k=0;
if(x==y) x++;
}
else{
y=y+k+1;
k=0;
if(x==y) y++;
}
}
st[i]=min(x,y);
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int flag=1;
for(int l=0;l<m;l++){
if(dis[i][st[i]+l] != dis[j][st[j]+l]){
flag=0;
break;
}
}
if(flag){
add(i,j);
}
}
}
printf("%d",ans);
return 0;
}
最后统计答案做法很多,读者可以考虑别的做法。
-EOF-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫