Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round) (A-E3)

写在前面

阳间比赛时间总出不太能做的阴间题

印尼的场,final round质量也还ok,算是学了两个经典trick吧

题目

A. Meaning Mean

排个降序后从小的开始合就好了,直觉上是哈夫曼树的合并方式,

但是只固定了第一个,后面的没有实时维护有序,也过了

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,ll> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef long long ll;
const int N=55;
int t,n;
vector<int>a;
int main(){sci(t);while(t--){sci(n);a.resize(n);rep(i,1,n)sci(a[i-1]);sort(a.begin(),a.end(),greater<int>());while(SZ(a)>1){int x=a.back();a.pop_back();int y=a.back();a.pop_back();a.pb((x+y)/2);}pte(a[0]);}return 0;
}

B. Maximize Mex

这里是写了个O(nlogn)的,当然可以写成O(n)的,增序检查i,i用完了就留给i+x

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,ll> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef long long ll;
const int N=55;
int t,n,x,v;
map<int,int>p,q;
int main(){sci(t);while(t--){sci(n);sci(x);q.clear();p.clear();rep(i,1,n){sci(v);q[v]++;}int mex=0;rep(i,0,n){if(q[i]){q[i]--;p[i%x]+=q[i];continue;}else if(p[i%x]){p[i%x]--;continue;}mex=i;break;}pte(mex);}return 0;
}

C1-C2. Adjust The Presentation(set维护前驱后继)

首先性质是,考虑b序列里的每个首次出现的数,需要和a序列里一一对应,

因为剩下的非首次位置,总能通过你的重新安排,使得它能在想要的时机出现

赛中写了个线段树,维护v当前在b序列的位置减v在a序列的位置,

然后需要让所有值都是0,感觉蠢完了

实际上之前也出过一个lca的题,维护相邻项即可,

