トヨタ自動車プログラミングコンテスト2024#7(ABC 362)

news/2024/9/19 15:41:53/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18301064

非常好名次,使我的 \(1\) 旋转

四发罚时应该是这次比赛最唐的东西了,没有就进前一千了

A.Buy a Pen

特判秒了,懒得打三种 ans=,所以就把不能选的那个赋值成无穷大了

#include<bits/stdc++.h>
using namespace std;
#define speed ios::sync_with_stdio(false);
#define tests int cases;cin>>cases;while(cases--)
int main(){speedint a,b,c;cin>>a>>b>>c;string x;cin>>x;if(x=="Red") a=101;if(x=="Green") b=101;if(x=="Blue") c=101;cout<<min({a,b,c})<<endl;
}

B.Right Triangle

讲个好玩的,这个题需要求两点 \((x_1,y_1),(x_2,y_2)\) 之间的坐标,然后我先是写了个这个

dis[1]=sqrt(x[1]*x[1]+y[1]*y[1]);

后面求勾股定理的时候发现好像不对,这好像是勾股定理,所以改成下面这样:

dis[1]=sqrt((x[1]-x[2])*(y[1]-y[2]));

这玩意 re 了,我也没干别的,唯一想到的就是给负数开根了,一看果然是负的...

#include<bits/stdc++.h>
using namespace std;
#define speed ios::sync_with_stdio(false);
#define tests int cases;cin>>cases;while(cases--)
const double eps=1e-8;
int main(){speedint x[4],y[4];cin>>x[1]>>y[1]>>x[2]>>y[2]>>x[3]>>y[3];double dis[4];dis[1]=sqrt((x[1]-x[2])*(x[1]-x[2])+(y[1]-y[2])*(y[1]-y[2]));dis[2]=sqrt((x[2]-x[3])*(x[2]-x[3])+(y[2]-y[3])*(y[2]-y[3]));dis[3]=sqrt((x[3]-x[1])*(x[3]-x[1])+(y[3]-y[1])*(y[3]-y[1]));
//	cout<<dis[1]<<" "<<dis[2]<<" "<<dis[3]<<endl;if(dis[3]<dis[1]) swap(dis[3],dis[1]);if(dis[3]<dis[2]) swap(dis[3],dis[2]);if(abs(dis[1]*dis[1]+dis[2]*dis[2]-dis[3]*dis[3])<=eps) cout<<"Yes"<<endl;else cout<<"No"<<endl;'
}

还有一个就是 eps 的问题,这个题刻意卡了直接判等,handmade 测试点会全 WA,不过我恰好改一次都改对了,所以没吃第二发罚时

C.Sum = 0

稍微有点意思,首先算出所有左边界的和,再算出所有右边界的和,注意到左边界一定是最小的和,而右边界一定是最大的,因此有解的充要条件应为 \(min\le 0,max\ge 0\)

然后就再扫一遍,从最大的和中减掉(每次都改一个右边界为左边界),如果当前最大和减不动了,那就把它减到 \(0\) 输出,后面的正常输出右边界即可.

#include<bits/stdc++.h>
using namespace std;
#define speed ios::sync_with_stdio(false);
#define tests int cases;cin>>cases;while(cases--)
const double eps=1e-8;
#define int long long
int n;
int l[200001],r[200001];
int maxn,minn;
signed main(){speed cin>>n;for(int i=1;i<=n;++i){cin>>l[i]>>r[i];maxn+=r[i];minn+=l[i];}if(maxn<0 or minn>0){cout<<"No"<<endl;return 0;}cout<<"Yes"<<endl;for(int i=1;i<=n;++i){if(maxn>0){if(maxn>=(r[i]-l[i])){maxn-=r[i]-l[i];cout<<l[i]<<" ";}else{cout<<r[i]-maxn<<" ";maxn=0;}}else if(maxn==0){cout<<r[i]<<" ";}}
}

D.Shortest Path 3

DIJ 版本的考试题,和我考试打的那份错解一个思路

#include<bits/stdc++.h>
using namespace std;
#define int long long
int cnt;
int n,m,x;
int a[500000];
struct shabicth{int q,dat;bool operator < (const shabicth &a) const{return dat>a.dat;}
};
struct node{int to,w,next;
}edge[600000];
int head[200010];
bool f[200100];
int dis[200010];
int sum[2000];
int sbcth[7000][3];
void add(int u,int v,int w){edge[++cnt].next=head[u];edge[cnt].to=v;edge[cnt].w=w;head[u]=cnt;
}
void dij(int s){priority_queue<shabicth> qq;int x,y;shabicth cc;cc.q=s;cc.dat=a[s];qq.push(cc);memset(dis,0x7f,sizeof(dis));memset(f,0,sizeof(f));dis[s]=a[s];while(!qq.empty()){x=qq.top().q;y=qq.top().dat;qq.pop();if(!f[x]){f[x]=true;for(int i=head[x];i;i=edge[i].next){cc.q=edge[i].to;if(!f[cc.q]&&dis[cc.q]>y+edge[i].w+a[cc.q]){dis[cc.q]=y+edge[i].w+a[cc.q];cc.dat=dis[cc.q];qq.push(cc);}}}}
}
signed main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];dis[i]=a[i];}for(int i=1;i<=m;i++){int x,y,num;cin>>x>>y>>num;add(x,y,num);add(y,x,num);}dij(1);for(int i=2;i<=n;i++) cout<<dis[i]<<' ';
}

E.Count Arithmetic Subsequences

窝太菜辽,想了半条才明白 Arithmetic Subsequences 是等差数列的意思

日文阅读理解

