gym103117J. Ants

gym103117J. Ants

题意:

n个蚂蚁在长度为1e9+1的木棍上,第i个蚂蚁在ai位置上,朝向为0/1(0表示左,1表示右),如果蚂蚁相遇则彼此调转方向。木棍两侧分别有厚度为a和b的墙,蚂蚁每撞一次墙,墙的厚度就会减1,当墙撞没时,蚂蚁就会直接掉下去,问最后一个蚂蚁掉下去的时间?

题解:

模拟题
有几点注意:

  1. 蚂蚁相遇调转方向可以相当于方向没变
  2. 一个蚂蚁需要撞两次墙才能回到原先的位置(墙没撞开),相当于周期为2len,每个周期,每只蚂蚁会对两侧的墙各撞一次
  3. 所以我们可以将前面整数个周期都算完,最后就剩下一轮,直接模拟完事

思路很简单,但是最后一轮的模拟很麻烦,我和队友调了4个小时才改出来,但是发现网上有很多简易的方法
我们用两个队列分别存向左向右的蚂蚁,每次取出两个队列首的元素,比较两个元素谁离端点更近,更近的会先撞墙,然后掉头,加入另一个队列中,直到墙撞开

代码:


const int N = 2e6 + 5;int n, a, b, p[N], d[N], L = 1e9 + 1;LL s, ans; LL q1[N], q2[N];
int hh = 1, tt, h = 1, t;void inline work1() {LL u = q1[hh++];if (a) {a--;q2[++t] = u + L;}else {ans=max(ans,u); }
}void inline work2() {LL u = q2[h++];if (b){b--;q1[++tt] = u + L;} else {ans=max(ans, u);}
}int main() {read(n), read(a), read(b);for (int i = 1; i <= n; i++) read(p[i]);for (int i = 1; i <= n; i++) read(d[i]);LL tmp = min(a, b) / n;a -= n * tmp, b -= tmp * n;s = tmp * L * 2;for (int i = 1; i <= n; i++)if (d[i] == 0) q1[++tt] = p[i];//左 for (int i = n; i; i--)if (d[i] == 1) q2[++t] = L - p[i];//右 while (hh <= tt || h <= t) {if (h > t || (hh <= tt && q1[hh] < q2[h])) work1();//左边先到 else work2();}printf("%lld\n", ans + s);return 0;
}

我和队友的代码:
就是纯模拟,讨论四种情况

