题目大意:由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题解的更多相关文章

  1. kick start 2019 round D T3题解

    ---恢复内容开始--- 题目大意:共有N个房子,每个房子都有各自的坐标X[i],占据每个房子需要一定花费C[i].现在需要选择K个房子作为仓库,1个房子作为商店(与题目不同,概念一样),由于仓库到房 ...

  2. [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  3. Kick Start 2019 Round A Contention

    $\DeclareMathOperator*{\argmax}{arg\,max}$ 题目链接 题目大意 一排 $N$ 个座位,从左到右编号 $1$ 到 $N$ . 有 $Q$ 个预定座位的请求,第 ...

  4. Kick Start 2019 Round H. Elevanagram

    设共有 $N = \sum_{i=1}^{9} A_i$ 个数字.先把 $N$ 个数字任意分成两组 $A$ 和 $B$,$A$ 中有 $N_A = \floor{N/2}$ 个数字,$B$ 中有 $N ...

  5. 【DP 好题】Kick Start 2019 Round C Catch Some

    题目链接 题目大意 在一条数轴上住着 $N$ 条狗和一个动物研究者 Bundle.Bundle 的坐标是 0,狗的坐标都是正整数,可能有多条狗住在同一个位置.每条狗都有一个颜色.Bundle 需要观测 ...

  6. 2019.2.21 T2题解

    meet 大概思路就是 , 找出相交的路径 , 判断方向 , 分类讨论.. 假设已经找出了相交路径 ... 若方向相同 , 则找到相交路径上边权的最大值 , 若最大值>出发时间差 , 则可行. ...

  7. Kick Start 2019 Round A Parcels

    题目大意 $R \times C$ 的网格,格子间的距离取曼哈顿距离.有些格子是邮局.现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少. 数据范围 $ 1 ...

  8. Kick Start 2019 Round B Energy Stones

    对我很有启发的一道题. 这道题的解法中最有思维难度的 observation 是 For simplicity, we will assume that we never eat a stone wi ...

  9. Kick Start 2019 Round F Teach Me

    题目链接 题目大意 有 $N$ 个人,$S$ 项技能,这些技能用 $1, 2, 3, \dots, S$ 表示 .第 $i$ 个人会 $c_i$ 项技能($ 1 \le c_i \le 5 $).对于 ...

随机推荐

  1. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

  2. 灰度级分层(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 灰度级分层通常用于突出感兴趣的特定灰度范围内的亮度.灰度级分层有两大基本方法. 将感兴趣的灰度范围内的值显示为一个值(比如0),而其他范围的值为另外一个值(255). 将感兴趣的灰度范 ...

  3. 你所不知道的 CSS 负值技巧与细节

    写本文的起因是,一天在群里有同学说误打误撞下,使用负的 outline-offset 实现了加号.嗯?好奇的我马上也动手尝试了下,到底是如何使用负的 outline-offset 实现加号呢? 使用负 ...

  4. 3、数组的声明及初始化(test1.java)

    今天学习了,一位数组和二维数组,先学习了数组的申请,数组的初始化,数组的拷贝等.对于数组我认为,和C\C++中的数组,没有什么太大的区别,但是在JAVA中,大家都知道JAVA是面向对象的编程语言,每一 ...

  5. ssm访问不了后台

    最近整理ssm,写完demo案例,无论如何都访问不了后台,百度了好多,终于解决了问题所在 先看页面信息: 因为一直报404错误,一直找路径是不是弄错了,或配置文件弄错了,仅仅这个配置文件都看了无数遍, ...

  6. cs224d---词向量表示

    1 Word meaning 1. 1 word meaning的两种定义 Definition meaning:单词的含义指代了客观存在的具体事物,如眼镜. Distributional simil ...

  7. zuul 路由网关 微服务架构系统中

    在微服务架构中,基本包含以下常见的组件.服务注册与发现.服务消费.负载均衡.断路器.只能路由.配置管理等.一个简单的微服务架构系统如下 一.Zuul简介 Zuul的主要功能是路由转发和过滤器.路由功能 ...

  8. SpringMVC 原理 - 设计原理、启动过程、请求处理详细解读

    SpringMVC 原理 - 设计原理.启动过程.请求处理详细解读 目录 一. 设计原理 二. 启动过程 三. 请求处理 一. 设计原理 Servlet 规范 SpringMVC 是基于 Servle ...

  9. UI 组件 | Button

    最近在与其他自学 Cocos Creator 的小伙伴们交流过程中,发现许多小伙伴对基础组件的应用并不是特别了解,自己在编写游戏的过程中也经常对某个属性或者方法的用法所困扰,而网上也没有比较清晰的用法 ...

  10. 【原】iOS查找私有API

    喜接新项目往往预示的会出一堆问题.解决问题的同时往往也就是学到更多东西的时候,这也许就是学习到新东西最直接最快速的方法吧! 小编经过努力,新项目终于过测试了,可是被苹果大大给拒了,好苦啊,最近的审核真 ...