Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)(A~E1)题解记录

news/2025/1/27 2:41:15/文章来源:https://www.cnblogs.com/cjcf/p/18692380

好久没写codeforces题解,这次E1赛后才做出来,为了方便点,先不把题目挂出来了
比赛链接:https://codeforces.com/contest/2062

A.String

思路:显然可以发现,选择方法形如10101,这种其实是最佳的,然后可以发现这种变成全0的次数等于其1的个数,故归纳一下,本题答案就是对应字符串1的个数

	#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<deque>#include<cctype>#include<string.h>#include<math.h>#include<time.h>#include<random>#include<functional>#include<stack>#include<string>#define ll                                  long long #define lowbit(x) (x & -x)#define endl "\n"//                           交互题记得删除using namespace std;mt19937 rnd(time(0));const ll mod = 998244353;//const ll p=rnd()%mod;ll ksm(ll x, ll y){ll ans = 1;while (y){if (y & 1){ans = ans % mod * (x % mod) % mod;}x = x % mod * (x % mod) % mod;y >>= 1;}return ans % mod % mod;}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}struct s{ll l,r;bool operator<(const s&a){}};int main(){fio();ll t;cin>>t;while(t--){string f;cin>>f;ll cnt=0;for(ll i=0;i<f.size();i++){cnt+=(f[i]=='1');}cout<<cnt<<endl;}}

B.Clockwork

思路:考虑最坏情况即可,即从一个点出发,从该点出发前往最远端回来,如果回来之前变为0,则一定无解。如果都满足,显然移动周期内都可以过所有点一遍的

	#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<deque>#include<cctype>#include<string.h>#include<math.h>#include<time.h>#include<random>#include<functional>#include<stack>#include<string>#define ll                                  long long #define lowbit(x) (x & -x)#define endl "\n"//                           交互题记得删除using namespace std;mt19937 rnd(time(0));const ll mod = 998244353;//const ll p=rnd()%mod;ll ksm(ll x, ll y){ll ans = 1;while (y){if (y & 1){ans = ans % mod * (x % mod) % mod;}x = x % mod * (x % mod) % mod;y >>= 1;}return ans % mod % mod;}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}struct s{ll l,r;bool operator<(const s&a){}};ll a[5450000];int main(){fio();ll t;cin>>t;while(t--){ll n;cin>>n;ll pd=0;for(ll i=1;i<=n;i++){ll x;cin>>x;if((i-1)*2>=x||(n-i)*2>=x)pd=1;}if(pd)cout<<"NO"<<endl;else cout<<"YES"<<endl;}}

C.Cirno and Operations

思路:只有两种操作,其实第二种变成差分数组,反转之前和之后,值只有正负之分,绝对值是一样的,数据范围小,暴力枚举即可,其实每次取个最大abs(\(a_n-a_l\))其实应该就可以了

	#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<deque>#include<cctype>#include<string.h>#include<math.h>#include<time.h>#include<random>#include<functional>#include<stack>#include<string>#define ll                                  long long #define lowbit(x) (x & -x)#define endl "\n"//                           交互题记得删除using namespace std;mt19937 rnd(time(0));const ll mod = 998244353;//const ll p=rnd()%mod;ll ksm(ll x, ll y){ll ans = 1;while (y){if (y & 1){ans = ans % mod * (x % mod) % mod;}x = x % mod * (x % mod) % mod;y >>= 1;}return ans % mod % mod;}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}struct s{ll l,r;bool operator<(const s&a){}};ll a[5450000];int main(){fio();ll t;cin>>t;while(t--){ll n;cin>>n;ll ans=-1e18;ll sum=0;for(ll i=1;i<=n;i++){cin>>a[i];sum+=a[i];}ans=sum;ll l=1,r=n;while(1){sum=0;if(l==r)break;if(a[r]-a[l]>=0){for(ll i=r;i>=l+1;i--){a[i]=a[i]-a[i-1];}l++;}else {for(ll i=l;i<=(l+r)>>1;i++){swap(a[i],a[r-i+l]);	}}for(ll i=l;i<=r;i++){sum+=a[i];}ans=max(ans,sum);}cout<<ans<<endl;}}

D.Balanced Tree

