A - Equally

显然分组情况一定是\(1+1+1\)或\(1+2\),直接判定即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
signed main(){
cin>>a>>b>>c;
if((a+b==c)||(a+c==b)||(b+c==a)||(a==b&&b==c)) cout<<"Yes\n";
else cout<<"No\n";
return 0;
}

B - Santa Claus 1

照题意模拟即可。

点击查看代码
#include<bits/stdc++.h>
#define N 110
using namespace std;
int n,m,x,y,cnt;
string s[N],t;
bitset<N> vis[N];
signed main(){
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
cin>>s[i];
s[i]=' '+s[i];
}
cin>>t;
for(int i:t){
int xx=x,yy=y;
if(i=='U') xx--;
else if(i=='D') xx++;
else if(i=='L') yy--;
else yy++;
if(xx<1||yy<1||xx>n||yy>m||s[xx][yy]=='#') continue;
x=xx,y=yy;
if(s[x][y]=='@'&&!vis[x][y]) vis[x][y]=1,cnt++;
}
cout<<x<<" "<<y<<" "<<cnt<<"\n";
return 0;
}

C - Illuminate Buildings

DP,设\(f[i][j]\)为以\(i\)为结尾,上一个位置是\(i-j\)的答案数。

初始\(f\)全为\(1\),转移显然有\(f[i][j]=\max(f[i][j],f[i-j][j]+1)\),其中\(j\in [1,i]\)且\(a[i-j]=a[i]\)。

时间复杂度\(O(n^2)\)。

点击查看代码
#include<bits/stdc++.h>
#define N 3010
using namespace std;
int n,a[N],f[N][N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
int k=i-j;
if(k&&a[i]!=a[k]) continue;
f[i][j]=max(f[i][j],f[k][j]+1);
}
}
int ans=-514;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ans=max(ans,f[i][j]);
cout<<ans<<"\n";
return 0;
}

D - Santa Claus 2

对线段上的点容斥不好考虑,可以反过来依次考虑每个房子是否在一个线段上。

显然可以单独考虑行和列,用set分别维护 每一行中横向线段每一列中竖向线段 的连通性,对于每个房子,依次在行和列上判断是否位于一个线段中即可。

时间复杂度\(O((n+m)\log^2 n)\)(其中一个\(log\)是map的,换用哈希表可以去掉)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 200010
#define M 200010
using namespace std;
struct House{int x,y;}a[N];
map<int,multiset<pair<int,int>>> hor,ver;
int n,m,sx,sy,num[256],ans;
void merge(map<int,multiset<pair<int,int>>>& ma){//求线段并
for(auto &i:ma){
auto &se=i.second;
se.insert({LLONG_MIN,LLONG_MIN});
for(auto j=++se.begin(),k=j;j!=se.end();j++){
k=j,k--;
if(k->second>=j->first){
pair<int,int> tmp={k->first,max(k->second,j->second)};
se.erase(j),se.erase(k);
j=se.insert(tmp);
}
}
}
}
bool solve(multiset<pair<int,int>>& se,int v){
if(se.empty()) return 0;
auto it=--se.upper_bound({v,LLONG_MAX});
return it->second>=v;
}
signed main(){
num['U']=0,num['R']=1,num['D']=2,num['L']=3;
cin>>n>>m>>sx>>sy;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
for(int i=1,c;i<=m;i++){
char d;
cin>>d>>c;
int xx=sx,yy=sy;
if(num[1*d]&1){
if(d=='L') sx-=c,hor[sy].insert({sx,xx});
else sx+=c,hor[sy].insert({xx,sx});
}else{
if(d=='U') sy+=c,ver[sx].insert({yy,sy});
else sy-=c,ver[sx].insert({sy,yy});
}
}
merge(hor),merge(ver);
for(int i=1;i<=n;i++)
ans+=(solve(hor[a[i].y],a[i].x)||solve(ver[a[i].x],a[i].y));
cout<<sx<<" "<<sy<<" "<<ans<<"\n";
return 0;
}

set代替multiset也是可以的,反正重复的线段就算作一条了。

E - Snowflake Tree

可以发现,确定中心点\(u\)以及\(x\)后,此时雪花树的顶点个数也就确定了,为\((\min\limits_{v} \deg(v))\times x+1\),其中\(v\)是与\(u\)邻接的点。

我们要最大化上面这个式子。

因此我们可以枚举中心点,根据贪心的思想,我们将\(\deg(v)\)从大到小排序,对于确定的\(x\),我们构建出的雪花树的第二层节点,就是排序后的前\(x\)个节点。

时间复杂度\(O(n\log n)\)。

点击查看代码
#include<bits/stdc++.h>
#define N 300010
#define int long long
using namespace std;
int n,deg[N],ans=LLONG_MIN;
vector<int> G[N],a;
signed main(){
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
G[u].emplace_back(v),G[v].emplace_back(u);
deg[u]++,deg[v]++;
}
for(int i=1;i<=n;i++){
a.clear();
for(int j:G[i]) a.emplace_back(deg[j]);
sort(a.begin(),a.end(),[](int a,int b){return a>b;});
int minn=LLONG_MAX,cnt=0;
for(int j:a){
minn=min(minn,j),cnt++;
ans=max(ans,minn*cnt+1);
}
}
cout<<n-ans<<"\n";
return 0;
}

