前一个小时看这几道题感觉要爆零


A. 仓鼠的石子游戏

分析一下发现a[i]>1a[i]>1a[i]>1时后先手必输,a[i]=1a[i]=1a[i]=1时先手必赢

然后直接看1的个数奇偶性就行了

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main () {
  4. int T, n, a; scanf("%d", &T);
  5. while(T--) {
  6. scanf("%d", &n);
  7. int ans = 0;
  8. for(int i = 1; i <= n; ++i)
  9. scanf("%d", &a), ans ^= (a == 1);
  10. puts(ans ? "rabbit" : "hamster");
  11. }
  12. }

B.乃爱与城市拥挤程度

f[i][j],g[i][j]f[i][j],g[i][j]f[i][j],g[i][j]分别表示iii点下方走jjj步的答案。

答案就是f[i][k],g[i][k]f[i][k],g[i][k]f[i][k],g[i][k]

傻逼树形DP

O(nklog⁡)O(nk\log)O(nklog),有log⁡\loglog是因为求逆元,实际上可以把要求逆元的数取出来O(n)O(n)O(n)求一遍就可以做到O(nk)O(nk)O(nk),不过没必要。

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 100005;
  4. const int MAXK = 12;
  5. const int mod = 1e9 + 7;
  6. int n, k, f[MAXN][MAXK], g[MAXN][MAXK];
  7. int fir[MAXN], to[MAXN<<1], nxt[MAXN<<1], cnt;
  8. inline void link(int u, int v) {
  9. to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt;
  10. to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt;
  11. }
  12. inline int qpow(int a, int b) {
  13. int re = 1;
  14. while(b) {
  15. if(b&1) re = 1ll * re * a % mod;
  16. a = 1ll * a * a % mod; b >>= 1;
  17. }
  18. return re;
  19. }
  20. void dfs1(int u, int ff) {
  21. for(int j = 0; j <= k; ++j) f[u][j] = 1, g[u][j] = 1;
  22. for(int i = fir[u], v; i; i = nxt[i])
  23. if((v=to[i]) != ff) {
  24. dfs1(v, u);
  25. for(int j = 1; j <= k; ++j) {
  26. f[u][j] += f[v][j-1];
  27. g[u][j] = 1ll*g[u][j]*g[v][j-1]%mod;
  28. }
  29. }
  30. for(int j = 0; j <= k; ++j)
  31. g[u][j] = 1ll * g[u][j] * f[u][j] % mod;
  32. }
  33. int F[MAXN], G[MAXN];
  34. void dfs2(int u, int ff) {
  35. F[u] = f[u][k], G[u] = g[u][k];
  36. for(int i = fir[u], v; i; i = nxt[i])
  37. if((v=to[i]) != ff) {
  38. for(int j = k; j >= 1; --j) {
  39. g[v][j] = 1ll * g[v][j] * qpow(f[v][j], mod-2) % mod * (f[v][j]+f[u][j-1]-(j>=2?f[v][j-2]:0)) % mod * g[u][j-1] % mod * qpow(f[u][j-1], mod-2) % mod * (f[u][j-1] - (j>=2?f[v][j-2]:0)) % mod * (j>=2?qpow(g[v][j-2], mod-2):1) % mod;
  40. f[v][j] += f[u][j-1]-(j>=2?f[v][j-2]:0);
  41. }
  42. dfs2(v, u);
  43. }
  44. }
  45. int main () {
  46. scanf("%d%d", &n, &k);
  47. for(int i = 1, u, v; i < n; ++i) scanf("%d%d", &u, &v), link(u, v);
  48. dfs1(1, 0), dfs2(1, 0);
  49. for(int i = 1; i <= n; ++i) printf("%d%c", F[i], " \n"[i==n]);
  50. for(int i = 1; i <= n; ++i) printf("%d%c", G[i], " \n"[i==n]);
  51. }

C.小w的魔术扑克

把一张牌的两面的值连边。

最后发现一个连通块,如果里面有重边或者环,这个连通块所有的值肯定都能凑出来。

只需要考虑那些树形态的连通块。

对于一棵树,询问区间是[l,r][l,r][l,r],如果整棵树值域都在[l,r][l,r][l,r]内,一定不能满足,否则就可以。所以求出每棵树的值域[mn,mx][mn,mx][mn,mx],然后包含这个区间的[l,r][l,r][l,r]答案都是NoNoNo。区间排序后O(n)O(n)O(n)直接做。

总时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)

