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 $).对于 ...
随机推荐
- Django是如何防止注入攻击-XSS攻击-CSRF攻击
注入攻击-XSS攻击-CSRF攻击介绍请访问:https://www.cnblogs.com/hwnzy/p/11219475.html Django防止注入攻击 Django提供一个抽象的模型层来组 ...
- jquery EasyUi 添加节点、展开所有节点、默认选中第一个节点
感觉easyUi 的树用起来不如 Ext 的树方便,首先,root节点不太好自定义, 异步加载时,只能通过后台判断生成root节点,但是这样一来有一个问题,就是第一次访问界面时, 树的初始化比较慢,大 ...
- HTML/CSS:div居中和div内部元素垂直居中(1)
div居中 div水平和垂直居中,text-align和vertical-align不起作用,因为标签div没有这两个属性,所以再css中设置这两个值不能居中的效果 1. div水平居中:设置marg ...
- JavaWeb——使用会话维持状态
1.会话的作用 使用会话是为了维持状态,维持的是请求域请求之间的状态.因为HTTP请求自身是完全无状态的.从服务器的角度来看,当用户发出第一个请求开始,服务器无法将新的请求与之前的请求关联起来,举例说 ...
- 实验:keepalived双主抢占模式和非抢占模式和IPVS
内容: 一:概念.原理 二:实验过程 一.概念 一.keepalived原理及配置解析 keepalived:vrrp协议的实现 vrrp协议:virtual router redundancy ...
- Hive 系列(四)—— Hive 常用 DDL 操作
一.Database 1.1 查看数据列表 show databases; 1.2 使用数据库 USE database_name; 1.3 新建数据库 语法: CREATE (DATABASE|SC ...
- 基于ZooKeeper的三种分布式锁实现
[欢迎关注公众号:程序猿讲故事 (codestory),及时接收最新文章] 今天介绍基于ZooKeeper的分布式锁的简单实现,包括阻塞锁和非阻塞锁.同时增加了网上很少介绍的基于节点的非阻塞锁实现,主 ...
- Java 从入门到进阶之路(二)
之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...
- Kafka监控工具汇总
对于大数据集群来说,监控功能是非常必要的,通过日志判断故障低效,我们需要完整的指标来帮我们管理Kafka集群.本文讨论Kafka的监控以及一些常用的第三方监控工具. 一.Kafka Monitorin ...
- DBUtils框架的使用(下)
刚才讲了使用QueryRunner插入.修改.更新数据,现在来学习一下使用QueryRunner进行数据库表查询. 通过QueryRunner类的query()方法即可完成数据库表的查询操作,但是在查 ...