Codeforces Round 893 (Div. 2)题解记录

news/2024/10/19 6:27:43

题目链接:https://codeforces.com/contest/1858

A. Buttons


从自身角度出发,我想赢就得保证我的按钮尽可能多所以,大家都优先按\(c\),然后分析先后顺序即可

	#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<stack>#include<queue>#include<algorithm>#include<time.h>#include<random>#include<string>#include<string.h>#include<cctype>using namespace std;typedef long long ll;mt19937 rnd(time(0));const ll mod = 1e9 + 7;void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}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;}int main(){ll t;cin>>t;while(t--){ll a,b,c;cin>>a>>b>>c;//swap(b,c);ll j=c%2;if(j==0){if(a<=b){cout<<"Second"<<endl;}elsecout<<"First"<<endl;}else{if(b<=a){cout<<"First"<<endl;}elsecout<<"Second"<<endl;}}}

B. The Walkway

题目乍看比较繁琐且翻译有问题?

一个饼干店的有无只会影响周围饼干店到这个饼干店的途中的吃饼干次数
分类讨论下即可

	#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<stack>#include<queue>#include<algorithm>#include<time.h>#include<random>#include<string>#include<string.h>#include<cctype>using namespace std;typedef long long ll;mt19937 rnd(time(0));const ll mod = 1e9 + 7;void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}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 a[250000];ll b[250000];int main(){ll t;cin>>t;while(t--){ll n,m,d;cin>>n>>m>>d;for(ll i=0;i<=m;i++)b[i]=0;for(ll i=1;i<=m;i++){cin>>a[i];}ll op=0;ll k=0;ll ok=0;for(ll i=1;i<=m;i++){ll ans=0;ll cnt=0;if(i==1){if(a[i]==1){op=0;k=1;ok++;}else{ans=(a[i]-1-1)/d+2+((a[i+1]-1)-a[i])/d+1;cnt=(a[i+1]-1-1)/d+2;//cout<<ans<<" "<<cnt<<endl;ok+=(a[i]-1-1)/d+2;if(ans-cnt>op){op=ans-cnt;k=1;}else if(ans-cnt==op)k++;}}else if(i==m){ans=(a[i]-1-a[i-1])/d+1+(n-a[i])/d;cnt=(n-a[i-1])/d;ok+=ans;if(ans-cnt>op){op=ans-cnt;k=1;}else if(ans-cnt==op)k++;}else{ans=(a[i]-1-a[i-1])/d+1+(a[i+1]-1-a[i])/d+1;cnt=(a[i+1]-1-a[i-1])/d+1;ok+=(a[i]-1-a[i-1])/d+1;if(ans-cnt>op){op=ans-cnt;k=1;}else if(ans-cnt==op)k++;}}//	cout<<ok<<endl;cout<<ok-op<<" "<<k<<endl;}}

C. Yet Another Permutation Problem


优先考虑二倍递增,这样子一定gcd种类最多

	#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<stack>#include<queue>#include<algorithm>#include<time.h>#include<random>#include<string>#include<string.h>#include<cctype>using namespace std;typedef long long ll;mt19937 rnd(time(0));const ll mod = 1e9 + 7;void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}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 a[250000];int main(){ll t;cin>>t;while(t--){ll n;cin>>n;//map<ll,ll>q;set<ll>f;for(ll i=1;i<=n;i++){f.insert(i);}ll pd=0;for(ll i=1;i<=n;i++){if(pd==0){pd=*f.begin();a[i]=pd;	f.erase(pd);}else{while(pd<=n){pd*=2;if(f.find(pd)!=f.end()){a[i]=pd;f.erase(pd);break;}}if(pd>n){pd=*f.begin();a[i]=pd;f.erase(pd);}}}//cout<<f.size()<<endl;for(ll i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;}}

D. Trees and Segments

