首页 > 其他分享 >Educational Codeforces Round 103 C

Educational Codeforces Round 103 C

时间:2022-10-20 13:22:06浏览次数:60  
标签:10 Educational int res ans Codeforces 往后走 103 我们

C. Longest Simple Cycle

显然针对ab相等的话 那我们就不能再往前走了
所以我们考虑分为几个层
我们考虑如何求出一个层的最长环

我们观察这个红色的环
显然我们正着做 反着做都是可以的 我们就正着做把
但是每次到一层 我们可以考虑两件事
第一就是继续往后走 我们就在现在环+c[i]-|a[i+1]-b[i+1]|+1就是我们现在的环的权重
当然我们也可以在该层不要之前的权重 重新从中间再往后走就是res=max(res,|a[i+1]-b[i+1]|+1)
第二种就是我们直接不往后走了 直接就在该层闭环 我们直接更新答案就可以了 ans=max(ans,res+c[i])
这样就做完了

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 1e9+7;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);

void solve(){
    int n;cin>>n;
    vector<int>c(n+10),a(n+10),b(n+10);
    for(int i=1;i<=n;i++)cin>>c[i];
    for(int i=1;i<=n;i++)cin>>a[i];
    vector<int>v;
    v.push_back(1);
    for(int i=1;i<=n;i++){
        cin>>b[i];
        if(i!=1&&a[i]==b[i])v.push_back(i-1);
    }
    v.push_back(n);
    int ans=0,res;
    for(int i=0;i<v.size()-1;i++){
        int l=v[i],r=v[i+1];
        i == 0 ? res = abs(a[2] - b[2])+1: res = 1;
        while(l<r) {
            l++;
            ans = max(ans, res + c[l]);
            if(l!=r)res += c[l] - abs(a[l + 1] - b[l + 1])+1;
            res=max(res,abs(a[l + 1] - b[l + 1])+1);
            ans = max(ans, res);
        }
    }
    cout<<ans<<endl;
}
signed main(){
    fast
    int t;t=1;cin>>t;
    while(t--) {
        solve();
    }
    return ~~(0^_^0);
}

标签:10,Educational,int,res,ans,Codeforces,往后走,103,我们
From: https://www.cnblogs.com/ycllz/p/16809534.html

相关文章

  • Codeforces Round #202 (Div. 1) A. Mafia 推公式 + 二分答案
    ​​http://codeforces.com/problemset/problem/348/A​​A.MafiatimelimitpertestmemorylimitpertestinputoutputOnedaynfriendsgatheredtogethertoplay"Ma......
  • Codeforces Round #699 C
    C.FencePainting显然对于我们不同的就直接修改但是我们应该贪心的叫更后面来的人来修改这样前面的人怎么造都无所谓了for(inti=1;i<=n;i++){if(a[i]!=b[i]......
  • CodeCraft-21 and Codeforces Round #711 C
    C.PlanarReflections考虑dpdp[i][j]表示i能量的在第j层的cnt显然我们会分裂成左右两部分dp[i][j]=dp[i-1][n-j]+dp[i][j-1]我们为了不讨论方向问题直接记忆化搜索......
  • Educational Codeforces Round 137 (Rated for Div. 2) - D. Problem with Random Tes
    期望+暴力[Problem-D-Codeforces](https://codeforces.com/contest/1743/problem/E)题意给出一个长度为\(n\;(1<=n<=10^6)\)的字符串\(s\),选取两个\(s\)的......
  • Educational Codeforces Round 137 (Rated for Div. 2) - E. FTL
    DPProblem-E-Codeforces题意有个BOSS有\(H\;(1<=H<=5000)\)血量,\(s\)点防御有两种武器可用攻击BOSS,伤害分别为\(p_1,p_2\;(s<min(p_1,p_2)<=5000)\),冷却......
  • Codeforces Round #712 A
    A.BalancetheBits显然对于一个字符串s我们每一对0之间必须是()一个合法的括号才行)(也可以显然是等价的因为你a拿前者b就会拿后者所以这就要求了我们0的个数必须是偶......
  • Educational Codeforces Round 107 D
    D.MinCostString显然我们对于每两个组都要本质不同我们考虑本质不同两个组的数量为k^2我们考虑如何构造将这k^2的连接起来不然显然如果一个借着一个显然会产生新的......
  • Codeforces Round #713 E
    E.PermutationbySum显然轻松上下界判断考虑如何构造我们将它整成最小的样子1234....k个从后往前要是他需要我们就直接加上去就可以了#include<bits/stdc++.h......
  • Divide by Zero 2021 and Codeforces Round #714 C
    C.AddOne显然对于每一位单独分析我们经过一次进位只能变成10这样该怎么做呢我们显然可以dp设dp[i][j]表示i(0-9)经过j次变换有几位显然我们初始化i+j<10就是1elsed......
  • Codeforces Round #757 (Div. 2) - D2. Divan and Kostomuksha (hard version)
    GCD+DP+调和级数/埃式筛[Problem-D-Codeforces](https://codeforces.com/contest/1610/problem/D)题意给出一个长度为\(n\;(1<=n<=10^5)\)的数组\(a[i]\;(1<......