A

先手取最大,后手取最小,答案就是第 \(\left\lceil\frac{n}{2}\right\rceil\) 小的数。

nth_element 可以做到 \(O\left(n\right)\)。

B

模拟,时间复杂度 \(O\left(nm\right)\)。

C

如果约分后 \(q\) 中存在某个质因数 \(b\) 中没有,则无法除尽,比较显然就不证了,可以对着十进制想一想。

但是太大了根号分解质因数会爆炸怎么办?

发现我们并不关心具体的质因数,我们只需要将他们去掉,这不禁让人想到 \(\gcd\)。

于是就有了一个比较慢的做法,\(q\) 每次除以 \(\gcd\left(q,b\right)\),如果 \(\gcd=1\) 了就停下了,此时如果 \(q\) 是 \(1\) 就能整除了。

时间复杂度先鸽着,可能会 \(\texttt{TLE}\)。

考虑能否更进一步优化。在做一次 \(\gcd\) 的时候,我们发现 \(b\) 中有的质因数如果在 \(\gcd\) 中没出现,那么它在 \(q\) 中必定也没出现。也就是说有贡献的质因数一定在 \(\gcd\) 中出现了,所以我们可以直接将 \(b\) 用 \(\gcd\left(q,b\right)\) 替换,这样的时间复杂度先鸽着。

代码贴一下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read()
{
ll A;
bool K;
char C;
C=A=K=0;
while(C<'0'||C>'9')K|=C=='-',C=getchar();
while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
return(K?-A:A);
}
ll gcd(ll _,ll __)
{
return(!_?__:gcd(__%_,_));
}
bool pd(ll x,ll y)
{
return(gcd(x,y)==1?x==1:pd(x/gcd(x,y),gcd(x,y)));
}
int main()
{
int n;
ll p,q,b;
n=read();
while(n--)
{
p=read(),q=read(),b=read();
q/=gcd(p,q);
puts((pd(q,b)?"Finite":"Infinite"));
}
return 0;
}

回寝室的时候问了下马阿克,发现我傻逼了……只要判一下 \(b^{\log q}\) 能否被 \(q\) 整除就好了,这样的时间复杂度是 \(O\left(n\log q\right)\) 的(瓶颈反而在于约分和算出 \(\log q\))。

D

很有趣的一道 DP 题。

对于一个长度为 \(len\) 的区间,被它包含的所有长度小于等于 \(len\) 的区间都能取到。

所以我们可以令 \(a_{i,j}\) 表示长度为 \(i\),以 \(j\) 作为左端点的区间的答案。

发现所有长度小于等于 \(i-1\) 的区间在 \(\left[j,j+i-2\right]\) 和 \(\left[j+1,j+i-1\right]\) 中至少能取到一次。

现在只要解决新加入的一个区间 \(\left[j,j+i-1\right]\),即快速算出 \(f\left(j\to j+i-1\right)\)。

模拟出整个倒三角形,其实 \(f\left(j\to j+i-1\right)\) 就是第 \(i\) 行第 \(j\) 列的数。

时间复杂度 \(O\left(n^2+q\right)\)。

E

卡常好题。

首先要观察到人进入电梯的顺序是固定的,可以搞进状态里。而楼层和容纳人数很少,也可以搞进状态里。

此处要注意,在电梯中,我们只关心一个人的目标楼层,而不关心他的具体编号。

令 \(dp_{now,high,pos1,pos2,pos3,pos4,0/1}\) 表示前 \(now\) 个人,当前楼层为 \(high\),电梯里的四个人的目标楼层(为 \(0\) 代表当前位置没人)以及当前电梯必须向上/下移动。

最后一维是为了防止出现反复横跳的情况。

发现转移比较恶心,不知道具体的转移顺序,考虑记忆化搜索。但问题又来了,\(2000\times 9\times 10^4\times 2=360000000\),这么大的数组拿头开。

此处有两个解决方案:

  • 强行限制状态,将目标楼层从大到小排序或者从小到大排序,这样方案数按不同数的个数算一下就是 \(\binom{10}{4}+\binom{10}{3}\times 3+\binom{10}{2}\times 3+\binom{10}{1}=715\)。

    只需要开 \(2000\times 9\times 715\times 2=25740000\) 大小的数组即可。
  • 滚动数组优化记忆化搜索。依次枚举人,第一维只与上一个有关。所以当前人进入电梯时从上一个转移过来,其它情况直接记搜。

    只需要开 \(9\times 10^4\times 2^2=360000\) 大小的数组即可。

当然你可以两个一起用。

