DTOI 10.25 测试 T3 雪人
T3. 雪人
【题目背景】 大佬WZY在AK NOIP 2018后,决定去冰天雪地的Y城堆雪人。 【问题描述】 WZY堆了N个雪人,每个雪人都有一个可爱度Xi,WZY认为两串雪人与和谐当且仅当
WZY现在要从一堆雪人中选择两串雪人(两串可以重叠,即若,可以小于等于),使得A和B和谐,现在WZY想知道对于所有的方案中, 的最大值。为A中所含雪人的个数。因为WZY还要准备AK JSOI 2019,所以他把这个问题交给了你。 【输入格式】 输入文件名为snowman.in。 输入文件第一行为一个正整数N,表示雪人的个数。 输入文件第二行为N个整数:X1,X2,…XN。 【输出格式】 输出文件名为snowman.out。 输出文件仅一行一个整数,为 的最大值。 【输入输出样例1】snowman.in
10
1 2 3 4 5 6 7 8 9 10
snowman.out
5
【输入输出样例1说明】 应选A=[1,5],B=[6,10],此时,min(|6-1|,5)=5;
【数据规模与约定】
Subtask 1 10%:?≤500。
Subtask 2 20%:?≤5000。
Subtask 3 50%:N≤100000
Subtask 4 20%:?≤500000,0≤??≤100000000
题解 :
考虑后缀数组。
其实和这道题洛谷P2743是可以一样的做法(虽然洛谷的弱很多)。
我们现将原数组差分,然后就变成了求两个子串的匹配。
我们先求出和数组,然后考虑二分答案。
对于每个二分出的每个答案,我们只需要考虑在 的串里
是否 .
注意由于题中给的值很大,并且由于
时间复杂度。
还有一位神犇写了 ,大家可以看一看
https://blog.csdn.net/liankewei123456/article/details/83381836
(ORZLKW)
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repd(i,a,b) for(int i=a;i>=b;i--)
#define For(i,a,b) for(int i=a;i<b;i++)
#define Ford(i,a,b) for(int i=a;i>b;i--);
#define _(d) while(d(isdigit(ch=getchar())))
#define in inline
typedef long long ll;
template<class T>T read(){T x,f=1;char ch;_(!) ch=='-'?f=-1:f;x=ch-48;_() x=x*10+ch-48;return f*x;}
using namespace std;
const int N=8e6+4;
int l,s[N],str[N],m,orzlkw;
int sa[N],_rank[N],t2[N],c[N],h[N];
in void rsort(int n,int *x,int *y){For(i,0,m) c[i]=0;For(i,0,n) c[x[y[i]]]++;For(i,1,m) c[i]+=c[i-1];repd(i,n-1,0) sa[--c[x[y[i]]]]=y[i];
}
in bool cmp(int *f,int a,int b,int L){return f[a]==f[b]&&f[a+L]==f[b+L];}
in void getsa(int n){int *x=_rank,*y=t2;For(i,0,n) x[i]=s[i],y[i]=i;m=orzlkw+100;rsort(n,x,y);int p=0;for(int k=1;p<n;k<<=1,m=p){p=0;For(i,n-k,n) y[p++]=i;For(i,0,n) if(sa[i]>=k) y[p++]=sa[i]-k;rsort(n,x,y);swap(x,y);p=1;x[sa[0]]=0;For(i,1,n){x[sa[i]]=cmp(y,sa[i-1],sa[i],k)?p-1:p++;}}
}
in void get_h(int n){int k=0,j;rep(i,0,n) _rank[sa[i]]=i;For(i,0,n){if(k) k--;j=sa[_rank[i]-1];while(s[i+k]==s[j+k]&&(j+k<=n))k++;h[_rank[i]]=k;}
}
in bool check(int k,int n){int mi=sa[1],mx=sa[1];rep(i,2,n){if(h[i]>=k&&i<=n){mi=min(mi,sa[i]);mx=max(mx,sa[i]);if(mx-mi>k) return 1;continue;}mi=mx=sa[i];}return 0;
}
int b[N];
in void input(){For(i,0,l) str[i]=read<int>();For(i,0,l-1) str[i]=str[i+1]-str[i],b[i]=str[i];sort(b,b+l); orzlkw=unique(b,b+l)-b;For(i,0,l-1) str[i]=lower_bound(b,b+orzlkw,str[i])-b;For(i,0,l) s[i]=str[i]+48;s[--l]=0;
}
in void work(){int li=1,ri=l/2,ans=0;while(li<=ri){int mid=(li+ri)>>1;if(check(mid,l)) ans=mid,li=mid+1;else ri=mid-1;}ans++;printf("%d\n",ans);
}
int main(){//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);l=read<int>();input();getsa(l+1); get_h(l);work();return 0;
}
DTOI 10.25 测试 T3 雪人相关推荐
- DTOI 10.25 测试 T1 五子棋
2018.10.25-dtoj-3989-五子棋(fir) 题目描述: 就像题目名字一样,他们在玩一种类似于五子棋的游戏,只是规则和五子棋有一些不同. 就像五子棋一样,ITer和Kitty依次在棋盘上 ...
- 【2018/10/11测试T3】葫芦
[题目] 传送门 题目描述: Tom 最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,Tom 进入了葫芦世界. 葫芦世界有 nnn 个葫芦,标号为 111 ...
- 【2018/10/16测试T3】长者
[题目] 内网传送门 外网传送门 [分析] 30 pts:哈希+二分 可以用 s t r i n g string string 排序,也可以利用哈希做到 O ( l o g n ) (log\ ...
- 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)
使用单项循环链表实现字典操作(算法导论第十章10.2-5题) template<typename T> void insert(SingleCycleL<T> & l, ...
- 《中国人工智能学会通讯》——10.25 跨姿态和光照变化的低分辨率人脸识别
10.25 跨姿态和光照变化的低分辨率人脸识别 为了解决安全问题,监控的使用逐渐增多,这使得人们对完全自动并具有鲁棒性的人脸识别系统的要求也随之增大.通过监控获得的图片通常分辨率较低且姿态和光照条件不 ...
- lol12月25服务器维护,lol12月10日维护到几点 英雄联盟12月10日10.25版本更新维护时间...
lol12月10日维护到几点?2020年12月10日英雄联盟全区停机维护更新10.25版本的内容,大家需要等待至维护结束才能登录游戏体验新版本.不知道本次更新时长的玩家,下面小编带来了英雄联盟12月1 ...
- Interview:算法岗位面试—10.25早上—上海某电公司算法岗位(偏图像算法,国企)技术面试之比赛历程、项目收获(Pytorch和Tensorflow)、未来方向
Interview:算法岗位面试-10.25早上-上海某电公司算法岗位(偏图像算法,国企)技术面试之比赛历程.项目收获(Pytorch和Tensorflow).未来方向 导读:10.25早上一位博士技 ...
- 电子商务基础课件(10.25更新)
电子商务基础课件(10.25更新) 电子商务基础课件 unit01-01-1.rar unit01-01-2.rar unit03-01.rar unit04-01.rar unit05-01.rar ...
- Java黑皮书课后题第10章:**10.25(新的字符串split方法)String类中的split方法会返回一个字符串数组,该数组是由分隔符分隔开的子串构成的
Java黑皮书课后题第10章:**10.25(新的字符串split方法) 题目 代码 运行实例 题目 代码 public class Test25 {public static String[] sp ...
- Python 经典模块可能都学过,10道题测试你会不会用?
Python 作为 2021 年度最受欢迎的编程语言,备受众人瞩目,也很受新手小白喜爱.除此之外,它在很多领域都发挥其作用,比如大数据.无人驾驶.Web 开发等等. [敲重点] 蓝桥云课即将在 202 ...
最新文章
- pandas使用query函数删除dataframe中两个数据列加和小于某一特定值的数据行(removing rows based on multiple dataframe column value
- 解决某东对ip限制若兰(nolanjdc)无法获取短信验问题
- Madgwick算法详细解读
- hexeditor 复制二进制值_MySQL复制全解析 Part 6 MySQL GTID 生命周期
- php 租房子(练习题)
- 难道现在是保险业的高速发展期?
- 用于微信小程序的图文编辑器
- Spring中的depends-on
- 2022高压电工考试练习题及模拟考试
- 短信平台API接口demo示例-Node/SMS/Send
- 当 Vite 遇上微前端
- ubuntu(18.04)磁盘空间不足导致问题:bash: 无法为立即文档创建临时文件: 设备上没有空间(按tab键无法自动补全)
- 《Learning Discriminative Features with Multiple Granularities for Person Re-Identification》论文阅读之MGN
- 番茄工作法总结-第六章:应变
- 北京首台区块链政务终端亮相 一键“拉取”链上数据
- 批量将json文件转为jpg格式
- android 测试屏幕触点,如何检测Android Studio中的后台服务是否触摸了屏幕?
- 局域网远程开机工具 一键批量远程唤醒
- 酷家乐一面-停车场记录
- 计算机专业的相关论文,计算机专业相关论文
热门文章
- 返利网app有那些?哪一个最好用?
- 十载寒冰,难凉热血——2020CSDN年度博客之星Top10心路历程
- 如何提高FPGA的运行速度
- Linux系统上安装python详细步骤
- 你为什么来日本做IT?日本IT优劣谈
- python爬虫图书信息并存入数据库,以及安装工具库
- ad20如何画出pcb板大小_如何用AD更改PCB板子尺寸
- 计算机和移动终端在信息系统中的工作原理,粤教版(2019)信息技术 必修2 2.3 信息系统中的计算机和移动终端 课件(共30张PPT)...
- centos 7 系统安装
- HDU 4699 Editor(双向链表)