CF718E Matvey‘s Birthday(状压、bfs、暴力、分类讨论)

解析

比较复杂的一道题
看数据范围,我们肯定要从种类很少的颜色入手

因为第二种加边方式和颜色密切相关
所以设计disi,kdis_{i,k}disi,k表示 i 号节点到颜色为 k 的节点的最小步数
通过对每个k bfs一遍就能得出答案
然后两个点之间的距离就可以写出转移式:
fi,j=min⁡(∣i−j∣,min⁡k8disi,k+disj,k+1)f_{i,j}=\min (|i-j|, \min_k^8dis_{i,k}+dis_{j,k}+1)fi,j=min(ij,kmin8disi,k+disj,k+1)
考虑这样我们就得到了一种n2n^2n2的算法

考虑如何加速
首先,由于最差情况就是aabbcc…这样的情形,答案不会超过15,所以第一项我们只需要在距离[i-15,i-1]的区间考虑,可以暴力求解

关键是对后面一项的处理

设计coli,jcol_{i,j}coli,j表示从任意 i 颜色的块走到任意 j 颜色的块的最小步数
这个也可以在bfs时顺便转移
可以得到一个不等关系式:
colai,j≤disi,j≤colai,j+1col_{a_i,j}\leq dis_{i,j}\leq col_{a_i,j}+1colai,jdisi,jcolai,j+1
为什么?
也比较显然,如果任何一个不等关系不符合,col和dis数组就会在bfs时互相更新,使这个不等关系重新满足

所以,我们的dis-col的差值只可能为0或1,我们可以把8个对应的差值状态压缩,然后一起求解

实现上,建议把所有状态的结果预处理出来,会在瓶颈部分少一个8的循环,应该快很多

代码

#include<bits/stdc++.h>const int N=1e5+100;
const int mod=1e9+7;
#define ll long long
using namespace std;
inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;int col[9][9],dis[N][9],a[N];
bool vis[N];
char s[N];
int q[N],st,ed;
int dx[3]={0,1,-1};
vector<int>v[9];
void bfs(int k){memset(vis,0,sizeof(vis));st=1;ed=0;for(int i=1;i<=n;i++){if(a[i]==k) q[++ed]=i,vis[i]=1;}col[k][k]=0;while(st<=ed){int now=q[st++];for(int i=1;i<=2;i++){int to=now+dx[i];if(vis[to]||to==0||to>n) continue;vis[to]=1;dis[to][k]=dis[now][k]+1;q[++ed]=to;}if(col[k][a[now]]==1e9){col[k][a[now]]=dis[now][k];for(int i=0,tp=v[a[now]].size();i<tp;i++){int x=v[a[now]][i];if(!vis[x]){dis[x][k]=dis[now][k]+1;q[++ed]=x;vis[x]=1;}}}}return;
}
int mi[15],cst[2060][2060];
int sta[N],num[2060];
int main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();scanf(" %s",s+1);for(int i=1;i<=8;i++){for(int j=1;j<=8;j++) col[i][j]=1e9;}for(int i=1;i<=n;i++) a[i]=s[i]-'a'+1,v[a[i]].push_back(i);for(int i=1;i<=8;i++) bfs(i);mi[0]=1;for(int i=1;i<=11;i++) mi[i]=mi[i-1]<<1;for(int i=0;i<mi[11];i++){for(int j=0;j<mi[11];j++){int a=(i>>8)+1,b=(j>>8)+1;int res=2e9;for(int k=1;k<=8;k++){res=min(res,col[a][k]+1+col[b][k]+((i&mi[k-1])?1:0)+((j&mi[k-1])?1:0));}cst[i][j]=res;}}for(int i=1;i<=n;i++){int s=a[i]-1,o=a[i];for(int k=8;k>=1;k--){s<<=1;if(dis[i][k]>col[o][k]) s|=1;}sta[i]=s;}int ans(0);ll sum(0);for(int i=1;i<=n;i++){for(int j=max(i-15,1);j<i;j++){int w=min(i-j,cst[sta[i]][sta[j]]);if(w>ans){ans=w;sum=1;}else if(w==ans) sum++;}for(int s=0;s<mi[11];s++){if(!num[s]) continue;if(cst[s][sta[i]]>ans) ans=cst[s][sta[i]],sum=num[s];else if(cst[s][sta[i]]==ans) sum+=num[s];}if(i>=16) num[sta[i-15]]++;}//printf("st[1]=%d st[7]=%d\n",sta[1],sta[7]);//printf("dis[1][1]=%d col[3][1]=%d\n",dis[1][1],col[3][1]);printf("%d %lld\n",ans,sum);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5366-[SNOI2017]遗失的答案【状压dp,FWT】

