题目大意:由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. 什么是https?http升级为https需要什么?

    一.什么是https? https是一种加密传输协议,网站使用https后可以避免敏感信息被第三方获取.https加密协议=SSL / TLS+http协议,也就是说,在传统的http协议上加上SSL ...

  2. pod指定node运行

    1.给node打上label kubectl label nodes cn-hongkong.i-j6c5pm0b59y9kaos565o apptype=monitoring 2.查看结果kubec ...

  3. IdentityServer4笔记整理(更新中)

    1 OAuth 2.0 1.1 OAuth 2.0协议流程图 1.2 授权码模式 1.3 简化模式 1.4 资源所有者密码模式 1.5 客户端凭证模式 2 OpenID Connect(OIDC) 2 ...

  4. JavaScript&jQuery学习笔记

    前端JavaScript学习 JavaScript导入方式:1.外部文件导入<script src="myScript.js"></script> 2.在标 ...

  5. Java虚拟机(二)-对象创建

    这一篇大致说明一下,对象在Java堆中对象分配.内存布局以及访问定位 1.对象的创建 虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引 ...

  6. 每天用SpringBoot,还不懂RESTful API返回统一数据格式是怎么实现的?

    上一篇文章RESTful API 返回统一JSON数据格式 说明了 RESTful API 统一返回数据格式问题,这是请求一切正常的情形,这篇文章将说明如何统一处理异常,以及其背后的实现原理,老套路, ...

  7. Android删除指定路径下指定前缀或后缀的文件

    微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521声明:本文由CodingAndroid原创,未经授权,不可随意转载! 需求 我们在 ...

  8. React的新特性 ---- Hooks ---- 的基本使用

    一.react-hooks概念 React中一切皆为组件,React中组件分为类组件和函数组件,在React中如果需要记录一个组件的状态的时候,那么这个组件必须是类组件.那么能否让函数组件拥有类组件的 ...

  9. Linux配置及指令

    目录 Linux配置及指令 一.linux中常用软件的安装 二.主机名和网络 1.修改主机名 2.设置网络 三.关闭防火墙 1.检查防火墙是否开启 2.清除策略 3.永久关闭第一个防火墙 4.关闭第二 ...

  10. 06 css选择器

    选择器的作用:选中标签 1.基本选择器  标签选择器 id选择器 class选择器 *通配符选择器 权重:行内样式 1000 > id选择器 100 > 类选择器10 > 标签选择器 ...