// Problem: Ants
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/17624/J
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC target("avx")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
// created by myq
#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef pair<int, int> pii;
const int N= 1000010;
const int mod= 998244353;
#define int long long
int a[N];
int d[N];
int n, l, r;
signed main()
{ios::sync_with_stdio(0);cin >> n >> l >> r;int len= 1e9 + 1;int j= 0;for (int i= 1; i <= n; i++) {cin >> a[i];}int lcnt= 0;int rcnt= 0;int res1= 0;int res2= 0;for (int i= 1; i <= n; i++) {cin >> d[i];if (!d[i])lcnt++, res1= max(res1, a[i]);elsercnt++, res2= max(res2, len - a[i]);}int tt= min(l / n, r / n);int res= 0;res+= 2 * len * tt;l-= tt * n;r-= tt * n;if (l < lcnt && r < rcnt) {// if (n == 11)// cout << 1 << endl;vector<int> vv;vector<int> vv2;for (int i= 1; i <= n; i++)if (d[i])vv2.push_back(len - a[i]);for (int i= 1; i <= n; i++)if (!d[i])vv.push_back(a[i]);int L= (l == 0 ? (vv.size() ? vv.back() : 0) : vv[l - 1] + len);int R= (r == 0 ? (vv2.size() ? vv2[0] : 0) : vv2[(int)vv2.size() - r] + len);res+= max(L, R);}else if (l < lcnt && r >= rcnt) {// if (n == 11)// cout << 2 << endl;r-= rcnt;vector<int> vv;vector<int> vv2;for (int i= 1; i <= n; i++)if (d[i])vv2.push_back(len - a[i]);for (int i= 1; i <= n; i++)if (!d[i])vv.push_back(a[i]);if (l) {int tmp= vv[l - 1] + len;int tmp2= 0;int tmp3= 0;if (rcnt) {tmp2+= vv2[0] + len;}if (r) {int tr= min(r, l);tmp3= vv[tr - 1] + 2 * len;}res+= max({tmp, tmp2, tmp3});}else {res+= max((vv2.size() ? vv2[0] + len : 0ll), vv.back());}}else if (l >= lcnt && r < rcnt) {// if (n == 11)// cout << 3 << endl;vector<int> vv;vector<int> vv2;l-= lcnt;for (int i= 1; i <= n; i++)if (d[i])vv2.push_back(len - a[i]);for (int i= 1; i <= n; i++)if (!d[i])vv.push_back(a[i]);if (r) {int tmp= 0;int tmp2= vv2[vv2.size() - r] + len;int tmp3= 0;if (lcnt) {tmp+= vv.back() + len;}if (l) {int tr= min(l, r);tmp3= 2 * len + vv2[vv2.size() - tr];}res+= max({tmp3, tmp, tmp2});}else {res+= max((vv.size() ? len + vv.back() : 0ll), vv2[0]);}}else if (l >= lcnt && r >= rcnt) {// if (n == 11)// cout << 4 << endl;res+= len;l-= lcnt;r-= rcnt;lcnt= 0;rcnt= 0;// if(n==87)// cout<<res<<endl;for (int i= 1; i <= n; i++) {a[i]= len - a[i];d[i]^= 1;if (!d[i])lcnt++;elsercnt++;}if (l < lcnt && r < rcnt) {// if (n == 11) {// cout << 41 << endl;// cout << l << " " << r << endl;// cout << lcnt << " " << rcnt << endl;// }vector<int> vv;vector<int> vv2;for (int i= 1; i <= n; i++)if (d[i])vv2.push_back(len - a[i]);for (int i= 1; i <= n; i++)if (!d[i])vv.push_back(a[i]);reverse(vv.begin(), vv.end());reverse(vv2.begin(), vv2.end());// sort(vv.begin(), vv.end());// sort(vv2.begin(), vv2.end(), greater<int>());// if(n==87)// cout<<vv[l-1]+len<<" "<< vv2[(int)vv2.size() - r] + len<<" "<<vv.back()<<" "<<vv2[0]<<endl;int L= (l == 0 ? (vv.size() ? vv.back() : 0) : vv[l - 1] + len);int R= (r == 0 ? (vv2.size() ? vv2[0] : 0) : vv2[(int)vv2.size() - r] + len);res+= max(L, R);}else if (l < lcnt && r >= rcnt) {// if (n == 11)// cout << 42 << endl;r-= rcnt;vector<int> vv;vector<int> vv2;for (int i= 1; i <= n; i++)if (d[i])vv2.push_back(len - a[i]);for (int i= 1; i <= n; i++)if (!d[i])vv.push_back(a[i]);reverse(vv.begin(), vv.end());reverse(vv2.begin(), vv2.end());if (l) {// if(n==59)// cout<<l<<" "<<r<<" "<<lcnt<<" "<<rcnt<<endl;int tmp= vv[l - 1] + len;int tmp2= 0;int tmp3= 0;if (rcnt) {tmp2+= vv2[0] + len;}if (r) {int tr= min(r, l);tmp3= vv[tr - 1] + 2 * len;}res+= max({tmp, tmp2, tmp3});}else {res+= max((vv2.size() ? vv2[0] + len : 0ll), vv.back());}}else if (l >= lcnt && r < rcnt) {if (n == 11)cout << 43 << endl;vector<int> vv;vector<int> vv2;l-= lcnt;for (int i= 1; i <= n; i++)if (d[i])vv2.push_back(len - a[i]);for (int i= 1; i <= n; i++)if (!d[i])vv.push_back(a[i]);reverse(vv.begin(), vv.end());reverse(vv2.begin(), vv2.end());if (r) {int tmp= 0;int tmp2= vv2[vv2.size() - r] + len;int tmp3= 0;if (lcnt) {tmp+= vv.back() + len;}if (l) {int tr= min(l, r);tmp3= 2 * len + vv2[vv2.size() - tr];}res+= max({tmp3, tmp, tmp2});}else {res+= max((vv.size() ? len + vv.back() : 0ll), vv2[0]);}}}cout << res << endl;return 0;
}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/

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

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

相关文章

Asp.Net Core Docker镜像更新系统从wheezy改为stretch

之前写过一个在Asp.Net Core里调用System.Drawing.Common绘图的DEMO&#xff0c;部署到Docker里运行&#xff0c;需要更新Asp.Net Core镜像的操作系统。https://www.cnblogs.com/sunnytrudeau/p/9384620.html当时用的阿里云的源RUN echo "deb http://mirrors.aliyun.com/d…

Monster Hunter(2020南京M)

Monster Hunter(2020南京M) 题意&#xff1a; 给你一颗树&#xff0c;树上每个节点都是一个hpi 血量的怪物。打败每个怪物所需要的能量值为hpi 所 有 存 活 的 直 接 子 节 点 的 hpj 。每次必须要消灭父节点后才能消灭子节点。此外你还有m个魔咒&#xff0c;每个魔咒可以不…

网络数据采集(AngleSharp)-使用AngleSharp做html解析

有这么一本Python的书: <<Python 网络数据采集>>我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: https://anglesharp.github.io/(文章的章节书与该书是对应的)发送Http请求在python里面这样发送http请求, 它使用的是pytho…

ASP.NET Core在Azure Kubernetes Service中的部署和管理

目标部署&#xff1a;掌握将aspnetcore程序成功发布到Azure Kubernetes Service&#xff08;AKS&#xff09;上管理&#xff1a;掌握将AKS上的aspnetcore程序扩容、更新版本准备工作注册 Azure 账户官网免费帐户Azure 免费帐户仅适用于新用户&#xff0c;并且仅限每个客户一个免…

P4342 [IOI1998]Polygon

P4342 [IOI1998]Polygon 题意&#xff1a; 给你一个n个点的环&#xff0c;第一步&#xff0c;删除其中一条边。随后每一步&#xff1a; 选择一条边连接的两个顶点V1和V2&#xff0c;用边上的运算符计算V1和V2得到的结果来替换这两个顶点。 游戏结束时&#xff0c;只有一个顶点…

三元环讲解

参考文章&#xff1a; 不常用的黑科技——「三元环」 引入 给定一张无重边&#xff0c;无自环的无向图&#xff0c;点数为n&#xff0c;边数为m&#xff0c;且n&#xff0c;m同阶&#xff0c;问有多少个无序三元组(i,j,k),使得存在&#xff1a; 有一个连接i&#xff0c;j的边…

深入研究 Mini ASP.NET Core,看看 ASP.NET Core 内部到底是如何运行的

几年前&#xff0c;Artech 老师写过一个 Mini MVC&#xff0c;用简单的代码告诉读者 ASP.NET MVC 内部到底是如何运行的。当时我研究完以后&#xff0c;受益匪浅&#xff0c;内心充满了对 Artech 老师的感激&#xff0c;然后用我自己理解的 MVC 知识&#xff0c;写了一篇 深入研…

Cities(2020昆明C)

Cities(2020昆明C) 题意&#xff1a; 给定长度为n的序列a[]&#xff0c;一次操作你可以选择一个数值相同的连续区间&#xff0c;将这个区间的数值修改为其他数。 问多少进行多少次操作能使得区间所有数相同。 n<5000&#xff0c;每种a[i]最多出现15次 题解&#xff1a; …

一文读懂Asp.net core 依赖注入(Dependency injection)

一、什么是依赖注入首先在Asp.net core中是支持依赖注入软件设计模式&#xff0c;或者说依赖注入是asp.net core的核心&#xff1b;依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IOC&#xff09;基本是一个意思&#xff0c;因为说起来谁都离不开谁&#xff1b;或者…

P4619 [SDOI2018]旧试题

P4619 [SDOI2018]旧试题 题意&#xff1a; 求个式子&#xff1a; (∑i1A∑j1B∑k1Cd(i∗j∗k))mod(1097)(\sum_{i1}^{A}\sum_{j1}^{B}\sum_{k1}^{C}d(i*j*k))mod(10^97)(i1∑A​j1∑B​k1∑C​d(i∗j∗k))mod(1097) 题解&#xff1a; 原创博文1k纪念 很明显&#xff0c;莫比…

C#中使用Bogus创建模拟数据

原文&#xff1a;CREATING SAMPLE DATA FOR C#[1] 作者&#xff1a;Bruno Sonnino 译文&#xff1a;C#中使用Bogus创建模拟数据 译者&#xff1a; Lamond Lu背景在我每次写技术类博文的时候&#xff0c;经常做的一件事就是创建模拟数据。在每篇博文中&#xff0c;为了解释某些概…

CF1253E Antenna Coverage

CF1253E Antenna Coverage 题意&#xff1a; 现在有n个点&#xff0c;每个点的坐标为xi&#xff0c;以及一个范围值si&#xff0c;可以覆盖左右范围[xi-si,xisi] 每次操作&#xff0c;可以花费代价1让第i个天线的si增加1&#xff0c;每个天线都可以进行多次操作。现在请问你最…

使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

其实TCP测试的工具有很多&#xff0c;那BeetleX工具所提供的特点又是什么呢&#xff1f;如果你需数十万的请求或模拟上百万的设备连接&#xff0c;那这个工具相信可以满足你的需要&#xff01;工具是基于BeetleX的基础功能扩展&#xff0c;支持多IP绑定可以轻松实现上百万的cli…

.net core Entity Framework 与 EF Core

重点讲 Entity Framework Core &#xff01;&#xff08;一&#xff09;Entity Framework它是适用于.NET 的对象关系映射程序 (ORM)&#xff0c;现在的EF6已经是久经沙场&#xff0c;并经历重重磨难&#xff0c;获得一致认可的数据访问技术&#xff08;原来加 Title 也挺有意思…

CF1253F Cheap Robot

CF1253F Cheap Robot 题意&#xff1a; 给你一张 N 个点的带权无向连通图&#xff0c;其中结点 1,2,…,k 为充电中心。 一个机器人在图中行走&#xff0c;假设机器人的电池容量为 c&#xff0c;则任何时刻&#xff0c;机器人的电量 x 都必须满足 c0≤x≤c。如果机器人沿着一…

牛客练习赛55E树

牛客练习赛55E树 题意&#xff1a; 你有一颗大小为n 的树&#xff0c;点从 1 到 n 标号。 设dis(x,y)表示 x 到 y 的距离。 求∑i1n∑j1ndis2(i,j)\sum_{i1}^{n}\sum_{j1}^{n}dis^2(i,j)∑i1n​∑j1n​dis2(i,j)对998244353取模的结果 题解&#xff1a; 我们以1为根&#x…

asp.net core 3.0 gRPC框架小试

什么是gRPCgRPC是google开源的一个高性能、跨语言的RPC框架&#xff0c;基于HTTP2协议&#xff0c;采用ProtoBuf 定义的IDL。gRPC 的主要优点是&#xff1a;现代高性能轻量级 RPC 框架。协定优先 API 开发&#xff0c;默认使用协议缓冲区&#xff0c;允许与语言无关的实现。可用…

P1131 [ZJOI2007] 时态同步

P1131 [ZJOI2007] 时态同步 题意&#xff1a; 有一颗树&#xff0c;有一个点是激发器&#xff0c;从这个点开始可以产生一个激励电流&#xff0c;通过导线传向每一个它所连接的节点&#xff0c;经过一个边的花费为w[i],你有一个道具&#xff0c;每用一次可以让一个边的花费1&…

.Net开发者必知的技术类RSS订阅指南

作为一个.Net开发者&#xff0c;在如今这个信息大爆炸时代&#xff0c;网络上.net开发方面的信息浩如烟海(获取信息的渠道很多&#xff0c;比如各种 APP、公众号、聚合信息网站、博客园、InfoQ等等)&#xff0c;如何用有限的时间来获取并消化有效信息显得格外重要。虽然我们获取…

又一最大子段和

又一最大子段和&#xff08;牛客小白月赛38 &#xff09; 题意&#xff1a; 我们将一个数列{an}的最大字段和的值记为S(a),现在你可以对进行若干次操作&#xff0c;每次操作&#xff0c;你可以选择数列中的一个数字&#xff0c;将其改为[−10100,10100][-10^{100},10^{100}][…