思路:本题从树的角度去考虑,如果儿子中的最大值小于等于父亲的值,其实没有必要修改父亲的,但是得传递修改值;如果父亲的值小于儿子的值,其修改值将是所有大于父亲的儿子的值-父亲的值之差的和。所以我们可以发现一个节点的值不能太大也不能太小,所以我们尽量往儿子中的最大值去靠即可(越大,答案越不优;越小,答案只会大于等于最优答案),然后分情况改变下修改值即可。

	#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<deque>#include<cctype>#include<string.h>#include<math.h>#include<time.h>#include<random>#include<functional>#include<stack>#include<string>#define ll                                  long long #define lowbit(x) (x & -x)#define endl "\n"//                           交互题记得删除using namespace std;mt19937 rnd(time(0));const ll mod = 998244353;//const ll p=rnd()%mod;ll ksm(ll x, ll y){ll ans = 1;while (y){if (y & 1){ans = ans % mod * (x % mod) % mod;}x = x % mod * (x % mod) % mod;y >>= 1;}return ans % mod % mod;}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}struct s{ll l,r;bool operator<(const s&a){}};ll a[5450000];vector<ll>g[250000];ll ans=0;map<ll,pair<ll,ll>>z;ll dfs(ll x,ll f){ll xg=0;vector<pair<ll,ll>>k;ll l=z[x].first;ll r=z[x].second;ll u=0;ll z=0;for(auto j:g[x]){if(j==f)continue;xg+=dfs(j,x);u=max(u,a[j]);if(a[j]>=r)z+=a[j]-r;}if(u>=l&&u<=r){	a[x]=u;return xg;}else if(u<=l){a[x]=l;return xg;}else  {a[x]=r;return xg+z;}};int main(){fio();ll t;cin>>t;while(t--){z.clear();ans=0;ll n;cin>>n;for(ll i=1;i<=n;i++){g[i].clear();ll l,r;cin>>l>>r;z[i]={l,r};}for(ll i=1;i<n;i++){ll l,r;cin>>l>>r;g[l].push_back(r);g[r].push_back(l);}cout<<dfs(1,0)+a[1]<<endl;}}

E1.The Game (Easy Version)