显然的,这两种方法都非常之慢,尤其是第二种。如果你写了第二种的话,要加上四个优化(第一种没试过不清楚):

  • 当有人下电梯时,递归下去后直接返回。因为能下电梯显然下,代价一样,这样不会占着位子。
  • 当有人上电梯时,递归下去后直接返回。因为能上电梯显然上,代价一样,避免下次特意回来接。
  • 尽量把递归下去后算出的值存下来,避免再次调用。虽然后面递归时会直接返回,但递归本身非常耗时间
  • 火车头。

前两个加上后可以免去很多多余的取最小值步骤。

时间复杂度 \(O\left(n\right)\),\(2000\) 最慢跑了 \(2979ms\) 你敢信?

另:有直接 DP 的做法,似乎是根据接人送人的顺序来搞的,参考这里

要看记搜的第一种做法则可以参考这里

Contest 984的更多相关文章

  1. CF#483(div2 C)

    http://codeforces.com/contest/984/problem/C C. Finite or not time limit per test 1 second memory lim ...

  2. 【cf 483 div2 -C】Finite or not?(数论)

    链接:http://codeforces.com/contest/984/problem/C 题意 三个数p, q, b, 求p/q在b进制下小数点后是否是有限位. 思路 题意转化为是否q|p*b^x ...

  3. Codeforces Round #483 (Div. 2) [Thanks, Botan Investments and Victor Shaburov!]

    题目链接:http://codeforces.com/contest/984 A. Game time limit per test:2 seconds memory limit per test:5 ...

  4. CF练习记录

    2018/5/6 Codeforces Round #478 (Div. 2) C http://codeforces.com/contest/975/problem/C Valhalla Siege ...

  5. codeforce#483div2C-Finite or not?数论,GCD

    传送门:http://codeforces.com/contest/984/problem/C 这道题 题意:求q/p是否能用k进制有限表示小数点后的数:   思路:数学推理:     1.首先把q/ ...

  6. Codeforces Round #483 (Div. 2) B. Minesweeper

    题目地址:http://codeforces.com/contest/984/problem/B 题目大意:扫雷游戏,给你一个n*m的地图,如果有炸弹,旁边的八个位置都会+1,问这幅图是不是正确的. ...

  7. 牛客假日团队赛5J 护城河 bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 (凸包的周长)

    链接:https://ac.nowcoder.com/acm/contest/984/J 来源:牛客网 护城河 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  8. 牛客假日团队赛5 K 金币馅饼 (DP 基础题)

    链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  9. 牛客假日团队赛5 L Catch That Cow HDU 2717 (BFS)

    链接:https://ac.nowcoder.com/acm/contest/984/L 来源:牛客网 Catch That Cow 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 3 ...

随机推荐

  1. Learn day3 深浅拷贝/格式化/字符串/列表/字典/集合/文件操作

    1. pass break continue # ### pass break continue # (1) pass 过 """如果代码块当中,什么也不写,用pass来 ...

  2. 响应式编程简介之:Reactor

    目录 简介 Reactor简介 reactive programming的发展史 Iterable-Iterator 和Publisher-Subscriber的区别 为什么要使用异步reactive ...

  3. linux 的mysql 主从备份

    1.原理 mysql主从配置的流程大体如图: 1)master会将变动记录到二进制日志里面: 2)master有一个I/O线程将二进制日志发送到slave; 3) slave有一个I/O线程把mast ...

  4. .NET Core 跨平台资源监控库及 dotnet tool 小工具

    目录 简介 dotnet tool 体验 CZGL.SystemInfo SystemPlatformInfo ProcessInfo 内存监控 NetworkInfo DiskInfo 简介 CZG ...

  5. How to using expression setup BackgroundColor AX2012 SSRS Report[AX2012]

    tile label using [#99ccff] property BackgroundColor - > expression =Iif(Fields!Flag.Value = " ...

  6. IAuthorizationFilter学习笔记(权限控制)以及非全局的filter

    第一步:新建类CheckLoginFilter实现接口IAuthorizationFilter.请注意接口位于命名空间using System.Web.Mvc; public void OnAutho ...

  7. 3.3 Spring5源码---循环依赖过程中spring读取不完整bean的最终解决方案

    根据之前解析的循环依赖的源码, 分析了一级缓存,二级缓存,三级缓存的作用以及如何解决循环依赖的. 然而在多线程的情况下, Spring在创建bean的过程中, 可能会读取到不完整的bean. 下面, ...

  8. ASP.NET Core 中基于工厂的中间件激活

    IMiddlewareFactory/IMiddleware 是中间件激活的扩展点. UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware. 如果是,则使用在容器 ...

  9. php 获取抖音id

    <?php public function getid($dy_url){ $header=get_headers($dy_url); $str = "/^.*?(\d+).*/&qu ...

  10. 今天的一个SQL题-case语句和decode函数

    数据库表: select * from rec order by rst,game_time; ID GAME_TIME      RST ------ -------------- ---- 2 0 ...