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();
}
}

浙公网安备 33010602011771号