思路:没往LCA去想,但是这道题LCA好做,可能答案也是LCA?满足LCA要求后,我们先进行排序,优先值,其次是深度,这个很重要。最大值的所有点不考虑,如果倒序遍历过程中,该值和上一个值不相同,我们就去遍历上一个所有点,如果该点和上一个值点的所有点LCA都是该点则继续,否则解就是该点,break;如果相同,由于进行深度排序了,此时该点的深度比他小,如果该点和上一个点的LCA,只要不是该点,则该点即是答案,break,否则重复上述步骤即可,显然不会TLE

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<deque>
#include<cctype>
#include<string.h>
#include<math.h>
#include<time.h>
#include<random>
#include<functional>
#include<stack>
#include<string>
#define ll                                  long long 
#define lowbit(x) (x & -x)
#define endl "\n"//                           交互题记得删除
using namespace std;
mt19937 rnd(time(0));
const ll mod = 998244353;
//const ll p=rnd()%mod;
ll ksm(ll x, ll y)
{ll ans = 1;while (y){if (y & 1){ans = ans % mod * (x % mod) % mod;}x = x % mod * (x % mod) % mod;y >>= 1;}return ans % mod % mod;
}
ll gcd(ll x, ll y)
{if (y == 0)return x;elsereturn gcd(y, x % y);
}
void fio()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
}
ll dep[450000];
struct s
{ll l, r;bool operator<(const s& a){if (r != a.r)return r < a.r;else return dep[l] < dep[a.l];}
}p[405000];
ll a[450000];
vector<ll>g[450000];
vector<ll>k[450000];
ll fa[450000][36];
ll lca(ll x, ll y)
{if (dep[x] < dep[y])swap(x, y);ll dis = dep[x] - dep[y];for (ll i = 30; i >= 0; i--){if ((1ll << i) <= dis){dis -= 1ll << i;x = fa[x][i];}}if (x == y)return x;for (ll i = 30; i >= 0; i--){if (fa[x][i] != fa[y][i])x = fa[x][i], y = fa[y][i];}return fa[x][0];
}
void dfs(ll x, ll f)
{dep[x] = dep[f] + 1;fa[x][0] = f;for (ll i = 1; i <= 31; i++){fa[x][i] = fa[fa[x][i - 1]][i - 1];}for (auto j : g[x]){if (j == f)continue;dfs(j, x);}
}
int main()
{fio();ll t;cin >> t;while (t--){ll n;cin >> n;for (ll i = 1; i <= n; i++){cin >> a[i];p[i].l = i;k[i].clear();p[i].r = a[i];g[i].clear();}for (ll i = 1; i <= n; i++){k[a[i]].push_back(i);}for (ll i = 1; i < n; i++){ll l, r;cin >> l >> r;g[l].push_back(r);g[r].push_back(l);}dfs(1, 0);sort(p + 1, p + 1 + n);ll ans = 0;ll flag = p[n].r;//for(ll i=1;i<=n;i++)cout<<p[i].l<<endl;for (ll i = n - 1; i >= 1; i--){//cout<<p[i].l<<endl;if (p[i].r == p[n].r)continue;if (flag != p[i].r){for (auto j : k[flag]){//if (flag == 3)cout << j << endl;ll u = lca(p[i].l, j);if (u == p[i].l)continue;else ans = p[i].l;}}else if (flag == p[i].r){if (lca(p[i + 1].l, p[i].l) == p[i].l)continue;else ans = p[i].l;}if (ans)break;flag = p[i].r;}cout << ans << endl;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三创赛商务大数据分析实战赛

数据采集 概念 数据采集就是搜集符合数据挖掘研究要求的原始数据(Raw Data)。原始数据是研究者拿到的一手或者二手资源。数据采集既可以从现有、可用的无尽数据中搜集提取你想要的二手数据,也可以经过问卷调查、采访、沟通等方式获得一手资料。不管用哪种方法得到数据的过程…

索引篇

1.索引如何分类?按照物理结构分类:①聚簇索引 ②二级索引 按数据结构分:①哈希表索引 ②B+树索引 ③Full-text索引 按字段特性分类:① 主键索引 ②唯一索引 ③普通索引 ④前缀索引 按照索引结构分类:①单列索引 ②联合索引2.InnoDB的聚簇索引的默认创建机制如果有主键,默…

2024年度Graph+AI开源探索思考

2024年蚂蚁图计算团队在「Graph+AI」开源技术方向的实践过程和思考,和大家聊一聊这个技术方向带给了我们什么,面向2025年还有哪些有意思的事情可以继续探索。前记 这篇年度总结其实酝酿了许久,却因诸多原因拖至腊月底,此时赶在春节前发出来,也不失为“农历版”年度总结了。…

卷积

参见:Convolutions Over Volume | CourseraBut what is a convolution? | 3Blue1BrownCNN Explainer

Windows安装Mysql-5.7(安装器方式)

1、下载Mysql的安装包下载地址:https://dev.mysql.com/downloads/installer/ 注意:官网的下载速度可能很慢,有任务时间要求的须尽快下载,或者使用其他可靠的下载源2、选择对应的版本注意:选择完MySQL的版本后,可以看到下载列表中有两个可以选择;其中小的那个是在线安装器…

RocketMQ原理—5.高可用+高并发+高性能架构

大纲 1.RocketMQ的整体架构与运行流程 2.基于NameServer管理Broker集群的架构 3.Broker集群的主从复制架构 4.基于Topic和Queue实现的数据分片架构 5.Broker基于Pull模式的主从复制原理 6.Broker层面到底如何做到数据0丢失 7.数据0丢失与写入高并发的取舍 8.RocketMQ读写分离主…

若干文本

4.1.2 基于 CatBoost 的缺失值填充 在数据预处理过程中,为确保模型训练数据的完整性,需对数据集 dataset1 和 dataset3 中的缺失值进行高效填充。针对多维度、多变量的缺失值问题,本研究采用基于梯度提升决策树(Gradient Boosting Decision Tree, GBDT)的 CatBoost 算法,…

思科划分广播域(Vlan)

思科划分广播域(Vlan) Vlan概念:(虚拟局域网) ​ Vlan是用来隔离广播域,限制主机间进行通信。 作用:控制网络风暴,提高网络性能,增强安全性。 Trunk(干道)是在网络通信中可以用于交换机上来承接多个Vlan流量,并通过帧标签(802.1Q)来区分不同的vlan。 实验 规划Vl…

索引的性能影响:优化数据库查询与存储的关键

title: 索引的性能影响:优化数据库查询与存储的关键 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在关系数据库管理系统中,索引是提升数据检索性能的重要工具。然而,索引的引入虽然能够加速查询操作,但同时也可能对数据更新、存储空间及整体性能产生影…

笔试杂题选记

笔试杂题选记不知道定义型三个变量 X Y Z 两两相关系数都是 \(\rho\) 那么求 \(\rho\) 的取值范围 相关系数的定义:\(\displaystyle\dfrac{cov(X,Y)}{\sigma_X \sigma_Y},cov(X,Y) = \frac{1}{n-1}\sum\limits_{i=1}^n (x- \overline x)(y-\overline y)\)。如果没有”样本点“…

什么是Conda和Anaconda?

什么是Conda? conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。包管理与pip的使用类似,环境管理则允许用户方便地安装不同版本的python并可以快速切换。 什么是Anaconda? Anaconda Anaconda是conda的一个发行版,里面预装好了conda、某个版本的…

【枚举】求勾股数的方法

题目样例输入1 20输出3 4 5 5 12 13 8 15 17解释,1-20内有多组勾股数,但满足两两互质的只有上述三组。下图是1-20内的全部勾股数组思路: n的范围在1e4,三重for循环会超时,所以可以枚举a,b,用ab计算c,看c是否满足条件,可以做到\(O(n^2)\)的时间复杂度。 另外:两数互质就是…