F - Visible Buildings

结论:将相邻的两个建筑顶部连直线,所有直线中截距的最大值与\(0\)取\(\max\)即为答案。

证明:(如果不相邻答案一定不优)

如下图,假设两个建筑之间还有一个建筑(黄色),则根据它与绿色直线的位置关系进行讨论:



不难发现,无论它在绿色直线的上方还是下方,我们总能把它与相邻的建筑进行连线,使得新直线的截距更大。所以如果两建筑不相邻,考虑它们一定不会让答案更优。

时间复杂度\(O(n)\)。

注意:

  • 所有截距都\(<0\)时需要输出\(-1\),此时不能保留小数,否则会判错。
  • 求截距需要用到除法,判断负数坐标可能有精度误差,应当直接考虑被除数与除数的关系,以直接判定商的正负性。

    经测试,直接使用除法不会出现问题。
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define double long double
#define N 300010
using namespace std;
int n,x[N],y[N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
double ans=-1e18;
for(int i=1;i<n;i++){
double yy=-1.0*(y[i]*x[i+1]-x[i]*y[i+1])/(x[i]-x[i+1]);
ans=max(ans,yy);
}
if(ans<0) cout<<"-1\n";
else cout<<fixed<<setprecision(15)<<ans<<"\n";
return 0;
}

[题解]AtCoder Beginner Contest 385(ABC385) A~F的更多相关文章

  1. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

  2. 【AtCoder Beginner Contest 181】A~F题解

    越学越菜系列 于2020.11.2,我绿了(错乱) A - Heavy Rotation 签到题,奇数Black,偶数White. code: #include<bits/stdc++.h> ...

  3. AtCoder Beginner Contest 127 D,E,F

    D Integer Cards 题意:先给出n个数字,然后可以有m次操作,每次操作以数字对(x,y)表示最多能选x个数字把它变成y,问经历m次操作后n个数字和最大为多少? 解法:一个明显正确的做法是: ...

  4. [题解] Atcoder Beginner Contest ABC 270 G Ex 题解

    点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...

  5. [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT

    题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...

  6. AtCoder Beginner Contest 238 A - F 题解

    AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...

  7. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  8. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  9. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  10. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

随机推荐

  1. Microsoft 赋能企业应用开发者:无缝集成AI,无需转变编程语言

    在当前的技术浪潮中,Microsoft 针对企业级应用开发领域提出了一项新的见解,打破了关于AI.机器学习(ML)与Java之间的固有神话.作为Java或.NET企业级应用的开发者,您无需转换阵地或深 ...

  2. 最快的流媒体服务器搭建 smart_rtmpd

    说明 流媒体服务器是一个很专业的名词,对于圈外人来说,可能显得比较高深.但是日常应用中还是经常需要用到它,搭建流媒体服务器需要了解各种名词,系统,环境配置,使用方法,使用流程.这让很多圈外人感觉无从下 ...

  3. Keil watch中数据不更新解决办法

    watch数据不更新解决办法 在使用keil的watch窗口观察寄存器里面的值进行调试时,有时候里面的值就是不会更新,经测试打开View中最下面的那个按键即可

  4. MyBatisPlus笔记(高级)

    MyBatisPlus(高级) 作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 MyBatisPlus(高级) 说明: 相关连接: 慕课入门视频: 入门文章: 本文对应进阶视频: 整合的gi ...

  5. 图解JavaScript原型:原型链及其分析 | JavaScript图解

    忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指 ...

  6. HyperWorks批处理网格的类型设置

    网格类型设置(Configuration Tab) HyperWorks中BatchMesher 的 Configuration Tab 向用户提供了网格方案类型(Mesh Type)的选择.一个典型 ...

  7. 长亭雷池WAF(safeline)社区版安装教程

    雷池WAF的技术文档,并不包含 Docker 和 Docker Compose V2 安装文档,更新记录一下,共同学习,共同进步 配置需求 操作系统:Linux 指令架构:x86_64 软件依赖:Do ...

  8. ET6.0运行Demo和工具使用

    环境:Mac + Rider + ET6.0 一:运行Demo 1:下载ET6.0,get:https://github.com/egametang/ET 2:下载.net core 5.0.ET6. ...

  9. .NET周刊【6月第5期 2025-06-29】

    国内文章 为什么说方法的参数最好不要超过4个? https://www.cnblogs.com/lmy5215006/p/18919081 本文探讨了调用协定的概念,包括参数传递方式.栈清理和寄存器使 ...

  10. leetcode 92 翻转链表 II

    简介 直接使用reverse, 进行值的替换, 链表翻转实在是太烦了 code class Solution { public: ListNode* reverseBetween(ListNode* ...