kick start 2019 round D T2题解
题目大意:由N个房子围成一个环,G个人分别顺时针/逆时针在房子上走,一共走M分钟,每分钟结束,每个人顺/逆时针走到相邻的房子。对于每个房子都会记录最后时刻到达的人(可能是一群人)。最终输出每个人会被几个房子记录。
数据范围:N<=1e5,G<=1e5,M<=1e9,多组测试数据。
解题思路:比赛时没做出来第二个测试点,有点失了智。。。看了下题解马上就有了想法。关键点在于①将顺时针逆时针分开考虑②从走过M步的最终状态向前思考③从单个人变成一群人代码的准确性④代码的准确性。
我的想法是:先将顺时针单独考虑,然后得到最终状态,对于N个屋子进行逆时针循环(由于从最终状态倒退),若该房子有一群人,则记录此编号,并刷新时间戳(M),若该房子没有人,则根据时间戳标记之前记录的编号。对逆时针进行同样的操作。最终统一看,对于每一个房子:顺逆时针时间戳不同则将较大的人群num++,相同则都num++。最终输出即可。
由于我的stl还不熟练,完全的C风格让代码较为复杂,但真的是一个好题,做得很慢,估计写了45min吧。
最终代码:
#include <stdio.h> using namespace std; int st[];
int clock[];
int lis[];
int gcst[],gast[],gcfi[],gafi[];
int gcnum[],ganum[];
int tima[],timc[],lasa[],lasc[];
int flag[]; int mainn()
{
int n,g,m;scanf("%d%d%d",&n,&g,&m);
for (int i=;i<g;i++)
{
scanf("%d",&st[i]);
char ch=getchar();while (ch==' ') ch=getchar();
if (ch=='A') clock[i]=-;else clock[i]=;
}
int ngc=,nga=;
for (int i=;i<=n;i++) flag[i]=-;
for (int i=;i<g;i++)
if (clock[i]>){
if (flag[st[i]]==-){
flag[st[i]]=ngc;gcst[ngc]=st[i];lis[i]=ngc++;
}
else
lis[i]=flag[st[i]];
} for (int i=;i<=n;i++) flag[i]=-;
for (int i=;i<g;i++)
if (clock[i]<){
if (flag[st[i]]==-){
flag[st[i]]=nga;gast[nga]=st[i];lis[i]=nga++;
}
else
lis[i]=flag[st[i]];
} for (int i=;i<ngc;i++) gcfi[i]= (gcst[i]-+m)%n+;
for (int i=;i<nga;i++) gafi[i]= ((gast[i]--m)%n+n)%n+; for (int i=;i<ngc;i++) gcnum[i]=;
for (int i=;i<nga;i++) ganum[i]=; for (int i=;i<=n;i++) lasa[i]=lasc[i]=tima[i]=timc[i]=-; int tmp=,fin=;
for (int i=;i<ngc;i++){
if (tmp==) tmp=fin=gcfi[i];
lasc[ gcfi[i] ]=i;timc[ gcfi[i] ]=m;
} int last=lasc[tmp];int _time=m;tmp=tmp-;if (tmp==) tmp=n;
while(fin> && tmp!=fin){
_time--;
if ( lasc[tmp]==- && _time>= )
lasc[tmp]=last,timc[tmp]=_time;
else if ( lasc[tmp]!=- )
last=lasc[tmp],_time=m;
tmp--;if (tmp==) tmp=n;
} tmp=fin=;
for (int i=;i<nga;i++){
if (tmp==) tmp=fin=gafi[i];
lasa[gafi[i]]=i;tima[ gafi[i] ]=m;
}
last=lasa[tmp];_time=m;tmp=tmp%n+;
while (fin> && tmp!=fin){
_time--;
if ( lasa[tmp]==- && _time>= )
lasa[tmp]=last,tima[tmp]=_time;
else if ( lasa[tmp]!=- )
last=lasa[tmp],_time=m;
tmp=tmp%n+;
} for (int i=;i<ngc;i++) gcnum[i]=;
for (int i=;i<nga;i++) ganum[i]=; for (int i=;i<=n;i++)
{
if (lasa[i]>= && lasc[i]>=){
if ( tima[i]>timc[i] )
ganum[ lasa[i] ]++;
else if (tima[i]<timc[i])
gcnum[ lasc[i] ]++;
else
ganum[ lasa[i] ]++,gcnum[ lasc[i] ]++;
}
else if (lasa[i]>=){
ganum[ lasa[i] ]++;
}
else if (lasc[i]>=){
gcnum[ lasc[i] ]++;
}
}
/*
printf("\n\n");
for (int i=1;i<=n;i++)
printf("%d ",lasc[i]);
printf("\n");
for (int i=1;i<=n;i++)
printf("%d ",timc[i]);
printf("\n");
for (int i=1;i<=n;i++)
printf("%d ",lasa[i]);
printf("\n");
for (int i=1;i<=n;i++)
printf("%d ",tima[i]);*/
for (int i=;i<g;i++)
{
if(clock[i]>)
printf(" %d",gcnum[lis[i]]);
else
printf(" %d",ganum[lis[i]]);
}
printf("\n"); } int main()
{
int T;scanf("%d",&T);
for (int i=;i<=T;i++)
{
printf("Case #%d:",i);
mainn();
}
}
好题,值得重新练习的“模拟题”。
题目链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000051061/0000000000161427
kick start 2019 round D T2题解的更多相关文章
- kick start 2019 round D T3题解
---恢复内容开始--- 题目大意:共有N个房子,每个房子都有各自的坐标X[i],占据每个房子需要一定花费C[i].现在需要选择K个房子作为仓库,1个房子作为商店(与题目不同,概念一样),由于仓库到房 ...
- [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)
[多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...
- Kick Start 2019 Round A Contention
$\DeclareMathOperator*{\argmax}{arg\,max}$ 题目链接 题目大意 一排 $N$ 个座位,从左到右编号 $1$ 到 $N$ . 有 $Q$ 个预定座位的请求,第 ...
- Kick Start 2019 Round H. Elevanagram
设共有 $N = \sum_{i=1}^{9} A_i$ 个数字.先把 $N$ 个数字任意分成两组 $A$ 和 $B$,$A$ 中有 $N_A = \floor{N/2}$ 个数字,$B$ 中有 $N ...
- 【DP 好题】Kick Start 2019 Round C Catch Some
题目链接 题目大意 在一条数轴上住着 $N$ 条狗和一个动物研究者 Bundle.Bundle 的坐标是 0,狗的坐标都是正整数,可能有多条狗住在同一个位置.每条狗都有一个颜色.Bundle 需要观测 ...
- 2019.2.21 T2题解
meet 大概思路就是 , 找出相交的路径 , 判断方向 , 分类讨论.. 假设已经找出了相交路径 ... 若方向相同 , 则找到相交路径上边权的最大值 , 若最大值>出发时间差 , 则可行. ...
- Kick Start 2019 Round A Parcels
题目大意 $R \times C$ 的网格,格子间的距离取曼哈顿距离.有些格子是邮局.现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少. 数据范围 $ 1 ...
- Kick Start 2019 Round B Energy Stones
对我很有启发的一道题. 这道题的解法中最有思维难度的 observation 是 For simplicity, we will assume that we never eat a stone wi ...
- Kick Start 2019 Round F Teach Me
题目链接 题目大意 有 $N$ 个人,$S$ 项技能,这些技能用 $1, 2, 3, \dots, S$ 表示 .第 $i$ 个人会 $c_i$ 项技能($ 1 \le c_i \le 5 $).对于 ...
随机推荐
- 【POJ - 3258】River Hopscotch(二分)
River Hopscotch 直接中文 Descriptions 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一块岩石跳到另一块岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点 ...
- 利用python自动生成verilog模块例化模板
一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受“利奇马”的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口动不动就几十上百个, ...
- Elasticsearch实战 | 必要的时候,还得空间换时间!
1.应用场景 实时数据流通过kafka后,根据业务需求,一部分直接借助kafka-connector入Elasticsearch不同的索引中. 另外一部分,则需要先做聚类.分类处理,将聚合出的分类结果 ...
- Logback配置文件这么写,TPS提高10倍
通过阅读本篇文章将了解到 1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件 2.通过异步输出日志减少磁盘IO提高性能 3.异步输出日志的原理 配置文件logback-spring.xml ...
- laya 下以光标为中心缩放对象
private MouseWheel(e: Laya.Event) { console.log("event"); let currentSp = e.target as Laya ...
- Python 获取服务器的CPU个数
在使用gunicorn时,需要设置workers, 例如: gunicorn --workers=3 app:app -b 0.0.0.0:9000 其中,worker的数量并不是越多越好,推荐值是C ...
- 彻底搞懂Java中equals和==的区别
java当中的数据类型和“==”的含义: 1.基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean.他们之间的比较,应用双等号 ...
- Selenium + python 测试环境搭建
Windows平台(py3 已经自带了工具包) 准备工具: python.setuptools(python工具基础包).pip(python安装包管理工具) 安装步骤: 1.python安装,运行e ...
- js 分享一个 时钟效果
<style> *{ margin: 0; padding: 0; } #outLine{ ...
- 前端利器躬行记(2)——Babel
Babel是一个JavaScript编译器,不仅能将当前运行环境不支持的JavaScript语法(例如ES6.ES7等)编译成向下兼容的可用语法(例如ES3或ES5),这其中会涉及新语法的转换和缺失特 ...