组队训练记录(3):2021ICPC南京

2023-11-11 09:50

本文主要是介绍组队训练记录(3):2021ICPC南京,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2022.9.20

在这里插入图片描述
在这里插入图片描述
6题高罚时银牌中段。

A.Oops, It’s Yesterday Twice More

签到题 队友单开的

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
inline void solve(){int n, a, b; cin >> n >> a >> b;if(a - 1 <= n - a){for(int i = 1; i <= n - 1; i++) cout << 'U';if(b - 1 < n - b){for(int i = 1; i <= n - 1; i++) cout << 'L';for(int i = 1; i <= b - 1; i++) cout << 'R';for(int i = 1; i <= a - 1; i++) cout << 'D';} else {for(int i = 1; i <= n - 1; i++) cout << 'R';for(int i = 1; i <= n - b; i++) cout << 'L';for(int i = 1; i <= a - 1; i++) cout << 'D';}} else {for(int i = 1; i <= n - 1; i++) cout << 'D';if(b - 1 < n - b){for(int i = 1; i <= n - 1; i++) cout << 'L';for(int i = 1; i <= b - 1; i++) cout << 'R';for(int i = 1; i <= n - a; i++) cout << 'U';} else {for(int i = 1; i <= n - 1; i++) cout << 'R';for(int i = 1; i <= n - b; i++) cout << 'L';for(int i = 1; i <= n - a; i++) cout << 'U';}}
}
signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; // cin >> t;while(t--) solve();return 0;
}

M. Windblume Festival

每个点对答案的贡献是 + 1 +1 +1 − 1 -1 1 ,判断全正和全负和 n = = 1 n==1 n==1 即可。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int n;
int a[1000005];
inline void solve(){cin>>n;int fg=0,sum=0,minn=1e9,maxn=-1e9;for(int i=1;i<=n ;i++){cin>>a[i];sum+=abs(a[i]);minn=min(minn,a[i]);maxn=max(maxn,a[i]);if(a[i]<=0)fg=1;}if(n==1){cout<<a[1]<<endl;}else if(minn>0){cout<<sum-2*minn<<endl;}else if(maxn<0){cout<<sum+2*maxn<<endl;}else{cout<<sum<<endl;}
}signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; cin >> t;while(t--) solve();return 0;
}

C. Klee in Solitary Confinement

考虑 枚举答案。 开桶存权值对应所有点下标,线段树单点插入单点删除即可。(题解好像是 O ( n ) O(n) O(n) 的,但是nlogn暴力卡过去了)。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e6 + 10;
namespace SegTree{#define ls rt << 1#define rs rt << 1 | 1#define lson ls, l, mid#define rson rs, mid + 1, rstruct Info{int lmax, rmax, sum, ans;friend Info operator+ (Info a, Info b){return Info{max(a.lmax, a.sum + b.lmax),max(b.rmax, b.sum + a.rmax),a.sum+b.sum,max({a.ans,b.ans,a.rmax+b.lmax})};}} tree[N << 2];void push_up(int rt){ tree[rt] = tree[ls] + tree[rs]; }void update(int rt, int l, int r, int pos, int val){if(l == r){tree[rt] = Info{val, val, val, val};return;}int mid = l + r >> 1;if(mid >= pos) update(lson, pos, val);else update(rson, pos, val);push_up(rt);}
}
using SegTree::update;
vector<int> g[N << 1];
inline void solve(){int n, k, ans = 0; cin >> n >> k;for(int i = 1; i <= n; i++){int x; cin >>x;g[x + 1000000].emplace_back(i);}for(int i = 0; i <= 2000000; i++){ans = max((int)g[i].size(), ans);}if(k == 0){cout << ans << endl;return; }int ed=min(2000000, 2000000 + k);for(int i = max(0, k); i <= ed; i++){if(!g[i].size()||!g[i-k].size())continue;for(auto &pos : g[i]){update(1, 1, n, pos, -1);}for(auto &pos : g[i - k]){update(1, 1, n, pos, 1);}int res = SegTree::tree[1].ans + g[i].size();ans = max(res, ans);for(auto &pos : g[i]){update(1, 1, n, pos, 0);}for(auto &pos : g[i - k]){update(1, 1, n, pos, 0);}}cout << ans;
}
signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; // cin >> t;while(t--) solve();return 0;
}

D.Paimon Sorting

容易发现 ,对于新增的数 分为两种情况

小于等于前缀最大值,则交换的增加次数为前缀的大于自身的数的种类数
大于前缀最大值,暴力更新前缀最大值。

权值线段树维护即可。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
int a[N];
namespace SegTree{#define ls rt << 1#define rs rt << 1 | 1#define lson ls, l, mid#define rson rs, mid + 1, rint tree[N << 2],fk[N<<2];void push_up(int rt){ fk[rt] = fk[ls] + fk[rs];tree[rt]=tree[ls]+tree[rs]; }void build(int rt, int l, int r){tree[rt] = fk[rt]=0;if(l == r) return;int mid = l + r >> 1;build(lson), build(rson);}void update(int rt, int l, int r, int pos, int val){if(l == r) return (void)(fk[rt] += val,tree[rt]=(fk[rt]!=0));int mid = l + r >> 1;if(mid >= pos) update(lson, pos, val);else update(rson, pos, val);push_up(rt);}int query(int rt, int l, int r, int L, int R){if(L > R) return 0;if(l >= L && r <= R) return tree[rt];int mid = l + r >> 1, ans = 0;if(mid >= L) ans += query(lson, L, R);if(mid < R) ans += query(rson, L, R);return ans;}
}
using SegTree::update;
using SegTree::query;
int dp[N];
inline void solve(){int n = 0; cin >> n;SegTree::build(1, 1, n);for(int i = 1; i <= n; i++) cin >> a[i], dp[i] = 0;int maxx = a[1],cnt=0,st=1;update(1, 1, n, a[1], 1);for(int i=2;i<=n;i++){update(1, 1, n, a[i], 1);if(a[i] <= maxx){dp[i] = dp[i - 1] + query(1, 1, n, a[i] + 1, n);} else {dp[i] = dp[st]+2;for(int j=st;j<i;j++){update(1, 1, n, a[j], -1);}for(int j=st+1;j<i;j++){dp[i]+=query(1, 1, n, a[j] + 1, n);update(1, 1, n, a[j], 1);}update(1,1,n,a[st],1);st=i;}maxx = max(maxx, a[i]);}for(int i = 1; i <= n; i++) cout << dp[i] << " \n"[i == n];
}
signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; cin >> t;while(t--) solve();return 0;
}

