牛客联系赛53 A-E

题目链接:Link

A 超越学姐爱字符串

题意: 长度为N的字符串,只能有C,Y字符,且字符串中不能连续出现 C。

思路: 其实就是DP,\(Dp[i][c]\) 表示长度为 \(i\) , 以 \(C\) 结尾的字符串有多少种。那么整个状态方程就有:

\[DP[i][c] = Dp[i-1][y]\\
Dp[i][y] = Dp[i-1][c] + Dp[i-1][y]
\]

会发现其实就是斐波那契数列而已。

Code

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const ULL MOD = 1000000000 + 7;
const int maxn = 100000 + 13;
ULL Dp[maxn][2]; void Init() {
// 0 --> Y, 1 ---> C
memset(Dp, 0, sizeof(Dp));
Dp[0][0] = Dp[0][1] = 0;
Dp[1][0] = Dp[1][1] = 1;
for(int i = 2; i < maxn; ++i) {
Dp[i][0] = (Dp[i-1][0] + Dp[i-1][1]) % MOD;
Dp[i][1] = Dp[i-1][0];
}
} int main() { Init();
int n;
while(scanf("%d", &n) != EOF) {
ULL sum = (Dp[n][0] + Dp[n][1]) % MOD;
printf("%lld\n", sum);
}
return 0;
}

B 美味果冻

题意: $ \sum_{i=1}{n}\sum_{j=1}{i} {i * [\frac{i}{j}]^{j}}$ 简单暴力的题意。。。

思路:这题就是找规律。。。把具体计算式写出来,就发现规律了。具体如下:

\[\begin{align}
&1 \\
&2^2 \ \ 2*1^2 \\
&3^2 \ \ 3*1^2 \ \ 3*1^3 \\
&4^2 \ \ 4*2^2 \ \ 4*1^3 \ \ 4*1^4\\
&\cdots \\
&n^2 \ \ n*[\frac{n}{2}]^2 \ \ n*[\frac{n}{3}]^3 \cdots n*1^n
\end{align}
\]

第一列即为 \(\sum_i^n i^2\) ,第\(J\)列开始,就是以 \([\frac{n}{j}]\) 分块了。

Code:

int main() {
false_stdio;
cin >> n;
for (ll j = 1; j <= n; j++) {
num[j] = j;
ans = (ans + j * j % mod) % mod;
}
for (ll j = 2; j <= n; j++) {
cnt = n / j;
ll L = j;
for (int i = 1; i < cnt; i++) {
tot = (L * j + (j * (j - 1) >>1)) % mod;
num[i] = num[i] * i % mod;
ans = ans + tot * num[i] % mod;
L += j;
}
num[cnt] = num[cnt] * cnt % mod;
tot = (n - cnt * j + 1) % mod;
ans =ans+ (L * tot % mod + (tot * (tot - 1)>>1)) % mod * num[cnt] % mod; }
ans = (ans + mod) % mod;
cout << ans << endl;
return 0;
}

C 富豪凯匹配串

题意:0-1 字符串匹配, '_' 代表通配符,输出有多少是成功匹配的。

思路:因为是 0-1 字符串,所以是可以使用 bitset 来做这题的。按与操作来匹配相应位是否相等即可。

Code

int cnt = 0;
bitset<1005> p;
bitset<1005> q;
cin >> str;
for(int j = 0; j < m; ++j) {
char c = str[j];
if(c == '0') {
q[j] = 0; p[j] = 1;
} else if(c == '1') {
p[j] = q[j] = 1;
} else if(c == '_') {
p[j] = q[j] = 0;
}
}
for(int i = 0; i < n; ++i) {
if((p&Str[i]) == q) cnt ++;
}
cout << cnt << endl;

D 德育分博弈政治课

题意:给你 \(N\) 个骰子, 每个骰子的面是给定的 1-9 中的 6个数字, 然后 \(Q\) 次询问,每次询问是一个长串字符串 \(str\) ,只含有 1 - 9 字符,问你的 \(N\) 个骰子, 骰子朝上的面记录为 \(c\) , 问可不可以用你的 \(N\) 个骰子选 \(L\) 个, 排列,使得 \(c_1c_2 \cdots c_l = str\) 。

