Problem Statement

We have a sequence of positive integers of length $N^2$, $A=(A_1,\ A_2,\ \dots,\ A_{N^2})$, and a positive integer $S$. For this sequence of positive integers, $A_i=A_{i+N}$ holds for positive integers $i\ (1\leq i \leq N^2-N)$, and only $A_1,\ A_2,\ \dots,\ A_N$ are given as the input.

Find the minimum integer $L$ such that every sequence $B$ of positive integers totaling $S$ is a (not necessarily contiguous) subsequence of the sequence $(A_1,\ A_2,\ \dots,\ A_L)$ of positive integers.

It can be shown that at least one such $L$ exists under the Constraints of this problem.

Constraints

  • $1 \leq N \leq 1.5 \times 10^6$
  • $1 \leq S \leq \min(N,2 \times 10^5)$
  • $1 \leq A_i \leq S$
  • For every positive integer $x\ (1\leq x \leq S)$, $(A_1,\ A_2,\ \dots,\ A_N)$ contains at least one occurrence of $x$.
  • All values in the input are integers.

有一个明显的 dp,定义 \(dp_i\) 为包含所有何为 \(i\) 的串的最小前缀。枚举一个 \(j\),那么 \(dp_i=\max_{j<i}nx_{dp_j,i}\) 当中 \(nx_{x,y}\) 表示 \(x\) 后面出现的第一个 \(y\)。 dp 明显是存在单调性的。

考虑数据结构优化,但是没有什么特别适合的数据结构使用。神奇地,考虑CDQ。

如果现在的分支区间为 \([l,r]\),中心为 \(md\),那么计算所有 \([l,md]\) 的 DP 值对 \([md+1,r]\) 的 dp 值的贡献。枚举 \(i-j\),然后发现只有最接近 \(dp_{md}\) 的哪个 \(i-j\) 才是有用的,设他在 \(p\)。只有 $[ls_p,p) $ 这段区间内的数才可以得到贡献,把他对应到 dp 上面就行了。按照 \(p\) 从大到小排序后,用区间覆盖线段树维护 dp 值,然后更新 dp 值即可。

