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 $).对于 ...
随机推荐
- 【Vue前端】Vue前端注册业务实现!!!【代码】
用户注册前端逻辑 1. Vue绑定注册界面准备 1.导入Vue.js库和ajax请求的库 <script type="text/javascript" src="{ ...
- 一文了解:Redis事务
Redis事务 事务提供了一种"将多个命令打包,一次性提交并按顺序执行"的机制,提交后在事务执行中不会中断.只有在执行完所有命令后才会继续执行来自其他客户的消息. Redis中的使 ...
- Mybatis获取代理对象
mybatis-config.xml里标签可以放置多个environment,这里可以切换test和develop数据源 databaseIdProvider提供多种数据库,在xml映射文件里选择da ...
- JVM运行时数据区--深入理解Java虚拟机 读后感
程序计数器 程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令.占用的内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器.如果线程在执行Java方法,这 ...
- python中下标和切片的使用
下标 所谓下标就是编号,就好比超市中存储柜的编号,通过这个编号就能找到相应的存储空间. Python中字符串,列表,元祖均支持下标索引. 例如: # 如果想取出部分字符,可使用下标 name=&quo ...
- 浅谈IDEA搭建SSM框架的集成
前言 学习完MyBatis,Spring,SpringMVC之后,我们需要做的就是将这三者联系起来,Spring实现业务对象管理,Spring MVC负责请求的转发和视图管理, MyBatis作为数据 ...
- 深入解析Mysql中事务的四大隔离级别及其所解决的读现象
本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执 ...
- macOS 下的 MySQL 8.0.17 安装与简易配置
如果我写的这篇你看不懂,可能网上也没有你能看懂的教程了 虽然这篇针对的是8.0.x版本,但是关于MySQL配置之类的方法还是通用的 环境信息与适用范围 环境信息 环境/软件 版本 macOS macO ...
- HashMap源码分析之面试必备
今天我们就面试会问到关于HashMap的问题进行一个汇总,以及对这些问题进行解答. 1.HashMap的数据结构是什么? 2.为啥是线程不安全的? 3.Hash算法是怎样实现的? 4.HashMa ...
- (三十五)c#Winform自定义控件-Tab页
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...