首页 > 其他分享 >14 CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)C. Tenzing and Balls(dp+前缀最大值优化)

14 CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)C. Tenzing and Balls(dp+前缀最大值优化)

时间:2024-02-29 09:34:50浏览次数:37  
标签:Rated Tenzing int max 最大值 Div rep dp define

思路:
dp还是挺明显的,思路可以参考最长上升子序列
有点dp的感觉
\(f[i]\)表示考虑前\(i\)个数,的最大值
当前数有两种删或不删
不删:\(f[i]=f[i-1]\);
删:\(f[i]=max{f[j-1]+i-j+1}\)
这个转移是\(O(n^2)\)的显然时间上来不及
考虑优化,第一层循环一定是省不了的
考虑优化掉第二层循环
将j提出了\(f[i]=max{f[j-1]-j}+i+1\),f[j-1]-j是满足所有\(a[i]==a[j]\)中最大的,这个可以维护一下前缀最大值

#include <bits/stdc++.h>

#define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define fep(i, a, b) for(int i = (a); i >= (b); --i)
#define _for(i, a, b) for(int i=(a); i<(b); ++i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>
#define inf -0x3f3f3f3f

/*
 * 有点dp的感觉
 * f[i]表示考虑前i个数,的最大值
 * 当前数有两种删或不删
 * 不删:f[i]=f[i-1];
 * 删:f[i]=max{f[j-1]+i-j+1}
 * 这个转移是$O(n^2)$的显然时间上来不及
 * 考虑优化,第一层循环一定是省不了的
 * 考虑优化掉第二层循环
 * 将j提出了$f[i]=max{f[j-1]-j}+i+1$,f[j-1]-j是满足所有a[i]==a[j]中最大的,这个可以维护一下前缀最大值
 */

using namespace std;
const int maxn = 2e5 + 10;
int f[maxn],a[maxn],sum[maxn];
vi p[maxn];
int n;
void solve() {
    cin>>n;
    rep(i,1,n){
        f[i]=0;
        sum[i]=inf;
    }
    rep(i,1,n){
        cin>>a[i];
    }

    //dp
    //初始化0、1都无法去转移初始化为0
    f[0]=f[1]=0;
    rep(i,1,n){
        int x=a[i];
        f[i]=f[i-1];
        //这样转移会tle需要优化
//        rep(j,0,p[x].size()-1){
//            if(p[x][j]==i)  continue;
//            f[i]=max(f[i],f[p[x][j]-1]+i-p[x][j]+1);
//        }
        f[i]=max(sum[x]+i,f[i]);
        sum[x]=max(sum[x],f[i-1]-i+1);
    }
    cout<<f[n]<<endl;
}

signed main() {

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
//	freopen("C:\\Users\\24283\\CLionProjects\\untitled2\\1.in", "r", stdin);
    int _;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

标签:Rated,Tenzing,int,max,最大值,Div,rep,dp,define
From: https://www.cnblogs.com/cxy8/p/18042695

相关文章

  • Codeforce Round 929(Div.3)
    CodeforcesRound929(Div.3)刷题记录A.TurtlePuzzle:RearrangeandNegate//Problem:A.TurtlePuzzle:RearrangeandNegate//Contest:Codeforces-CodeforcesRound929(Div.3)//URL:https://codeforces.com/contest/1933/problem/0//MemoryLimit:256MB......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)A-TurtlePuzzle:RearrangeandNegate代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pa......
  • 13 Codeforces Round 886 (Div. 4)G. The Morning Star(简单容斥)
    G.TheMorningStar思路:用map记录x,y,以及y-x、y+x从前往后统计一遍答案即可公式\(ans+=cnt[x]+cnt[y]-2*cnt[x,y]+cnt[y+x]+cnt[y-x]\)\(cnt[x]+cny[y]-2*cnt[x,y]\)是统计坐标轴方向的,-2倍是需要把本身这个点给减去容斥是减一倍,这里还需要把自己给挖掉\(cnt[y+x]+cnt[y......
  • Codeforces Round 929 (Div. 3)
    B.TurtleMath:FastThreeTask数学#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e5+10;inta[N];voidsolve(){ intn; cin>>n; intsum=0; map<int,int>mp; intmx=0; for(inti=1;i<=n;i++){ cin......
  • 11 .Codeforces Round 891 (Div. 3)E. Power of Points(推公式+前缀和优化)
    E.PowerofPoints题解参考#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#define_for(i,a,b)for(inti=(a);i<(b);++i)#definepii......
  • Codeforces Round 929 (Div. 3) 题解(D-G)
    比赛链接:https://codeforces.com/contest/1933官解暂未放出。质量不错的一场D3。CF1933D.TurtleTenacity:ContinualMods题意将数组\(a_{1..n}\ge1\)重排,问是否能使\(((a_1\mathbin{\rmmod}a_2)\mathbin{\rmmod}a_3)\cdots\mathbin{\rmmod}a_n\ne0\)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)比赛链接A.TurtlePuzzle:RearrangeandNegate思路根据题意,很明显数组中所有元素的绝对值总和就是答案Code#include<bits/stdc++.h>usingnamespacestd;#defineall(x)x.begin()+1,x.end()#defineintlonglongvoidsolve(){......
  • D. Vlad and Division
    原题链接题解对于一个数,我们将其转换成二进制,然后补零到31位我们发现,能和数x配对的数只有一个,那就是按位翻转后的x,即x和\(2^{31}-1\)异或的值所以我们要找有没有能互相配对的值,以及组数,配对用map?code#include<bits/stdc++.h>usingnamespacestd;constintval=2147483......
  • 【vue】做一个从右边出来又回去的一个抽屉div
    前言:工作需要做一个从右往左出现的一个弹窗,要有抽屉效果,看了网上各种方法好多都不能用,最后试了一种可以用,但是忘记是哪个网址了,现在就是自己写一下这个随便以后用到方便找。做一个从右边出来又回去的一个抽屉divhtml代码<divclass="addBtn"@click="show">点击按钮出......
  • 题解 CF1781G Diverse Coloring
    \(\texttt{link}\)题意给定一棵\(n\)个点的二叉树,现对其每个点染成黑色或白色。一种合法的染色方案满足:对于所有黑色的点,都存在白色的点与之相邻。对于所有白色的点,都存在黑色的点与之相邻。一种染色方案的权值是染成黑色的点数与染成白色的点数之差的绝对值。\(\foral......