ICPC-南京2021
A. Oops, It’s Yesterday Twice More
题解:分成四个区域,然后将所有的点先集中到对应取余的角落,然后再移动到终点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll N=1e5+5;
const ll mod=1e9+7;
const ll inf=1e18;
const double eps=1e-6;
#define endl "\n"
ll n,x,y;
void solve(ll p){
if(p==1){
for(ll i=1;i<=n-1;i++) cout<<"U";
for(ll i=1;i<=n-1;i++) cout<<"L";
for(ll i=1;i<=x-1;i++) cout<<"D";
for(ll i=1;i<=y-1;i++) cout<<"R";
}
else if(p==2){
for(ll i=1;i<=n-1;i++) cout<<"U";
for(ll i=1;i<=n-1;i++) cout<<"R";
for(ll i=1;i<=x-1;i++) cout<<"D";
for(ll i=1;i<=n-y;i++) cout<<"L";
}
else if(p==3){
for(ll i=1;i<=n-1;i++) cout<<"D";
for(ll i=1;i<=n-1;i++) cout<<"R";
for(ll i=1;i<=n-x;i++) cout<<"U";
for(ll i=1;i<=n-y;i++) cout<<"L";
}
else {
for(ll i=1;i<=n-1;i++) cout<<"D";
for(ll i=1;i<=n-1;i++) cout<<"L";
for(ll i=1;i<=n-x;i++) cout<<"U";
for(ll i=1;i<=y-1;i++) cout<<"R";
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>x>>y;
if(x>n/2&&y>n/2){
solve(3);
}
else if(x>n/2&&y<=n/2){
solve(4);
}
else if(x<=n/2&&y<=n/2){
solve(1);
}
else {
solve(2);
}
}
M. Windblume Festival
题解:分为两种情况,如果所有的数字有正有负,那么答案就是所有数字绝对值之和,如果只有正或者只有负,那么答案就是绝对值之和减去最小的绝对值*2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll N=1e6+5;
const ll mod=1e9+7;
const ll inf=1e18;
#define endl "\n"
ll a[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ll t;cin>>t;
while(t--){
ll n;cin>>n;
ll flag[2]={0};
ll sum=0;
ll minn=inf;
for(ll i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0) flag[0]=flag[1]=1;
if(a[i]>0) flag[0]=1;
else if(a[i]<0) flag[1]=1;
sum+=abs(a[i]);minn=min(minn,abs(a[i]));
}
if(n==1){ cout<<a[1]<<endl;continue;}
if(flag[0]&&flag[1]) cout<<sum<<endl;
else cout<<sum-2*minn<<endl;
}
}
C. Klee in Solitary Confinement
题解:对于每一个数字x而言,它只会对两种数字的个数产生影响,一个是x+k,一个是x,对于它自身sum[x]-1,对于sum[x+k]+1,所以我们判断每个数字,只需要判断他对x和x+k的影响即可,用一个数组sum记录对于每一种数字的影响,如果选择了x之后sum[x]<0,对sum[x]产生了负影响,所以对于x肯定就不选这个位置,就让sum[x]=0,然后每次判断每个位置的sum[x]+cnt[x]的最大值即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll N=5e6+5;
const ll mod=1e9+7;
const ll inf=1e18;
const double eps=1e-6;
#define endl "\n"
ll a[N],cnt[N],sum[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ll n,k;cin>>n>>k;
for(ll i=1;i<=n;i++){
cin>>a[i],a[i]+=2000000;//将每个数字预处理成>0的数字,不然数组存不了,map容易t
sum[a[i]]++;
}
ll ans=-inf;
for(ll i=1;i<=n;i++){
cnt[a[i]]--;
cnt[a[i]+k]++;
if(cnt[a[i]]<0) cnt[a[i]]=0;//负影响就清零
ans=max(ans,cnt[a[i]+k]+sum[a[i]+k]);
}
cout<<ans;
}
H. Crystalfly
题解:树形dp,考虑两种子节点情况。
g[x]为不选择x的子节点的子树的最优解,f[x]为x的子树的最优解
对于g[x],g[x]是不选择子节点的,所以对于字节点j,f[j]-a[j]就是不包含子节点的部分,g[x]+=f[j]-a[j]。
对于子节点的选择
1.w[j]<=2时,f[x]=max(f[x],g[x]+a[j]) j是x的子节点,由于g[x]就是没有选择x的字节点,那么在它基础上加上一个子节点就是f[x]。
2.w[j]=3时,可以选择一个别的点z然后再选择j,这时点z的子节点就无法选择,变成g[z],所以f[x]=max(f[x],g[x]+a[j]+g[z]-(f[z]-a[z])),对于这个式子,g[x]+a[j]就是加上j这个子节点,然后注意,这里g[x]已经包含z的子节点,这个时候z的子节点是不能选择的,所以要减去j的子节点然后加上gj。所以我们对于每一个w[j]=3的点,只需要找到g[z]-f[z]+a[z]的最大值即可。
注意:不要用链式前向星,memset会t,用vector存
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll N=1e6+5;
const ll mod=1e9+7;
const ll inf=1e18;
#define endl "\n"
ll a[N],w[N],cnt,f[N],g[N];
vector<ll> G[N];
void dfs(ll x,ll fa){
g[x]=a[x];
ll maxn[2]={-inf,-inf};
for(auto j:G[x]){
if(j==fa) continue;
dfs(j,x);
g[x]+=f[j]-a[j];
ll pt=g[j]-f[j]+a[j];
if(pt>maxn[1]) maxn[0]=maxn[1],maxn[1]=pt;
else if(pt>maxn[0]) maxn[0]=pt;
}
f[x]=g[x];
for(auto j:G[x]){
if(j==fa) continue;
f[x]=max(f[x],g[x]+a[j]);
if(w[j]==3){
if(g[j]-f[j]+a[j]==maxn[1]) f[x]=max(f[x],g[x]+a[j]+maxn[0]);
else f[x]=max(f[x],g[x]+a[j]+maxn[1]);
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ll t;cin>>t;
while(t--){
ll n;cin>>n;
for(ll i=1;i<=n;i++) cin>>a[i],G[i].clear();
for(ll i=1;i<=n;i++) cin>>w[i];
for(ll i=1;i<n;i++){
ll x,y;cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,-1);
cout<<f[1]<<endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)