正题 题目链接:https://www.luogu.com.cn/problem/P5366 题目大意 给出一个n,G,Ln,G,Ln,G,L。 qqq次询问在1∼n1\sim n1∼n中选择若干个数字并且数字xxx必选&#xff0c;要求这些数的gcdgcdgcd为GGG且lcmlcmlcm为LLL的方案数。 1≤n,G,L,x≤108,1≤q≤1051\leq n,G,L,x\leq 1…

2017ACM/ICPC广西邀请赛

2017ACM/ICPC广西邀请赛&#xff08;感谢广西大学&#xff09; 题号题目考点难度AA Math Problem数论签到题BColor itCCounting StarsDCoveringECS Course思维 &#xff0c;二进制思维题FDestroy Walls最大生成树GDuizi and Shunzi思维题HLaw of CommutationIMatching in a Tr…

【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

上篇文章我介绍了如何强制令牌过期的实现&#xff0c;相信大家对IdentityServer4的验证流程有了更深的了解&#xff0c;本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证&#xff0c;然后根据不同的客户端使用不同的认证方式来集成到统一认证平台。.netcore项目实战交…

CF1500C Matrix Sorting(拓扑排序)

解析 神仙题 我想到了一部分&#xff0c;但是由于没想到倒着做&#xff0c;后面越想越复杂… 本题的关键是要倒着想 考虑最后一次排序的列x 必须是单调不增的 否则直接错 然后倒数第二列y 必须在x列相等的段内单调不增&#xff0c;因为这些地方x无法起到排序的作用 同理再到倒…

P8292-[省选联考 2022]卡牌【状压,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P8292 题目大意 有nnn张卡牌&#xff0c;第iii张上的数字是sis_isi​。mmm次询问给出cic_ici​个质数&#xff0c;要求选择一些卡使得这些卡的乘积是这些质数的倍数&#xff0c;求方案数。 1≤n≤106,1≤si≤2000,1≤m≤1500…

D - Covering HDU - 6185(未解决完)

D - Covering HDU - 6185 题意&#xff1a; 4 * n的地板&#xff0c;有无数个1 * 2 和2 * 1 的砖块&#xff0c;问有多少方式填满&#xff1f; 1≤n≤10^18 题解&#xff1a; 矩阵快速幂 代码&#xff1a;

.NET-记一次架构优化实战与方案-前端优化

前言上一篇《.NET-记一次架构优化实战与方案-梳理篇》整理了基本的业务知识&#xff0c;同时也罗列了存在的问题&#xff0c;本篇主要是针对任务列表的页面进行性能优化。该篇主要涉及的是代码实现上的优化&#xff0c;实现上的问题是战术债务&#xff0c;也就是我们平常出现的…

11.17 模拟:总结

解析 50pts 50000 最后一次模拟 …说不出太多好话来 口罩、核酸、没样例、最困的点、T4诡异的题面和莫名其妙的链接…可以说是天时地利人和全都没的一干二净了 但有一说一今天的题&#xff08;除了T4&#xff09;都还是不错的&#xff0c;虽然难的要死&#xff0c;但是大部分…

GDOI2022游记

文章目录Day -1Day 0Day 1Day 2Day 3()Day ?~?Day ?Day -1 考前好像写题状态不太好&#xff08;可能是纯粹的懒&#xff09;。 开始写板子&#xff0c;很多算法都很久没碰了&#xff0c;有的调了很久才过。树剖都调了一个多小时&#xff0c;身败名裂。不过想想省选应该不怎…

第十一届山东省大学生程序设计竞赛

第十一届山东省大学生程序设计竞赛 题号题目知识点难度ABeta GoBBuild Roads最小生成树&#xff0c;思维题一般CCat Virus构造题有点难想DDyson Box模拟签到题EEvaluate ExpressionFBirthday CakeGGrade Point Average模拟签到题HAdventurer’s Guild背包问题签到题IChemical …