首先发现如果要求出\(a⋅l0+l1\)的最大值,并不是\(l0\)越大越好。所以考虑前缀求出每个\(l0\)对应的每个\(l1\)最大值
由于不能\((n^3)\),所以直接用前缀和后缀数组去维护从某个点(且有多少改变机会)出发后的最长冷杉长度。
于是最后暴力下\(l0\)对应的\(l1\)最大值,答案得解

	#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<stack>#include<queue>#include<algorithm>#include<time.h>#include<random>#include<string>#include<string.h>#include<cctype>using namespace std;typedef int ll;mt19937 rnd(time(0));const ll mod = 1e9 + 7;void fio(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}ll gcd(ll x, ll y){if (y == 0)return x;elsereturn gcd(y, x % y);}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 a[3500];ll b[3005][3005];ll c[3005][3005];int main(){ll t;cin>>t;while(t--){ll n,g;cin>>n>>g;string f;cin>>f;for(ll i=0;i<=n+1;i++){for(ll k=0;k<=g+1;k++){b[i][k]=0;c[i][k]=0;}}//cout<<99<<endl;for(ll i=0;i<=g;i++){ll sz=0;deque<ll>q;for(ll j=0;j<n;j++){if(q.empty()){q.push_back(j);if(f[j]=='0')sz++;while(sz>i){if(f[q.front()]=='0')sz--;b[q.front()][i]=max(b[q.front()][i],(ll)q.size()-1);q.pop_front();}}else{q.push_back(j);if(f[j]=='0')sz++;while(sz>i){if(f[q.front()]=='0')sz--;b[q.front()][i]=max(b[q.front()][i],(ll)q.size()-1);q.pop_front();}}if(!q.empty())b[q.front()][i]=max((ll)q.size(),b[q.front()][i]);}while(!q.empty()){b[q.front()][i]=max(b[q.front()][i],(ll)q.size());q.pop_front();}for(ll j=n-1;j>=0;j--)b[j][i]=max(b[j+1][i],b[j][i]);}for(ll i=0;i<=g;i++){ll sz=0;deque<ll>q;for(ll j=n-1;j>=0;j--){if(q.empty()){q.push_back(j);if(f[j]=='0')sz++;while(sz>i){if(f[q.front()]=='0')sz--;c[q.front()][i]=max(c[q.front()][i],(ll)q.size()-1);q.pop_front();}}else{q.push_back(j);if(f[j]=='0')sz++;while(sz>i){if(f[q.front()]=='0')sz--;c[q.front()][i]=max(c[q.front()][i],(ll)q.size()-1);q.pop_front();}}if(!q.empty())c[q.front()][i]=max((ll)q.size(),c[q.front()][i]);}while(!q.empty()){c[q.front()][i]=max(c[q.front()][i],(ll)q.size());q.pop_front();}for(ll j=1;j<=n-1;j++)c[j][i]=max(c[j-1][i],c[j][i]);}for(ll i=0;i<=n-1;i++){for(ll j=g;j>=1;j--){b[i][j]=max(b[i][j-1],b[i][j]);	c[i][j]=max(c[i][j],c[i][j-1]);}}//	cout<<b[0][0]<<endl;/*for(ll i=0;i<n;i++){for(ll j=0;j<=g;j++)cout<<b[i][j]<<" "<<c[i][j]<<endl;}*/pair<ll,ll>ans[5000];ll op=0;op=1;ans[op]={0,b[0][g]};//cout<<99<<endl;for(ll i=1;i<=n;i++){ll cnt=0;ll sz=0;ll u=0;ll pd=0;deque<ll>q;for(ll j=0;j<n;j++){q.push_back(j);if(f[j]=='1')sz++;while(sz>g){if(f[q.front()]=='1')sz--;q.pop_front();}while((ll)q.size()>i){if(f[q.front()]=='1')sz--;q.pop_front();}if(q.size()==i){pd=1;if(q.front()==0&&q.back()==n-1)u=max(u,0);else if(q.front()==0)u=max(u,b[q.back()+1][g-sz]);else if(q.back()==n-1)u=max(u,c[q.front()-1][g-sz]);elseu=max({u,b[q.back()+1][g-sz],c[q.front()-1][g-sz]});}}if(pd){op++;ans[op]={i,u};}}//cout<<55<<endl;for(ll i=1;i<=n;i++){ll u=0;for(ll j=1;j<=op;j++){ll x=ans[j].first;ll y=ans[j].second;u=max(u,i*x+y);}cout<<u<<" ";}cout<<endl;}}

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

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

相关文章

细胞大小,真核细胞直径平均: 3~30μm;

细胞大小 1毫米=1000微米, 1微米=1000纳米, 1毫米=1000000纳米。 单位有毫米(mm)、微米(μm)、纳米(nm) 。细胞的大小是细胞的重要特征,各类细胞的大小是有一定规律的。一般来说,原核细胞直径平均: 1~10μm; 真核细胞直径平均: 3~30μm; 某些不同来源的细胞大小变…

Spring基础

一、什么是 Spring 框架?Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的开发效率以及系统的可维护性。  我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inversion…

《使用Gin框架构建分布式应用》阅读笔记:p77-p87

《用Gin框架构建分布式应用》学习第5天,p77-p87总结,总计11页。 一、技术总结 1.Go知识点 (1)context 2.on-premises software p80, A container is like a separate OS, but not virtualized; it only contains the dependencies needed for that one application, which ma…

排序算法 - 快速排序

排序算法 - 快速排序概要快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序是一种基于分而治之的排序算法。它的基本思想是: 选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法…

学习groovy基础

简介 Groovy 是一种 JVM 语言,它可以编译与 Java 相同的字节码,然后将字节码文件交给 JVM 去执行,并且可以与 Java 无缝地互操作,Groovy 可以透明地与 Java 库和代码交互,可以使用 Java 所有的库。 Groovy 也可以直接将源文件解释执行 它还极大地清理了 Java 中许多冗长的…

高级语言程序设计第三次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 学号:102400127 姓名:王子涵 4.8q2 打印引号的时候一开始忘了 然后在写d小题的时候宽度不知道怎么处理 后来询问了同学解决…

计量经济学(十)——正态性检验(Normality Test)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 正态性检验(Normality Test)是一种用于判断数据是否服从正态分布的重要统计方法,广泛应用于时间序列分析、回归分析等模型的构建与诊断中。许多统计模型,…

Response web登录操作 -2024/10/17

响应行设置响应状态码: void setStatus(int sc);设置响应头键值对: void setHeader(String name,String value);response实现重定向resp.setStatus(302);resp.setHeader("location","https://www.4399.com");前端a.html登录,将结果传给后端,用request接收…