CF1335E Three Blocks Palindrome
就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A.....
题意
定义一种字串为形如:\([\underbrace{a, a, \dots, a}_{x}, \underbrace{b, b, \dots, b}_{y}, \underbrace{a, a, \dots, a}_{x}]\)
问你在给定的字串中,符合这种要求的最大子序列(可以不连续)的长度
给出数列长度 \(n\le 2\cdot 10^5\),数列中每个数 \(a_i\le 200\)
考虑暴力枚举 \(a\),然后对于每一个 \(a\),枚举 \(x\),也就是两边的 \(a\) 的 个数
用两个 vector,分别记录从前和从后数,第 \(x\) 个 \(a\) 的位置
然后一直枚举到第 \(\lfloor\dfrac{\text{a出现的次数}}{2}\rfloor\) 个
此时,再暴力枚举 \(b\),记录一个前缀和 \(sum_{b,i}\),表示 \(b\) 这个数,在前 \(i\) 位中出现的次数
假设在 vector 中记录的整数第 \(x\) 个 \(a\) 的位置是 \(pos1\),倒数第 \(x\) 个位置是 \(pos2\),那么中间 \(b\) 的个数就是 \(sum_{b,pos2}-sum_{b,pos1-1}\)
然后给所有枚举到的 \(b\) 取一个 \(\max\) 就行
注意在 \(pos1,pos2\) 中,要分别先 push_back 一个 \(0\) 和 \(n+1\),意思是正数倒数第 \(0\) 第出现的位置,同时方便后面的枚举
每枚举一个 \(a\),设它出现的次数为 \(num_a\),则它的复杂度为 \(200\times num_a\)
那么总复杂度是 \(\sum_{i=1}^{200}num_a\times 200=200\times n\)
赛时没想到这点导致并没有交 E2 qaq
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<iomanip>
#include<vector>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int sum[206][200006];
std::vector<int>pos1[206],pos2[206];
int num[206];
int a[200006];
int main(){int T=read();while(T--){
// std::printf("%lld",sizeof sum+sizeof pos1+sizeof pos2+sizeof a);
int n=read();
for(reg int i=1;i<=200;i++){
pos1[i].clear();pos2[i].clear();
pos1[i].push_back(0);pos2[i].push_back(n+1);
}
for(reg int x,i=1;i<=n;i++){
for(x=1;x<=200;x++) sum[x][i]=sum[x][i-1];
a[i]=read();sum[a[i]][i]++;
num[a[i]]++;pos1[a[i]].push_back(i);
}
for(reg int i=n;i;i--) pos2[a[i]].push_back(i);
reg int ans=0;
for(reg int a=1;a<=200;a++){
for(reg int x=0;x<=num[a]>>1;x++){
for(reg int b=1;b<=200;b++)
ans=std::max(ans,(x<<1)+sum[b][pos2[a][x]-1]-sum[b][pos1[a][x]]);
}
}
std::printf("%d\n",ans);
std::memset(num,0,sizeof num);
for(reg int x,i=1;i<=n;i++){
for(x=1;x<=200;x++) sum[x][i]=0;
}
}
return 0;
}
CF1335E Three Blocks Palindrome的更多相关文章
- Three Blocks Palindrome (easy version)[暴力-预处理]
给定一个数组,找出最长的子序列,满足 a,a,..a,b,b,..b,a,a,..a 前面的a和后面的a都要是x个,中间的b是y个. 其中,x>=0且y>=0. \(\color{Red} ...
- Codeforces Round #634 (Div. 3)
D题想复杂了,花了好多时间,感觉也没时间看F了,就来写个题解蹭蹭访问量把^_^ 传送门:1335 A. Candies and Two Sisters 题意:你要把n个糖果分给两个人,两个人的糖果数不 ...
- HDU 4618 Palindrome Sub-Array (2013多校2 1008 暴力)
Palindrome Sub-Array Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Oth ...
- HDU 4618 Palindrome Sub-Array 暴力
Palindrome Sub-Array 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4618 Description A palindrome s ...
- Joining Byte Blocks(哈希+带花树)
题目链接 Problem Statement As you are probably aware, the Internet protocols specify a canonical byte or ...
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
- PALIN - The Next Palindrome 对称的数
A positive integer is called a palindrome if its representation in the decimal system is the same wh ...
- [LeetCode] Longest Palindrome 最长回文串
Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...
- [LeetCode] Palindrome Pairs 回文对
Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that t ...
随机推荐
- 钩子函数 Function类
Function 为 com.google.common.base包下接口类: public interface Function<F, T> { @Nullable T apply(@N ...
- AJ学IOS(54)多线程网络之NSOperation重要知识
AJ分享,必须精品 一:队列的类型与队列添加任务 1: 主队列 [NSOperationQueue mainQueue] 添加到”主队列”中的操作,都会放到主线程中执行. 2:非主队列 [[NSOpe ...
- 上班无聊,自己用python做个小游戏来打发时间
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取t.cn ...
- 基于RabbitMQ的Rpc框架
参考文档:https://www.cnblogs.com/ericli-ericli/p/5917018.html 参考文档:RabbitMQ 实现RPC MQ的使用场景大概包括解耦,提高峰值处理能力 ...
- Python程序设计 实验 1 熟悉 IDLE 和在线编程平台
------------恢复内容开始------------ 安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 姚彩琴 学号3190505129 成绩 日期 2 ...
- 杭电1080 J - Human Gene Functions
题目大意: 两个字符串,可以再中间任何插入空格,然后让这两个串匹配,字符与字符之间的匹配有各自的分数,求最大分数 最长公共子序列模型. dp[i][j]表示当考虑吧串1的第i个字符和串2的第j个字符时 ...
- 【LeetCode】57. Insert Interval [Interval 系列]
LeetCode中,有很多关于一组interval的问题.大体可分为两类: 1.查看是否有区间重叠: 2.合并重叠区间; 3.插入新的区间: 4. 基于interval的其他问题 [ 做题通用的关键 ...
- Laravel项目Linux服务器部署
laravel项目本地开发,一切正常.部署到服务器,首页都加载不出来,查了n多教程,各种方法姿势都试过了,还是不行. 功夫不负有心人,最后终于找到了问题所在,在此做个记录,铭记教训. 排查错误一定要: ...
- JAVA的synchronized写法
使用关键字synchronized的写法比较多,常用的有如下几种,代码如下: public class MyService { synchronized public static void test ...
- [转]PHP利用PCRE回溯次数限制绕过某些安全限制
这次Code-Breaking Puzzles中我出了一道看似很简单的题目pcrewaf,将其代码简化如下: <?php function is_php($data){ return preg_ ...