[CF/AT/Luogu]各大网站网赛 爆肝部部长工作报告文件Ⅱ

文章目录CodeForcesLATOKEN-Round-1(Div.1Div.2)A. Colour the FlagB. Histogram UglinessC. Little Alawns PuzzleD. Lost TreeE. Lost ArrayF1. Falling Sand (Easy Version)#726-Div.2A. Arithmetic ArrayB. Bad BoyC. Challenging CliffsD. Deleting DivisorsE. Erase and …

.NET-记一次架构优化实战与方案-梳理篇

前言程序员输出是他敲写的代码&#xff0c;那么输入就是他思考好的设计。因此不做设计是不存在&#xff0c;设计只分优秀的设计和糟糕的设计。为了避免过度设计浪费成本&#xff0c;需要针对现有业务与问题进行展开。业务梳理是不可避免的。优化是无止尽&#xff0c;为了更有成…

P3605 [USACO17JAN]Promotion Counting P(树状数组)

解析 做法很多的一道题 sol1 先求出dfs序&#xff0c;离线下来&#xff0c;然后按权值大小的顺序统计答案并插到对应的dfs序中 sol2 离散化后&#xff0c;dfs过程中动态维护树状数组&#xff0c;利用前后差值求出答案 sol3 树上dsu 就比较无脑了&#xff0c;暴力维护即可…

Build Roads

Build Roads 题意: n个点&#xff0c;每个点的值为a[i],求最小生成树 a[i]是通过题目中给出的程序得到&#xff08;即a[i]如何得到的我们并不需要很了解&#xff09; 题解&#xff1a; 肯定不能直接跑最小生成树&#xff0c;因为数据太大了 银川也有个类似的题&#xff0c;…

CF1672E-notepad.exe【交互,二分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1672E 题目大意 有一个你不知道的长度为nnn的序列lll&#xff0c;你每次可以询问一个长度www。交互库会返回一个hhh表示最少能将lll分成多少连续段使得每一段[l,r][l,r][l,r]都满足∑ilrlir−l≤w\sum_{il}^rl_ir-l\leq w∑…

P3243 [HNOI2015]菜肴制作(拓扑排序、贪心)

解析 很好的题 也就是我没做出来的意思 反向思维似乎是我欠缺的 这道题也是 也许做题时应该多特意往这边想想 当正向看并没有太好的性质时&#xff0c;也许反过来能使题目豁然开朗 容易想到暴力n方如何做 &#xff08;以下均指反图&#xff09; 找到1所在的点&#xff0c;染色…

.NET Core 3.0 中的数据库驱动框架 System.Data

虽然没有得到很多关注&#xff0c;但System.Data对于.NET 中任何关系型数据库的访问都至关重要。因为其前身是 ActiveX Data Objects&#xff0c;所以它也被称为 ADO.NET。System.Data 提供了一个通用框架&#xff0c;是构建.NET 数据库驱动程序的基础。该框架提供了数据库驱动…

P3784-[SDOI2017]遗忘的集合【多项式ln,MTT,莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P3784 题目大意 你若干个在[1,n][1,n][1,n]的不同数字组成序列aaa。 记录f(x)f(x)f(x)表示将xxx无序拆分成aaa中数字的和的方案数&#xff08;一个数字可以使用多次&#xff09;。 现在给出所有的f(x)%p(x∈[1,n])f(x)\%p\…

Matrix Problem

Matrix Problem 题意&#xff1a; 给你一个n * m的二维数据c&#xff0c;c的每个元素值为0或1 现在要求你构造同样大小的数组a和b&#xff0c;要求c[i][j] 1’的话&#xff0c;a[i][j] b[i][j] ‘1’&#xff0c;如果c[i][j] ‘0’.a[i][j]!b[i][j]&#xff0c;且a和b中的1…

P3545HUR-Warehouse StoreP4053建筑抢修(反悔贪心、堆)

解析 两道很像的题 不能说相似&#xff0c;只能说是一模一样 感觉有火车载客的影子 想到开个堆来维护 在供不应求时弹出要求最高的即可 T1还得输出方案针麻烦 代码 你会发现几乎一毛一样 T1 #include<bits/stdc.h>const int N3e5100; const int M2e3100; const int …