Codeforces Round 1023 (Div. 2)

Maximum Subarray Sum

将所有的0位置填-1e18,就不用分段求最大值m
k<m,不行,怎么加都可以取当前的一段达到m
k==m,就这样就可以
k>m,可以这样构造
找到最左边的0,前缀和后缀最大加上他是k即可,别的再怎么加也达不到k

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long long

int n,k;
const int N=200010;
int a[N];int f[N];int g[N];
void solve(){
cin>>n>>k;
string b;cin>>b;b="a"+b;

for(int i=1;i<=n;i++)cin>>a[i];

for(int i=1;i<=n;i++)if(b[i]=='0')a[i]=-1e17;

int m=0;
for(int i=1;i<=n;i++){
  
    f[i]=max(f[i-1]+a[i],a[i]);m=max(m,f[i]);  //cout<<f[i]<<" ";
}
if(m>k){
    no;
}else if(m==k){
    yes;
    for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<'\n';
}else {
    int st=1;
    while(st<=n&&b[st]=='1')st++;
    if(st>n){
        no;return ;
    }

    g[n+1]=0;
    for(int i=n;i>=1;i--){
        g[i]=max(g[i+1]+a[i],a[i]);
    }
    a[st]=k-max(0ll,f[st-1])-max(0ll,g[st+1]);
yes;
for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<'\n';
}

}
signed main(){
    std::ios::sync_with_stdio(false);
    int T=1;cin>>T;
    while(T--){
        solve();
    }
}

D. Apple Tree Traversing

答案是每次找端点最大的直径,
每次找未访问过的连通块直径,标记这个直径上的点为访问过
O(n根号n)类似长链剖分,从根到任意叶子的路径最多经过 O(√n) 条链,
长链(长度 > √n):最多有 O(√n) 条
短链(长度 ≤ √n):可能有 O(n) 条
处理长链:每条长链对应一次DFS,遍历 O(n) 个节点,总工作量 O(n√n)
处理短链:所有短链的总长度 ≤ n,每次处理短链的DFS工作量 ≤ (链长) × (分量大小) ≤ √n × n = O(n√n)

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f


const int N=150010;
vector<int> G[N];int n;
int mx=0;
int dep[N];int pre[N];bool vis[N];
void dfs1(int u,int fa){
   // cout<<"dfs1:"<<u<<'\n';
    dep[u]=dep[fa]+1;
    if(dep[u]>dep[mx]){
        mx=u;
    }else if(dep[u]==dep[mx]){
        if(u>mx)mx=u;
    }
    for(auto v:G[u]){
        if(vis[v])continue;if(v==fa)continue;
        dep[v]=dep[u]+1;
        dfs1(v,u);
    }
}
void dfs2(int u,int fa){
    pre[u]=fa;dep[u]=dep[fa]+1;
    if(dep[u]>dep[mx]){
        mx=u;
}else if(dep[u]==dep[mx]){
    if(u>mx)mx=u;
}
    for(auto v:G[u]){
        if(vis[v])continue;if(v==fa)continue;
        dfs2(v,u);
    }
}

void solve(){
cin>>n;for(int i=1;i<=n;i++){
    vis[i]=0;G[i].clear();
}
for(int i=1;i<=n-1;i++){
    int u,v;cin>>u>>v;G[u].pb(v);G[v].pb(u);
}

vector<pair<int,pii>> ans;
while(1){
    int cur=-1;
    for(int i=1;i<=n;i++){
        if(!vis[i]){cur=i;break;}
    }
    if(cur==-1)break;

    mx=0;
    dfs1(cur,0);//cout<<"fin1"<<'\n';
    int vl=mx;
    mx=0;dfs2(vl,0);//cout<<"fin2"<<'\n';
    int vr=mx;int t=vr;int c=0;
    while(t){
       vis[t]=1;c++;t=pre[t];
    }
    if(vl<vr)swap(vl,vr);
    ans.pb({c,{vl,vr}});
}
sort(ans.begin(),ans.end());reverse(ans.begin(),ans.end());
for(auto tem:ans){
cout<<tem.ft<<" "<<tem.se.ft<<" "<<tem.se.se<<' ';
}
}
signed main(){
    std::ios::sync_with_stdio(false);
    int T=1;cin>>T;
    while(T--){
        solve();
    }
}
posted @ 2025-11-01 12:15  arin876  阅读(2)  评论(0)    收藏  举报