思路:主要是总共只有 9 个字符,也就是说所有的状态只有 $2^9 $ 种状态。。。 可以状态压缩 + 暴力搜索状态。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1024;
int cnt[maxn];
int num[maxn];
// 离散化状态, 方便计数, 暴力搜索状态
int main() {
memset(cnt, 0, sizeof(cnt));
memset(num, 0, sizeof(num));
int n, Q;
string str;
cin >> n >> Q;
//处理状态
for(int i = 0; i < n; ++i) {
cin >> str;
int len = str.length();
int status = 0;
for(int j = 0; j < 6; ++j) {
status |= 1<<(str[j]-'1');
}
cnt[status]++;
}
//统计 只要串里面有一个相同的,就可以纳入状态 2^9
for(int i = 0; i < 512; ++i) {
for(int j = 0; j < 512; ++j) {
if(i&j) num[i] += cnt[j];
}
} for(int q = 0; q < Q; ++q) {
cin >> str;
int len = str.length();
bool jug = true;
int cnums[10] = {};
//memset(cnums, 0, sizeof(cnums));
for(int i = 0; i < len; ++i) cnums[str[i]-'1']++;
for(int i = 0; i < 512 && jug; ++i) {
int needNums = 0;
for(int j = 0; j < 9; ++j) {
if((i>>j) & 1) {
needNums += cnums[j];
}
}
if(needNums > num[i]) jug = false;
}
//cout << jug << endl;
string res = (jug ? "dyf" : "zzk");
cout << res << endl;
} return 0;
}

老瞎眼 pk 小鲜肉

题意: 给一个数组 \(Num\) ,给 一组区间查询 \([L_i, R_i]\) , 使得有区间最短的 \([l_i, r_i]\)在 \(L_i < l_i < r_i < R_i\) 下,有\(Num[l_i] \oplus Num[l_{i+1}]\oplus \cdots \oplus Num[r_i] = 0\) 。

思路: 首先最容易想到的就是前缀和,但是,根据题目数据,又明显会超时。区间,不难想到会要结合一下线段树来做。问题是如何用线段树来优化。

​ 首先,不考虑区间,考虑全部数组,如何得到最短 的区间。显然就是顺序处理前缀和,遇到相等的,记录下来(Tips:\(a \oplus a = 0\))。对于这道题来说,可以先预处理,把每一对这样相等的,距离最短的记录下来,然后离线处理所有询问 , 用线段树维护当前询问,最大右端为 \(r_i\) 情况下,所能获得的最区间值。

#include <bits/stdc++.h>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid+1, r, rt<<1|1
#define IOSPEED ios::sync_with_stdio(false); cin.tie(0);
const int maxn = 500000 + 13;
const int INF = 0x7ffffffa;
int minDis[maxn<<2];
int Nums[maxn], pre[maxn], pos[maxn<<2]; void PushUp(int rt) {
minDis[rt] = min(minDis[rt<<1],minDis[rt<<1|1]);
} void Build(int l, int r, int rt) {
minDis[rt] = INF;
int mid = (l + r) >> 1;
Build(lson);
Build(rson);
} void Update(int pos, int val, int l, int r, int rt) {
if(l == r) {
minDis[rt] = min(val, minDis[rt]);
return ;
}
int mid = (l + r) >> 1;
if(pos <= mid) Update(pos, val, lson);
else Update(pos, val, rson);
PushUp(rt);
} int Query(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
return minDis[rt];
}
int mid = (l + r) >> 1;
int resMin = INF;
if(L <= mid) resMin = min(resMin, Query(L, R, lson));
if(R > mid) resMin = min(resMin, Query(L, R, rson));
return resMin;
} struct QuesNode {
int l, r, id;
bool operator < (const QuesNode& a) {
return r < a.r;
}
}; QuesNode q[maxn];
int ans[maxn];
int n, Q;
int main() {
IOSPEED;
cin >> n >> Q;
for(int i = 1; i <= n; ++i) {
cin >> Nums[i];
}
fill(begin(minDis), end(minDis), INF);
fill(begin(pre), end(pre), -1);
fill(begin(ans), end(ans), INF);
fill(begin(pos), end(pos), -1);
int sum = 0;
pos[0] = 0;
// 第 i 个数的最短区间为 i - pre[i] + 1
for(int i = 1; i <= n; ++i) {
sum = sum ^ Nums[i];
if(pos[sum] != -1) {
pre[i] = pos[sum]+1;
} else pre[i] = -1;
pos[sum] = i;
}
for(int i = 0; i < Q; ++i) {
cin >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q, q+Q);
int pos = 0;
for(int i = 1; i <= n; ++i) {
if(pre[i] != -1) Update(pre[i], i-pre[i]+1, 1, n, 1);
while(q[pos].r == i) {
ans[q[pos].id] = Query(q[pos].l, q[pos].r, 1, n, 1);
pos++;
}
}
for(int i = 0; i < Q; ++i) {
cout << (ans[i]==INF ? -1 : ans[i]) << endl;
}
return 0;
}

