ETO的公开赛T5《猎杀蓝色空间号》题解
这道题别看题面这么长,其实题意很简单
就是让你求从起点开始的最长合法区间
合法的要求有两个:兜圈子和直飞
且这两个条件相互独立
(也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响)
举个例子:
1 2 3 2 1 5 4 3 8 9
这个序列他的合法长度是8
因为直飞是 5 4 3 8 9
1是兜圈子的末尾,对直飞无影响
这样看来,兜圈子比直飞优秀的多
因为如果直飞的某段属于兜圈子
那么把这一段归于兜圈子后对序列的合法性无影响
但如果兜圈子的某段属于直飞,那归于直飞后
剩下的这部分可能就不是兜圈子了
所以我们先用manacher跑出回文区间
用差分数组维护一下回文区间
如果在回文区间内,则不考虑
否则判断是否直飞即可
只要确保完全符合,就记下来这个区间和这个区间的末尾值
后面的就是贪心了
最优情况自然是你选的那条正好是飞船所在
飞船所在正好是最短的
最坏情况是你最后一次选到的是最短的
且这个位置是飞船所在
几率我们会惊讶的发现其实是一样的
排个序第二个也很好求
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
#define mod 19260817
using namespace std;
char s[],cp[];
int p[],cd,t,n,ans,cnt,jl[],cf[],lnt;
char zcq1[];
int zcq2[],m;
void ycl()
{
int k=;
cp[k]=;
k++;
for(rii=;i<=cd-;i++)
{
cp[k]='#';
k++;
cp[k]=s[i];
k++;
}
cp[k]='#';
k++;
cd=k;
}
void manacher()
{
ycl();
int mx=;
int last=;
for(rii=;i<=cd-;i++)
{
if(mx>i)
{
p[i]=min(p[*last-i],mx-i);
}
else
{
p[i]=;
}
while(cp[i+p[i]]==cp[i-p[i]])
{
p[i]++;
}
if(p[i]+i>mx)
{
mx=p[i]+i;
last=i;
}
}
}
void cfs()
{
for(rii=;i<=cnt;i++)
{
if(zcq2[i]>)
{
cf[i-(zcq2[i])/]++;
cf[i+(zcq2[i])/]--;
}
}
}
int yz()
{
int sl=,pre=,pd=;
for(rii=;i<=cnt;i++)
{
sl+=cf[i];
if(sl==&&cf[i]>=)
{
if(pre==)
{
pre=zcq1[i];
continue;
}
if(pd==)
{
if(zcq1[i]>pre)
{
pd=;
}
else
{
if(zcq1[i]==pre)
{
pd=;
}
else
{
pd=;
}
}
pre=zcq1[i];
continue;
}
if(pd==)
{
if(pre>zcq1[i])
{
return i;
}
else
{
pre=zcq1[i];
}
}
if(pd==)
{
if(pre<zcq1[i])
{
return i;
}
else
{
pre=zcq1[i];
}
}
}
else
{
pre=;
}
}
return cnt+;
}
long long pw(long long ds,int ms)
{
long long res=;
while(ms!=)
{
if(ms%==)
{
ms--;
res*=ds;
res%=mod;
}
else
{
ds*=ds;
ds%=mod;
ms/=;
}
}
return res;
}
bool cmp(int kl,int lk)
{
return kl<lk;
}
void sr()
{
memset(s,,sizeof(s));
memset(p,,sizeof(p));
memset(cf,,sizeof(cf));
for(rij=;j<t;j++)
{
s[j]=getchar();
}
getchar();
getchar();
}
void fz()
{
for(rij=;j<=cd-;j+=)
{
cnt++;
zcq1[cnt]=cp[j];
zcq2[cnt]=p[j]-;
}
}
int main()
{
scanf("%d %d",&n,&t);
scanf("%d ",&m);
for(rii=;i<=n;i++)
{
sr();
cd=t;
manacher();
cnt=;
fz();
cfs();
int bnt=cnt;
int ltt=yz();
if(ltt==m+)
{
lnt++;
jl[lnt]=pw(zcq1[bnt],zcq1[bnt]);
}
// printf("%d\n",ans-1);
}
if(lnt==)
{
cout<<"-1";
return ;
}
if(lnt==)
{
cout<<jl[]<<" "<<jl[]<<" 1.00000000 1.00000000";
return ;
}
sort(jl+,jl+lnt+,cmp);
int minx=jl[];
// jl[1];
int ant=;
long long js=;
for(rii=;i<=lnt;i++)
{
if(jl[i]==minx)
{
ant++;
}
else
{
break;
}
}
for(rii=;i<=lnt;i++)
{
js+=jl[i];
}
js*=;
js+=minx;
cout<<minx<<" "<<js<<" ";
double kn=((1.0)*ant)/lnt;
kn/=lnt;
printf("%.8lf %.8lf",kn,kn);
}
ETO的公开赛T5《猎杀蓝色空间号》题解的更多相关文章
- ETO的公开赛T3《寻星》 题解(BY 超級·考場WA怪 )
题解 寻星 题意:给定一个有向带权图,定义从一点到另一点的某条路径长为路径上所有边权的最大值,并给定四个点编号w,t1,t2,t3. 求出一个点s,使它在到t1,t2,t3三点最短路径最大值最大或者根 ...
- ETO的公开赛T2《宏聚变》 题解(BY 萌萌哒123456 )
我们注意到这道题中最多有 $(n+q)$ 个数被加入,而每个数最多被删除一次,因此每次操作 $O(logn)$的复杂度是可以接受的. 我们对于$1..100000$之间每个数分别开一个set,维护这个 ...
- ETO的公开赛T1《矿脉开采》题解(正解)(by Zenurik)
作为T1,当然是越水越好啦qwq 显然经目测可得,那个所谓的质量评级根本就没卵用,可以直接\(W_i = W_i^{V_i}\)累积到利润里面. 这样,本问题显然是一个"子集和"问 ...
- ETO的公开赛T4《对抗水滴》 题解(BY 萌萌哒123456 )
题意: 给你一个\(n*n\)的矩阵A,其中有\(T\)个元素不为零.定义矩阵内元素\((x,y)\)的能量值 \(E[x][y]=\sum_{i=1}^{x}\sum_{j=1}^{y}[A[i][ ...
- ETO的公开赛T1《矿脉开采》题解(另类版)
这道题别看是签到题,写起来一点不简单 出题人的正解是双向搜索 我们把物品分成两半 每一半分别跑搜索 答案存下来,用个双指针合并即可 然后我构造了两组数据卡掉了他,不得不缩小数据范围 但我这里为什么要致 ...
- 洛谷P1420 最长连号 题解
题目传送门 这道题我是打暴力的...(尴尬) 所以直接是O(N2)的时间,但好像没有炸,数据很水... #include<bits/stdc++.h> using namespace st ...
- AI将带我们走向何方?
AI即人工智能,对科幻着迷的博主对此认知颇深,打算从科幻电影入手,先讲下未来的AI将给人类带来哪些变化,哪些思考. 从最初的<星际航行>中的各种星球.地形等的介绍,到各个鉴于的探索,以及其 ...
- SDUT 3929
Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E&quo ...
- 魔戒(思维+bfs)
Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E&quo ...
随机推荐
- IO流之Properties类
Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: 1.Hashtable的 ...
- 超级简单的jQuery纯手写五星评分效果
超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...
- JS构造函数(便于理解,简易)
* 构造函数: * 1.构造函数的函数名最好首字母大写(否则 WebStorm 编辑器会提示报错) * 2.自己的对象多次被复制 * 3.构造函数里可以创建公有属性.公有方法.私有属性和私有方法 * ...
- 卸载Gac里被windows installer所reference的assembly的方法
HKEY_LOCAL_MACHINE\Software\Classes\Installer\Assemlies\Global下找到要删除的assembly的那一项, 删除. 然后再gacutil /u ...
- qt打开url
QDesktopServices::openUrl(QUrl(QLatin1String(“http://blog.const.net.cn“)))
- python 初识
一.Python介绍 Python简介 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- matlab练习程序(弧形、圆柱投影的复原)
前一段介绍了从矩形图像到圆柱的正向投影,看这里和这里.今天介绍如何从已经投影的图像反映射到原图像上. 本来此种变换一定是需要数学公式的,不过这里只是用了一个很简单的方式来完成反映射. 具体就把每一列有 ...
- C# 调用第三方DLL z
http://blog.163.com/da7_1@126/blog/static/104072678201311721326318/ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代 ...
- ORACLE_ALIAS
Oracle / PLSQL: ALIASES website:https://www.techonthenet.com/oracle/alias.php This Oracle tutorial e ...
- x64 分页机制——虚拟地址到物理地址寻址
原博客:http://www.cnblogs.com/lanrenxinxin/p/4735027.html 详细的理论讲解都在上面 下面说的是通过windbg手动进行寻址,深入理解 x64: 实践: ...