EPIC Institute of Technology Round August 2024 D2. DFS Checker (Hard Version)(dfs序性质 lca)_epic institute of technology round august 2024 (di-CSDN博客

只需要关注对于每个a序列里的v,记它的前驱是pre[v],

v在b序列里的首次出现位置,

也需要满足在pre[v]在b序列里的首次位置的后面,

每次修改最多影响两个位置,对应影响其前驱和后继,

动态维护当前不合法的个数cnt即可

代码

#include<bits/stdc++.h>
using namespace std;
// #define DEBUG
#ifdef DEBUG
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define debug(...) [](auto...a){((cout<<a<<' '),...)<<endl;}(#__VA_ARGS__,":",__VA_ARGS__)
#define debugv(v) do{cout<<#v<<" : {";for(int izxc=0;izxc<v.size();++izxc){cout<<v[izxc];if(izxc+1!=v.size())cout <<", ";}cout<<"}"<<endl;}while(0)
#define debugmp(mp) do{cout<<#mp<<" : { ";for(auto p:mp){cout<<'['<<p.first<<" -> "<<p.second<<"] ";}cout<<"}"<<endl;}while(0)
#define debugset(s) do{cout<<#s<<" : {";for(auto x:s)cout<<x<<' ';cout<<"}"<<endl;}while(0)
#else
#define debug(...)
#define debugv(v)
#define debugmp(mp)
#define debugset(s)
#endif
typedef long long ll;
typedef pair<int, int> pii;const int N = 2e5+5;
int a[N], pre[N], nxt[N], b[N];
set<int> s[N];void solve() {int n, m, q; cin >> n >> m >> q;for(int i = 1; i <= n; i++) cin >> a[i];for(int i = 1; i <= n; i++) {if(i > 1) pre[a[i]] = a[i - 1];else pre[a[i]] = 0;if(i < n) nxt[a[i]] = a[i + 1];else nxt[a[i]] = 0;}for(int i = 1; i <= n; i++) {s[a[i]].clear();s[a[i]].insert(m + i);}for(int i = 1; i <= m; i++) {cin >> b[i];s[b[i]].insert(i);}int cnt = 0;for(int i = 2; i <= n; i++) {if(*s[a[i - 1]].begin() >= *s[a[i]].begin()) cnt++;}if(cnt == 0 ) cout << "YA" << endl;else cout << "TIDAK" << endl;while(q--) {int pos, t; cin >> pos >> t;if(b[pos] != t) {int x = b[pos];int tcnt = 0;if(pre[x] && *s[pre[x]].begin() >= *s[x].begin()) tcnt--;if(nxt[x] && *s[x].begin() >= *s[nxt[x]].begin()) tcnt--;s[x].erase(pos);if(pre[x] && *s[pre[x]].begin() >= *s[x].begin()) tcnt++;if(nxt[x] && *s[x].begin() >= *s[nxt[x]].begin()) tcnt++;cnt += tcnt;tcnt = 0;x = t;if(pre[x] && *s[pre[x]].begin() >= *s[x].begin()) tcnt--;if(nxt[x] && *s[x].begin() >= *s[nxt[x]].begin()) tcnt--;s[x].insert(pos);if(pre[x] && *s[pre[x]].begin() >= *s[x].begin()) tcnt++;if(nxt[x] && *s[x].begin() >= *s[nxt[x]].begin()) tcnt++;cnt += tcnt;b[pos] = t;}if(cnt == 0) cout << "YA" << endl;else cout << "TIDAK" << endl;}
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T; cin >> T;while(T--) solve();return 0;
}

D. Boss, Thirsty(dp优化)

单写了一篇博客,这里不再赘述了

Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round) D. Boss, Thirsty(前缀后缀max dp优化)-CSDN博客

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=105,M=1e4+10;
const ll INF=1e15;
int t,n,m;
ll sol(){sci(n),sci(m);vector<vector<int>>a(n+1,vector<int>(m+1,0));vector<vector<ll>>f(n+1,vector<ll>(m+2,-INF));vector<vector<ll>>g(n+1,vector<ll>(m+2,-INF));vector<ll>pre(m+2,-INF),suf(m+2,-INF),sum(m+2,0);ll ans=-INF;rep(i,1,n){pre[0]=suf[m+1]=-INF;rep(j,1,m){sci(a[i][j]);sum[j]=sum[j-1]+a[i][j];}rep(j,1,m){pre[j]=max(pre[j-1],sum[m]-sum[j-1]);}per(j,m,1){suf[j]=max(suf[j+1],sum[j]);}auto premax=[&](int j){if(j<1)return 0ll;return pre[j]-(sum[m]-sum[j]);};auto sufmax=[&](int j){if(j>m)return 0ll;return suf[j]-sum[j-1];};if(i==1){rep(j,1,m){f[i][j]=sufmax(j);g[i][j]=premax(j);}}else{auto f1=[&](int k){return f[i-1][k]+sum[k]+max(0ll,sufmax(k+1));};auto f2=[&](int k){return f[i-1][k]-sum[k-2]+max(0ll,premax(k-2));};auto g1=[&](int k){return g[i-1][k]-sum[k-1]+max(0ll,premax(k-1));};auto g2=[&](int k){return g[i-1][k]+sum[k+1]+max(0ll,sufmax(k+2));};int p1=m,p2=m-1;per(j,m-1,1){if(f1(j+1)>f1(p1))p1=j+1;if(g2(j)>g2(p2))p2=j;f[i][j]=max(f1(p1),g2(p2))-sum[j-1];}int p3=1,p4=2;rep(j,2,m){if(g1(j-1)>g1(p3))p3=j-1;if(f2(j)>f2(p4))p4=j;g[i][j]=max(g1(p3),f2(p4))+sum[j];}}// rep(j,1,m){//     printf("i:%d j:%d f:%lld g:%lld\n",i,j,f[i][j],g[i][j]);// }}rep(j,1,m){ans=max(ans,f[n][j]);ans=max(ans,g[n][j]);}return ans;
}
int main(){sci(t);while(t--){ptlle(sol());}return 0;
}
/*
f[i][j]表示i行j列作为左端点必取的最大和
g[i][j]表示i行j列作为右端点必取的最大和
f[i][j]=max(k从j+1到m f[i-1][k]+sum[j,k]+sufmax[k+1:m]) sum[k]-sum[j-1] (f1)
g[i][j]=max(k从1到j-1 g[i-1][k]+sum[k,j]+premax[1:k-1]) sum[j]-sum[k-1] (g1)
f[i][j]=max(k从j到m-1 g[i-1][k]+sum[j,k+1]+sufmax[k+2:m]) sum[k+1]-sum[j-1] (g2)
g[i][j]=max(k从2到j f[i-1][k]+sum[k-1,j]+premax[1:k-2]) sum[j]-sum[k-2] (f2)
*/

E1-E3. Digital Village(树形背包 dp优化)

也单写了一篇博客

Codeforces Round 977 (Div. 2) E. Digital Village(树形背包 kruskal重构树 凸函数 闵可夫斯基和(min,+)差分优化)-CSDN博客

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=2e5+10,M=4e5+10;
const ll INF=1e15;
int t,n,m,p,v,c,par[M],sz[M],W[M];
ll ans,dp[M];
vector<ll>f[M];
struct edge{int u,v,w;
}e[N];
int find(int x){return par[x]==x?x:par[x]=find(par[x]);
}
bool operator<(edge a,edge b){return a.w<b.w;
}
void dfs(int u,int fa){dp[u]=0;for(auto &v:f[u]){dfs(v,u);dp[u]=max(dp[u],dp[v]);}for(auto &v:f[u]){if(dp[u]==dp[v]){dp[v]=0;break;}}if(u<c){dp[u]+=1ll*sz[u]*(W[fa]-W[u]);}
}
int main(){sci(t);while(t--){sci(n),sci(m),sci(p);rep(i,1,n){par[i]=i;sz[i]=W[i]=0;}rep(i,1,p){sci(v);sz[v]=1;}rep(i,1,m){scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);}sort(e+1,e+m+1);c=n;rep(i,1,m){int u=find(e[i].u),v=find(e[i].v),w=e[i].w;if(u==v)continue;W[++c]=w;sz[c]=0;par[u]=par[v]=par[c]=c;f[c].pb(u);f[c].pb(v);sz[c]=sz[u]+sz[v];}dfs(c,0);ll ans=1ll*p*W[c];sort(dp+1,dp+c+1,greater<ll>());rep(i,1,n){ans-=dp[i];printf("%lld%c",ans," \n"[i==n]);}rep(i,1,c){f[i].clear();}}return 0;
}
/*
设kruskal重构树上点x有直连儿子y1、y2假设y1内子树所有点都在y1处集结(已经通过y1及子树内的边联通),
如果有一个宽带在y1所在的连通块里,
就能阻止y1子树内所有点通过点x进入兄弟y2子树,
也就是x这条边权实际不需要连,也就是能省去y1->x增量的贡献递归往下考虑,放的这一个宽带,
可以满足既在y1连通块里,也在y1直连儿子z1的连通块里,
这样就能省去z1->y1增量的贡献,取二者更大的那个显然更优,递归到底实际是一个叶子,也就是原图上的点
所以放一个宽带最优影响的是一条权值和最大的重链
那么将kruskal重构树树链剖分后,按权值链降序贪心即可由于实际转移是一个树形背包的形式,函数也都是凸函数,
所以闵可夫斯基和(min,+)卷积可以被拆成差分,即f(i+1)可以由f(i)得到
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556365.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电脑无法无线投屏的解决办法

在前司的时候经常遇到电脑无法使用无线投屏器的情况&#xff0c;今天就来聊聊如何解决。 1.不会连接。这种情况&#xff0c;经常发生在WIN10升级WIN11之后&#xff0c;一般是两种办法&#xff0c;一种是同时按键盘上的WINDOWS和K键&#xff0c;右下角就会出来连接的图标&#…

showdoc二次开发

showdoc用的vue版本老&#xff0c;需要安装老版本nodejs&#xff0c;比如node 14.21.3 win32-x64-93_binding.node问题 https://github.com/sass/node-sass/releases 下载 web_src\node_modules\node-sass\vendor\win32-x64-93 下面重命名为binding.node 代理到php后端&…

2-114 基于matlab的CA模型

基于matlab的CA模型&#xff0c;Singer模型对单机动目标进行跟踪算法&#xff0c;具有10页实验文档。采用蒙特卡罗方法对一个二坐标雷达对一平面上运动的目标进行观测&#xff0c;得到跟踪滤波结果。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-114 …

Crypto虐狗记---”你“和小鱼(八)

前言&#xff1a;剧情八 提示&#xff1a; 下载&#xff1a; 只给了公钥 那么可以用RsaCtfTool去分离公钥---》 得到(e&#xff0c;n)&#xff1a; 如何安装参考&#xff1a; kail下安装RsaCtfTool - 九皋777 - 博客园 (cnblogs.com) 已知n&#xff0c;那么去得到p q 或者使…

OBOO鸥柏丨深圳科学展馆引入液晶拼接屏中控宣传协议互动大屏

科技馆的展厅展区&#xff0c;宛如一扇通往未来世界的璀璨窗口&#xff0c;巧妙融合了OBOO鸥柏LCD液晶拼接屏的尖端显示技术&#xff0c;液晶拼接墙与沉浸式体感交互的梦幻体验交织成一幅幅生动的科技画卷。这里&#xff0c;中控协议的精准对接&#xff0c;如同智慧之网的织就者…

whisper 实现语音识别 ASR - python 实现

语音识别&#xff08;Speech Recognition&#xff09;&#xff0c;同时称为自动语音识别&#xff08;英语&#xff1a;Automatic Speech Recognition, ASR&#xff09;&#xff0c;将语音音频转换为文字的技术。 whisper是一个通用的语音识别模型&#xff0c;由OpenAI公司开发。…

家具城管理平台———未来之窗行业应用跨平台架构

一、家具城商城管理数字化 家具城商城电子化管理优势显著。能实时精确掌控库存&#xff0c;及时补货并降低积压。通过销售数据的精准分析&#xff0c;把握市场需求&#xff0c;优化采购与营销。提升客户服务&#xff0c;记录购买历史以提供个性化体验。简化采购&#xff0c;自动…

leetcode 力扣算法题 快慢指针 双指针 19.删除链表的倒数第n个结点

删除链表的倒数第N个结点 题目要求题目示例解题思路从题目中的已知出发思考寻找目标结点条件转换核心思路 需要注意的点改进建议 完整代码提交结果 题目要求 给你一个链表&#xff0c;删除链表的倒数第n个结点&#xff0c;并且返回链表的头结点。 题目示例 示例 1&#xff1…

微信小程序和抖音小程序的分享和广告接入代码

开发完成小程序或者小游戏之后&#xff0c;我们为什么要接入分享和广告视频功能&#xff0c;主要原因有以下几个方面。 微信小程序和抖音小程序接入分享和广告功能主要基于以下几个原因&#xff1a; 用户获取与增长&#xff1a;分享功能可以帮助用户将小程序内容传播给更多人&…

Crypto虐狗记---”你“和小鱼(外传)

前言&#xff1a;剧情十(我没看见还有一个。。。。) 提示&#xff1a; 下载&#xff1a; 参数有了&#xff0c;直接搞就行。。。 参考&#xff1a; *crypto*练2--攻防世界--easy_ECC - kubopiy - 博客园 (cnblogs.com) 大佬的脚本&#xff1a; 攻防世界 easy_ECC - diakla -…

鸿蒙next开发第一课03.ArkTs语法介绍-案例

前面已经学习了ArkTs的基本语法和DevEcoStudio的基本操作&#xff0c;接下来按照官方提示开发一个基本案例。 该案例是系统自带的demo&#xff0c;下载下来源代码后可以直接运行。 接下来我来演示如何运行demo。我在demo中加入了自己的注释。 切记&#xff1a;文件夹不能有中…

遥感滑坡目标检测数据集 2300张 滑坡 带标注 voc yolo 1类

遥感滑坡目标检测数据集 2300张 滑坡 带标注 voc yolo 1类 分类名: (图片张数&#xff0c; 标注个数) landsI ide: (2299&#xff0c;6545) 总数: (2314&#xff0c; 6545) 总类(nc): 1类 遥感滑坡目标检测数据集 (Remote Sensing Landslide Detection Dataset) 数据集概述 该…

深入了解Python:那些常被忽略的知识点

作为现代编程语言的典范&#xff0c;Python以其简洁、高效和广泛的应用领域赢得了无数开发者的青睐。然而&#xff0c;即使是经验丰富的Python程序员&#xff0c;也可能不了解Python的一些特性或最佳实践。这篇文章将介绍Python中常被忽略的一些知识点&#xff0c;通过全面的分…

C++入门(引用篇)

在C编程的广阔天地中&#xff0c;引用是一种强大且独特的工具&#xff0c;它允许程序员为已存在的变量创建别名&#xff0c;通过这个别名可以直接访问和操作原始变量。引用的这一特性不仅简化了代码&#xff0c;提高了代码的可读性&#xff0c;还带来了性能上的优势。接下来&am…

推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法&#xff1a;用模型对训练数据标签进行拟合&#xff0c;拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击&#xff08;…

【Conda】Conda命令详解:高效更新与环境管理指南

目录 1. Conda 更新命令1.1 更新 Conda 核心1.2 更新所有包 2. 严格频道优先级3. 强制安装特定版本4. 创建与管理环境4.1 创建新环境4.2 激活和停用环境4.3 导出和导入环境4.4 删除环境 5. 清理缓存总结 Conda 是一个强大的包管理和环境管理工具&#xff0c;广泛应用于数据科学…

.net8系列-07图文并茂手把手教你连接SqlServer数据库使用log4net记录.net日志

文章目录 前情提要步骤概览 下载依赖下载安装成功 数据库准备脚本准备执行脚本&#xff0c;创建所需数据库创建成功&#xff0c;查看日志表 准备代码初始代码配置数据库开启数据库写入日志逻辑开启日志 运行测试删除之前的编译文件重新编译运行测试本地日志测试成功数据库日志测…

【英语】2. 英语的表达习惯

文章目录 前言less v. more n.解释e.g. less v. more prep.被动与中文的歧义总结参考文献 前言 进行英语前后缀的复习 less v. more n. 解释 外国的表达方式&#xff1a;更多地偏向静态&#xff0c;因此更多地使用名词 e.g. (rather Chinglish expression) She could not c…

使用 docker-compose 启动 es 集群 + kibana

编写 docker-compose yaml version: v3 services:elasticsearch-node1:image: elasticsearch:7.17.24container_name: elasticsearch-node1ports:- "9200:9200"- "9300:9300"environment:- node.nameelasticsearch-node1- cluster.namemy-es-cluster- dis…

云计算身份认证与访问控制(Cloud Computing Identity Authentication and Access Control)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…