复杂度:\(O(Slog^2n+nlogn)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int S=2e5+5,N=1.5e6+5;
int n,s,a[N];
LL dp[S],tr[S<<2],tag[S<<2];
vector<int>g[S];
struct node{
int l,r,p;
bool operator<(const node&n)const{
return r<n.r;
}
}st[S];
void pushdown(int o,int l,int r)
{
if(~tag[o])
{
tag[o<<1]=tag[o];
tag[o<<1|1]=tag[o];
tr[o<<1]=tag[o];
tr[o<<1|1]=tag[o];
tag[o]=-1;
}
}
void upd(int o,int l,int r,int x,int y,LL z)
{
if(x>y)
return;
if(x<=l&&r<=y)
return tag[o]=tr[o]=z,void();
pushdown(o,l,r);
int md=l+r>>1;
if(md>=x)
upd(o<<1,l,md,x,y,z);
if(md<y)
upd(o<<1|1,md+1,r,x,y,z);
}
LL qry(int o,int l,int r,int x)
{
if(l==r)
return tr[o];
pushdown(o,l,r);
int md=l+r>>1;
if(md>=x)
return qry(o<<1,l,md,x);
return qry(o<<1|1,md+1,r,x);
}
void solve(int l,int r)
{
if(l==r)
return;
int md=l+r>>1,tp=0;
solve(l,md);
upd(1,1,s,l,r,0);
int tmx=(dp[md]-1)%n+1,p=(dp[md]-1)/n;
for(int i=1;i<=r-l;i++)
{
vector<int>::iterator it=upper_bound(g[i].begin(),g[i].end(),tmx);
if(it==g[i].end())
st[++tp]=(node){*(--it),g[i][0]+n-1,i};
else if(it==g[i].begin())
st[++tp]=(node){g[i][g[i].size()-1]-n,g[i][0]-1,i};
else
st[++tp]=(node){*(it-1),(*it)-1,i};
}
sort(st+1,st+tp+1);
for(int i=1;i<=tp;i++)
{
int kl=lower_bound(dp+l,dp+md+1,1LL*p*n+st[i].l)-dp,kr=upper_bound(dp+l,dp+md+1,1LL*p*n+st[i].r)-dp-1;
upd(1,1,s,kl+st[i].p,min(kr+st[i].p,s),st[i].r+1LL*p*n+1);
}
for(int i=md+1;i<=r;i++)
dp[i]=max(dp[i],qry(1,1,s,i));
solve(md+1,r);
}
int main()
{
memset(tag,-1,sizeof(tag));
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
{
scanf("%d",a+i),g[a[i]].push_back(i);
if(!dp[a[i]])
dp[a[i]]=i;
}
solve(1,s);
printf("%lld\n",dp[s]);
}

[ARC150F] Constant Sum Subsequence的更多相关文章

  1. Codeforces 797B - Odd sum

    B. Odd sum 题目链接:http://codeforces.com/problemset/problem/797/B time limit per test 1 second memory l ...

  2. Odd sum (对本菜鸡来说是个极坑题)

    https://codeforces.com/problemset/problem/797/B time limit per test 1 second memory limit per test 2 ...

  3. [经典] 最X(长 | 大和 | 大积)Y(子序列 | 子字符串)

    Note: 子序列,可以不连续:子字符串,必须连续. 以下题目按在我看看来的难度从易到难排列: 最大和子序列(Maximum sum subsequence) 这道题纯属娱乐...应该不会有人出这种题 ...

  4. Petrozavodsk Summer-2016. Ural FU Dandelion Contest

    A. Square Function 留坑. B. Guess by Remainder 询问$lcm(1,2,3,...,n)-1$即可一步猜出数. 计算$lcm$采用分治FFT即可,时间复杂度$O ...

  5. codeforces 797B

    B. Odd sum time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  6. Educational Codeforces Round 19 B

    Description You are given sequence a1, a2, ..., an of integer numbers of length n. Your task is to f ...

  7. 1007. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  8. PAT - 测试 01-复杂度2 Maximum Subsequence Sum (25分)

    1​​, N2N_2N​2​​, ..., NKN_KN​K​​ }. A continuous subsequence is defined to be { NiN_iN​i​​, Ni+1N_{i ...

  9. 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广

    3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 174  Solved: 9 ...

  10. Maximum Subsequence Sum(接上篇)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

随机推荐

  1. Java日志框架的依赖设置备查(SLF4J, Log4j, Logback)

    前言 最近在看代码的过程中,发现身边的许多人在使用Java日志框架时,对于应该引入何种依赖不甚了解,搜索网络上的文章,常常也是互不一致.这篇文章可以看着是Java日志框架的入门使用和实践建议,重点介绍 ...

  2. 数据可视化【原创】vue+arcgis+threejs 实现海量建筑物房屋渲染,性能优化

    本文适合对vue,arcgis4.x,threejs,ES6较熟悉的人群食用. 先报备一下版本号 "vue": "^2.6.11" "@arcgis/ ...

  3. 使用GPU训练Pytorch模型

    如何使用GPU训练Pytorch模型 这两天的深度学习实验真实让人头疼,传说中的"猫狗大战",对模型的训练用CPU的话9h起步,12h是常态,大学生哪耗得起,因此查找资料搭建了GP ...

  4. 好用!这些工具国庆一定要研究下「GitHub 热点速览」

    再过 3 天就要开始一年最长的假期--国庆长假了,这次除了宅家.出游之外,多了一个新选项:研究下哪些项目可以安排上,来辅助自己的日常开发. 你觉得一周获得 4k star 的 hyperdx 如何,它 ...

  5. Fireboom on Sealos:半小时搞定一个月的接口工作

    后端日常开发工作中有 88% 的接口都是 CURD,占用了超过 6 成开发时间.这些工作枯燥乏味,且价值低下,不仅荒废了时间,还无法获得任何成就感.而 Fireboom 可在 2 分钟内,完成传统模式 ...

  6. 程序员必备:使用AI工具通义千问,没有广告没有假链接,比搜索引擎要便捷多了,回答还算满意

    我提的问题是:使用Python连接Oracle,cx_Oracle和oracledb那个效率更高,功能更全,请列出他们的区别和实例代码 回复是: 以下是使用Python连接Oracle时,cx_Ora ...

  7. MySQL快速导入千万条数据(1)

    目录 一.命令行导入方式 二.LOAD DATA导入方式 对于传统的关系数据库如oracle,在大量数据导入方面的效率,我们一般有一个大概的认知,即1分钟以内可以导入千万条数据,而对于MySQL数据库 ...

  8. 多源异构数据信息的融合方式0 - Dempster/Shafer 证据理论(D-S证据理论)

    Dempster/Shafer 证据理论(D-S证据理论)的大体内容如下: 一.简介: 在理论中,由互不相容的基本命题组成的完备集合Θ称为识别框架,表示对于某一问题的所有可能答案,但是只有一个答案是正 ...

  9. 从链接器的角度详细分析g++报错: (.text+0x24): undefined reference to `main'

    /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start' ...

  10. Sum of MSLCM 题解

    Sum of MSLCM 题目大意 定义 \(\text{MSLCM}(n)\) 为所有满足该数集的 \(\text{lcm}\) 为 \(n\) 的数集中元素个数最多的数集的所有数字的和,现有多次询 ...