upd:upd:upd:也可以在mxmxmx处附上mnmnmn的值,然后求一个前缀最大值,然后对于一个询问,如果1→r1\to r1→r的前缀最大值>=l>=l>=l就一定包含了一个区间。这样做是O(n)O(n)O(n)的。还更好写。。

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 100005;
  4. int n, m, k, Q;
  5. int fir[MAXN], to[MAXN<<1], nxt[MAXN<<1], cnt = 1;
  6. inline void link(int u, int v) {
  7. to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt;
  8. to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt;
  9. }
  10. int mn, mx;
  11. bool vis[MAXN], inq[MAXN], flg;
  12. void dfs(int u, int ff) {
  13. vis[u] = inq[u] = 1;
  14. mn = min(mn, u);
  15. mx = max(mx, u);
  16. for(int i = fir[u], v; i; i = nxt[i]) if((i^1) != ff){
  17. if(!vis[v=to[i]]) dfs(v, i);
  18. else if(inq[v]) flg = 1;
  19. }
  20. inq[u] = 0;
  21. }
  22. struct node {
  23. int l, r, id;
  24. inline bool operator <(const node &o)const {
  25. return r < o.r;
  26. }
  27. }a[MAXN], q[MAXN];
  28. bool ans[MAXN];
  29. int main () {
  30. scanf("%d%d", &n, &k);
  31. for(int i = 1, u, v; i <= k; ++i) scanf("%d%d", &u, &v), link(u, v);
  32. for(int i = 1; i <= n; ++i)
  33. if(!vis[i]) {
  34. flg = 0; mn = i, mx = i;
  35. dfs(i, 0);
  36. if(!flg) a[++m] = (node){ mn, mx };
  37. }
  38. sort(a + 1, a + m + 1);
  39. scanf("%d", &Q);
  40. for(int i = 1; i <= Q; ++i)
  41. scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;
  42. sort(q + 1, q + Q + 1);
  43. int pos = 0;
  44. for(int i = 1, j = 1; i <= Q; ++i) {
  45. while(j <= m && a[j].r <= q[i].r) pos = max(pos, a[j++].l);
  46. ans[q[i].id] = q[i].l <= pos;
  47. }
  48. for(int i = 1; i <= Q; ++i) puts(ans[i] ? "No" : "Yes");
  49. }

然后莫名其妙就AK了。

20191029 牛客CSP-S提高组赛前集训营1的更多相关文章

  1. 牛客网CSP-S提高组赛前集训营Round4

    牛客网CSP-S提高组赛前集训营 标签(空格分隔): 题解 算法 模拟赛 题目 描述 做法 \(BSOJ6377\) 求由\(n\)长度的数组复制\(k\)次的数组里每个连续子序列出现数字种类的和 对 ...

  2. 牛客CSP-S提高组赛前集训营1

    牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓 ...

  3. 牛客CSP-S提高组赛前集训营3

    A 货物收集 显然是一个二分答案的题. #include<iostream> #include<cstdio> #include<cstring> #include ...

  4. 牛客CSP-S提高组赛前集训营3 赛后总结

    货物收集 二分答案.复杂度\(O(n\log n)\). 货物分组 用费用提前计算的思想,考虑用一个新的箱子来装货物会发生什么. 显然费用会加上后面的所有货物的总重. \(60\)分的\(O(n^2) ...

  5. 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31

    比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa  cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...

  6. 牛客CSP-S提高组赛前集训营1———2019.10.29 18:30 至 22:00

    期望得分:100+0+10 实际得分:40+0+0 考炸了... T1:题目链接 究竟为什么会这样,,, 仔细研读我的丑代码 发现... 枯辽.... #include<cstdio> # ...

  7. 牛客CSP-S提高组赛前集训营2 T2沙漠点列

    原题链接 算法不难,比赛的时候就和cyc大佬一起yy了正解,不过因为交的时候比较急(要回寝室惹),我有两数组开错大小直接爆到50,cyc大佬则只把文件输入关了一半,直接爆零(╯ ̄Д ̄)╯┻━┻ 要尽量 ...

  8. 牛客CSP-S提高组赛前集训营4 赛后总结

    复读数组 分成 3 种区间算答案: 一个块内的区间 两个块交界处,长度小于块长的区间 长度不小于块长的区间 对于第三种区间,容易发现每个区间的权值一样,只需要算出个数即可. 对于前两种空间,我的思路是 ...

  9. 牛客CSP-S提高组赛前集训营5 赛后总结

    A.无形的博弈 心理题. 答案为\(2^n\),可感性理解结论的正确性. #include<bits/stdc++.h> #define LL long long const LL Mod ...

随机推荐

  1. Variational Auto-encoder(VAE)变分自编码器-Pytorch

    import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision from ...

  2. 阿里云服务器安装mysql8遇到的问题

    1.提供一个离线mysql下载路径:http://mirrors.163.com/mysql/Downloads/MySQL-8.0/ 2.在线mysql8安装: 2.1 下载mysql: wget ...

  3. ~json库的使用

    一.json简介 json全称"JavaScript Object Notation"(JavaScript对象表示法)它是一种基于文本,独立于语言的轻量级数据交换格式.易于让人阅 ...

  4. 第三章 hash是个啥玩意

    3.10 hash 什么是哈希? hash,一般翻译做散列.杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值.这种转换是一种压 ...

  5. 04 IO流(二)——IO类的记忆方法、使用场景

    关于IO流以前写的PPT式笔记请跳转:https://blog.csdn.net/SCORPICAT/article/details/87975094#262___1451 IO流的主要结构 记忆方法 ...

  6. 14 IF函数

    情景 某销售表,如果员工的销售额大于5000元,提成为10%,否则为8% IF函数 =IF(表达式,值1,值2) 判断表达式,如果表达式为真,显示值1,如果表达式为假,显示值2 示例

  7. Practice

    一.简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...

  8. 在vue中使用ElementUI

    完整引用ElementUI: 安装:在需要使用到的vue项目目录下,使用npm下载安装: npm/cnpm i element-ui -S/--save <!-- 引入样式 --> < ...

  9. 【Linux】Shell批量修改文件名

    修改文件名,替换中间字符: 例如:ABC_define_EFG.jpg,要把中间的define替换成argument: 用如下脚本即可: for var in *; do mv "$var& ...

  10. CSS中@import url()

    @import url( )总结: 1.import url( )机制是不同于link的,link是在加载页面前把CSS加载完毕,而@import url( )则是读取完文件后加载,所以会出现一开始没 ...