H. Crystalfly

树dp
f u f_u fu 表示以 u u u 为根结点,不算 u u u 的答案最大值, g u g_u gu 表示访问了 u u u 点之后立刻返回其父亲结点子树的最大值,暴力转移即可。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;const int N = 1e5 + 10;
int n;
int a[100005],t[100005];
vector<int>p[100005];
int f[200005],g[200005];
int pre[100005],nxt[100005];
void dfs(int u,int fa){if(fa!=0)p[u].erase(find(p[u].begin(),p[u].end(),fa));if(!p[u].size()){g[u]=a[u];return;}int fk=0;for(auto v:p[u]){dfs(v,u);g[u]+=f[v];fk=max(fk,a[v]);}if(p[u].size()==1){f[u]=f[p[u][0]]+a[p[u][0]];g[u]+=a[u];return;}for(int i=0;i<p[u].size();i++){if(i==0){pre[i]=(t[p[u][i]]==3)?a[p[u][i]]:0;}else{pre[i]=pre[i-1];if(t[p[u][i]]==3)pre[i]=max(pre[i],a[p[u][i]]);}}for(int i=p[u].size()-1;~i;i--){if(i+1==p[u].size()){nxt[i]=(t[p[u][i]]==3)?a[p[u][i]]:0;}else{nxt[i]=nxt[i+1];if(t[p[u][i]]==3)nxt[i]=max(nxt[i],a[p[u][i]]);}}f[u]=g[u]+fk;for(int i=0;i<p[u].size();i++){int v=p[u][i];if(i==0){f[u]=max(f[u],g[u]+nxt[i+1]+g[v]-f[v]);}else if(i+1==p[u].size()){f[u]=max(f[u],g[u]+pre[i-1]+g[v]-f[v]);}else{f[u]=max(f[u],g[u]+max(pre[i-1],nxt[i+1])+g[v]-f[v]);}}g[u]+=a[u];
}
inline void solve(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];p[i].clear();f[i]=g[i]=0;}for(int i=1;i<=n;i++){cin>>t[i];}for(int i=1;i<n;i++){int u,v;cin>>u>>v;p[u].push_back(v);p[v].push_back(u);}dfs(1,0);cout<<f[1]+a[1]<<endl;
}signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; cin >> t;while(t--) solve();return 0;
}

J. Xingqiu’s Joke

队友单切的 ,只知道是记搜。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;const int N=1e6+5;
int b[N], pr[N], tot=0;
void init()
{for(int i=2;i<=1e5;i++){if(!b[i]) pr[++tot]=i;for(int j=1;pr[j]*i<=1e5;j++){b[pr[j]*i]=1;if(i%pr[j]==0) break;}}
}
vector <int> g;
int sz[N];
unordered_map <int, int > mp; 
int dfs(int a, int d)
{if(mp[a*1e9+d]) return mp[a*1e9+d];if(a<=1) return 0;mp[a*1e9+d] = a-1;for(int x : g){int tx=pr[x];if(!sz[x] || d%tx) continue;int dd = a%tx;sz[x]--;if(dd+2<tx-dd+1){mp[a*1e9+d] = min(mp[a*1e9+d], dfs(a/tx,d/tx)+dd+1);}else if(dd+1>tx-dd+2){mp[a*1e9+d] = min(mp[a*1e9+d], dfs(a/tx+1,d/tx)+tx-dd+1);}else {mp[a*1e9+d] = min({mp[a*1e9+d], dfs(a/tx+1,d/tx)+tx-dd+1,dfs(a/tx,d/tx)+dd+1});}sz[x]++;}return mp[a*1e9+d];
}
inline void solve(){int a,b; cin>>a>>b;if(b<a) swap(a,b);int d=b-a;g.clear(); mp.clear();int tmp=d;for(int i=1;i<=tot;i++) sz[i]=0;for(int i=1;i<=tot;i++){if(pr[i]*pr[i]>tmp) break;int cnt=0;while(tmp%pr[i]==0){cnt++;tmp/=pr[i];}sz[i]=cnt;g.push_back(i);}if(tmp!=1) {g.push_back(100000);sz[100000]=1;pr[100000]=tmp;}int ans=dfs(a,d);cout<<ans<<"\n";
}signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1;  cin >> t;init();//for(int i=1;i<=20;i++) cout<<pr[i]<<endl;while(t--) solve();return 0;
}

这篇关于组队训练记录(3):2021ICPC南京的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/389229

相关文章

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

(南京观海微电子)——GH7006 Application Note

Features ⚫ Single chip solution for a WXGA α-Si type LCD display ⚫ Integrate 1200 channel source driver and timing controller ⚫ Display Resolution: ◼ 800 RGB x 480 ◼ 640 RGB x 480 ⚫ Display int

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m