上の解法は更に高速化することができます.以下の状態を持つ DP を考えます.

\(dp[i][l][d]=\) 初項 \(A_i\),長さ \(l(l≥2)\),公差 \(d\) であるような等差数列の個数

\(i\) の降順に見ていき,初項 \(A_i\) を固定します.第 \(2\)\(A_j\ (i<j)\) と長さ \(l\) を全探索します.このとき,公差は \(d=A_j−A_i\) と定まります. \(l=2\) の場合は (\(A_i,A_j\) ) が長さ \(2\) の等差数列なので, \(dp[i][2][d]\)\(1\) を足します. \(l≥3\) の場合,初項 \(A_i\) ,長さ \(l\),公差 \(d\) の等差数列は,初項 \(A_j\) ,長さ \(l−1\),公差 \(d\) の等差数列の先頭に \(A_i\) を追加したものとなっています.よって, \(dp[i][l][d]\)\(dp[j][l−1][d]\) を足します.

公差 \(d\)\(10^9\) 程度の大きな値を取りうるため,\(d\) に関する添字は連想配列で持てばよいです.C++ で map を使用した場合,時間計算量は \(O(N^3logN)\) となります.

または,各 \(i\) についてあり得る公差をあらかじめ列挙して座標圧縮しておけば,\(d\) に関する添字を配列で持つことができます.この場合,時間計算量は \(O(N^3)\) です.

没用翻译读懂了,大概就是开一个 DP 记录出项,长度,公差三个参数,这样就能唯一确定一个等差数列,再用 map 判重.

赛时差不多打出来了,因为这个题 \(n\) 只有 \(80\),赛时打的时候我是考虑枚举等差数列前两项,然后利用公差扫一遍后面的数,统计答案就行了.

此外 \(ans_{1}=n,ans_{2}=\frac{n\times (n-1)}{2}\)

G.Count Substring Query

没想到考了 AC 自动机板子题,板子不会打就偷了一份

后记

谴责一款强迫我看日文题解的网站

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

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

相关文章

领域驱动设计:CQRS 和事件源的强大功能

CQRS/ES 如何重新定义构建可扩展系统。 在过去的 15 年里,我一直在深入研究领域驱动设计 (DDD),每一步都在学习和改进。我一直很好奇,尤其是当你深入挖掘时,简单的客户请求会变得更加复杂。我特别感谢EventStorming这样的工具,它帮助揭示看似简单需求背后的真实流程和事件…

k8s简介

一、K8S 概览 1)K8S 是什么? K8S 是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白话就是:“K8S 是负责自动化运维管理多个跨机器 Docker 程序的集群”。 2) K…

flutter Error: unable to locate asset entry in pubspec.yaml: assets/fonts/Lato-Regular.ttf

在pubspec.yaml中添加font的时候出现这个问题 发现是因为我放的文件夹不对,需要放在根目录下(但是我不知道为什么android studio里没有显示一些文件夹) 本来放在这里 一直不对后来在文件夹找了一下放到lib里 新建了assets文件夹

详解工单系统

工单系统在人类早期的行为活动中就一直存在的理念,是人类关于工作流程的管理和记录。随着计算机软件的不断发展,工单系统由线下转为线上,提升了问题传达的准确性、处理效率以及数据的长久留痕可追溯等,应用领域也日渐广泛。本文将着重介绍工单的概念、不同领域工单系统简介…

Vue 3 后端错误消息处理范例

前端如何存储处理后端返回的错误信息,并按不同来源绑定到页面,例如显示在不同输入框的周围。这样即可实现清晰的错误显示。1. 错误消息格式 前后端消息传递时,我们可以通过 json 的 errors 字段传递错误信息,一个比较好的格式范例为: {errors: {global: ["网络错误&q…

OpenDiary 24.7

致敬传奇耐拖王现在是,7 月 13 日。距离上一次写日记过去了 58 天 致敬传奇耐拖王 xiwon那么,在鼠鼠肘赢牢大之前的这段时间,what happened, on earth?五月下旬,前去了西安邀请赛,打的一坨。回来之后写了一点游记,但是居然还没有写完 那么到底为什么没有写完呢?这要从很…

我用cpca 截取地址中的省市区,突然就乱了,这是什么原因

大家好,我是Python进阶者。 一、前言 前几天在Python钻石交流群【逆光】问了一个Python数据处理的问题,问题如下:请问一下 我用cpca 截取地址中的省市区,突然就乱了,这是什么原因? 二、实现过程 这里【瑜亮老师】给了个思路如下:看着好像是行弄乱了。 【不上班能干啥!】…

k8s字段选择器

目录一、概述二、基本语法三、支持的字段1、错误示例2、支持的字段列表四、支持的操作符1、示例五、跨多种资源类型使用字段选择器 一、概述 在Kubernetes中,字段选择器(Field Selectors)和标签选择器(Label Selectors)是两种不同的查询机制,用于过滤和选择特定的资源。字…

three.js+vue污水处理厂数字孪生平台智慧城市web3d

案例效果截图如下: 主场景三维逻辑代码如下:<template><div class="whole"><!-- threejs画布 --><div id="threejs" ref="threejs"></div><!-- 污水厂模型加载进度条 --><a-progress:stroke-color=&quo…

反射DLL注入原理解析

反射 DLL 注入又称 RDI,与常规 DLL 注入不同的是,它不需要 LoadLibrary 这个函数来加载 dll,而是通过 DLL 内部的一个函数来自己把自己加载起来,这么说可能会有一点抽象,总之这个函数会负责解析DLL文件的头信息、导入函数的地址、处理重定位等初始化操作,先不用理解这个函…