牛客练习赛53 A-E的更多相关文章

  1. 牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)

    牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...

  2. 牛客练习赛53 A 超越学姐爱字符串 (DP)

    牛客练习赛53 超越学姐爱字符串 链接:https://ac.nowcoder.com/acm/contest/1114/A来源:牛客网 超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢" ...

  3. 【牛客练习赛53】A-超越学姐爱字符串

    // 题目地址:https://ac.nowcoder.com/acm/contest/1114/A /* 找规律(碰运气) n:1 = 2 n:2 = 3 n:3 = 5 n:4 = 8 ... d ...

  4. 牛客练习赛53 E 老瞎眼 pk 小鲜肉 (线段树,思维)

    链接:https://ac.nowcoder.com/acm/contest/1114/E来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...

  5. 牛客练习赛53 B 美味果冻

    链接:https://ac.nowcoder.com/acm/contest/1114/B来源:牛客 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言10485 ...

  6. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  7. 牛客练习赛53 (C 富豪凯匹配串) bitset

    没想到直接拿 bitset 能过 $10^8$~ code: #include <bits/stdc++.h> #define N 1004 #define setIO(s) freope ...

  8. 牛客练习赛53 (E 老瞎眼 pk 小鲜肉) 线段树+离线

    考试的时候切的,类似HH的项链~ code: #include <bits/stdc++.h> #define ll long long #define M 500003 #define ...

  9. 牛客练习赛53 C 富豪凯匹配串

    思路: bitset的简单题,不幸的是当时的我并不知道bitset, C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间, ...

随机推荐

  1. MySQL5.7.21解压版安装详细教程(转)

    由于本人经常装系统,每次装完系统之后都要重新安装一些软件,安装软件的时候又要上网查找安装的教程,比较麻烦,所以自己整理了MySQL5.7.21解压版的安装方法,以便查看. 1.首先,你要下载MySQL ...

  2. [Javascript] Customize Behavior when Accessing Properties with Proxy Handlers

    A Proxy allows you to trap what happens when you try to get a property value off of an object and do ...

  3. Python2.x与3​​.x版本区别Ⅲ

    八进制字面量表示 八进制数必须写成0o777,原来的形式0777不能用了:二进制必须写成0b111. 新增了一个bin()函数用于将一个整https://www.xuanhe.net/数转换成二进制字 ...

  4. Laravel 多态关联中利用关联表相关字段进行排序的问题

    1 目标 1.1 在 Laravel 项目的开发中,多态的需求很常见,按多态关联进行排序的需求也是必须的. 1.2 请想像,我们有一个需求,荣誉栏目多态关联一个档案模型,要求在荣誉中按档案的推荐时间进 ...

  5. whatis

    whatis 查看命令的说明文档位置及说明 是从数据库中取查找 手动更新数据库 并不是每个命令都有,

  6. Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...

  7. BZOJ 4898 Luogu P3778 [APIO2017]商旅 (分数规划、最短路)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4898 (luogu)https://www.luogu.org/probl ...

  8. python格式化输出(% format用法)

    %基本用法: 十进制输出:print('%d' % 6)    6也可以换成其它的数字变量 八进制输出:print('%o' % 6)  6也可以换成其它的数字变量 字符串输出:print('%s' ...

  9. Go之GOPATH与工作空间

    来自: GOPATH与工作空间 GOPOATH 设置 go 命令依赖一个重要的环境变量:$GOPATH 在类 Unix 环境下大概这样设置: exprt GOPATH=/home/apple/mygo ...

  10. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...