牛客网 nowcoder TG test-172
# solution-nowcoder-172
# A-中位数
- $30\%:n\le 200$
- 直接枚举 $n-len+1$ 个区间,将这段里的数重新排序直接找到中位数
- $60\%:n\le 2000$
- 用主席树维护,查询区间第 $k$ 小。时间复杂度是 $\Theta(n^2\log ^2n)$,我只过了 $50$ 分。应该是用平衡树维护,时间复杂度是$\Theta(n^2\log n)
- $100\%:n\le 10^5$
- 前缀和 $+$ 前缀最小值 $+$ 二分答案。二分一个 $mid$,判断一下行不行,如何判断?在长度为 $n$ 的序列中,用一个b数组记录一下,$a[i]>mid\rightarrow b[i]=1,a[i]<=mid\rightarrow b[i]=-1.$ 然后记录b数组的前缀和sum,边记录边维护前缀最小值,如果现在扫到的下标已经可以和前面的构成一个合法的区间了。那么就可以判断如果 $sum[i]-sum_{min}>0$ 证明可以最为中位数,return true。
# 代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
inline int read() {
int x = , f = ; char c = getchar();
while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while (c <= '' && c >= '') {x = x* + c-''; c = getchar();}
return x * f;
}
const int maxn = 1e5+;
int n, m, a[maxn], mx;
inline bool judge(int x) {
static int b[maxn];
for(int i=; i<=n; i++) {
if(a[i] < x) b[i] = -;
else b[i] = ;
}
int mn = ;
for(int i=; i<=n; i++) {
if(i >= m) mn = min(mn, b[i-m]);
b[i] = b[i-] + b[i];
if(i >= m && b[i] - mn > ) return true;
}
return false;
}
int main() {
n = read(), m = read();
for(int i=; i<=n; i++)
a[i] = read(), mx = max(mx, a[i]);
static int l = , r = mx, mid, ans;
while (l <= r) {
mid = (l + r) >> ;
if(judge(mid))
l = mid+, ans = mid;
else r = mid-;
}
printf("%d", ans);
}
# B-数数字
# 解题思路
数位 $dp$,看上去好像有$10^{18}$ 种状态,但实际上只有九十多万。
为什么呢?因为在 $0-9$ 中可以分为质数和合数($1$ 忽略):
- $4,6,8,9$
- $2,3,5,7$
非质数可以看做是质数的乘积。那就可以看成由 $2357$ 这几个数字的乘积作为状态。而且 $2357$ 的最大个数可以找出来,就可以凑出好多状态。这些状态就最为 $dp$ 数组的第二维。
然后按照数位 $dp$ 的套路做记忆化。要注意前导 $0$处理,前导 $0$ 如果放到乘积里会导致整个乘积都变为 $0$,所以要将前导状态的 $0$ 看做是 $1$。
下面的代码只有90QAQ。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define M 44800
#define ll long long
using namespace std;
ll read() {
ll nm = , f = ;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -;
for(; isdigit(c); c = getchar()) nm = nm * + c - '';
return nm * f;
}
ll cnt = ;
ll poww2[], poww3[], poww5[], poww7[];
ll dp[][M];
ll ff[][M];
int id[][][][];
ll l, r, ln, rn;
const ll up = 16677181699666568ll;
int num[];
ll dfs(int len, bool f, bool qian, int a, int b, int c, int d, ll now, ll upd, ll down) {
if(id[a][b][c][d] == ) return ;
if(len <= )
return (now >= down && now <= upd);
if(!f && dp[len][id[a][b][c][d]] != - && !qian && now != ) return dp[len][id[a][b][c][d]];
if(!f && ff[len][id[a][b][c][d]] != - && !qian && now == ) return ff[len][id[a][b][c][d]];
ll ans = , top = (f ? num[len]:);
if(qian) {
ans += dfs(len - , f &&(num[len] == ), true, a, b, c, d, now, upd, down);
}
else ans += dfs(len - , f &&(num[len] == ), false, a, b, c, d, , upd, down);
ll op = now;
if(now == && qian) now = ;
for(int i = ; i <= top; i++) {
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a, b, c, d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a + , b, c, d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a, b + , c, d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a + , b, c, d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a, b, c + , d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a + , b + , c, d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a, b, c, d + , now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a + , b, c, d, now * i, upd, down);
if(i == ) ans += dfs(len - , f &&(num[len] == i), false, a, b + , c, d, now * i, upd, down);
}
if(!f && !qian && now != ) dp[len][id[a][b][c][d]] = ans;
if(!f && !qian && now == ) ff[len][id[a][b][c][d]] = ans;
return ans;
}
ll solve(ll x, ll y, ll z) {
ll xn = x;
int tp = ;
if(x < ) return ;
while(x) {
num[++tp] = x % ;
x /= ;
}
memset(dp, -1ll, sizeof(dp));
ll as = dfs(tp, true, true, , , , , , y, z);
// cout << xn << " " << y << " " << as << "\n";
return as;
}
int main() {
l = read(), r = read(), ln = read(), rn = read();
poww2[] = poww3[] = poww5[] = poww7[] = ;
for(int i = ; i <= ; i++) {
poww2[i] = poww2[i - ] * ;
poww3[i] = poww3[i - ] * ;
poww5[i] = poww5[i - ] * ;
poww7[i] = poww7[i - ] * ;
}
for(int i = ; i <= ; i++) {
ll now = poww2[i];
if(now > up) break;
for(int j = ; j <= ; j++) {
ll a = now * poww3[j];
if(a > up) break;
for(int k = ; k <= ; k++) {
ll b = a * poww5[k];
if(b > up) break;
for(int l = ; l <= ; l++) {
ll c = b * poww7[l];
if(c > up) break;
id[i][j][k][l] = ++cnt;
}
}
}
}
cout << solve(r, rn, ln) - solve(l - , rn, ln)<< "\n";
return ;
}
牛客网 nowcoder TG test-172的更多相关文章
- 牛客网NOIP赛前集训营-提高组18/9/9 A-中位数
链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 牛客网 --java问答题
http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...
- C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...
- 牛客网第9场多校E(思维求期望)
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...
- 牛客网暑期ACM多校训练营(第七场)Bit Compression
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...
- Beautiful Numbers(牛客网)
链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...
- 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)
链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅
链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...
随机推荐
- 关于spring MVC中获取客户端的IP地址
1. 引入HttpServletRequest @Autowired private HttpServletRequest request; 2. 获取IP地址 private static Stri ...
- Android中string.xml中的的标签xliff:g(转载)
转自:http://blog.csdn.net/xuewater/article/details/25687987 在资源文件中写字符串时,如果这个字符串时动态的,又不确定的值在里面,我们就可以用xl ...
- IE6 浏览器常见兼容问题 大汇总(23个)[转载]
IE6以及各个浏览器常见兼容问题 大汇总 综述:虽然说IE6在2014年4月将被停止支持,但是不得不说的是,IE6的市场并不会随着支持的停止而立刻消散下去,对于WEB前端开发工程师来说,兼容IE6 兼 ...
- bzoj 3470: Freda’s Walk【拓扑排序+期望dp】
dfs会T,只好正反两遍拓扑了-- #include<iostream> #include<cstdio> #include<queue> #include< ...
- 关于python安装lxml插件的问题
文章只是介绍自己安装时从安装不上到安装后报错,再到安装成功的心路历程,并不代表广大欧皇也会会出现同类型的问题,也不是总结和汇总各种出问题的原因. 直接进入正题,首先我这边是win环境,电脑上装的是py ...
- linux 文件 chgrp、chown、chmod
linux 默认情况下有会提供6个terminal 来让用户登录,使用[Ctrl]+[Alt] +[F1]~[F6] 组合 linux 文件 任何一个文件都具有"user,Group及Oth ...
- 如何用C#动态编译、执行代码[转]
原文链接 在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assemb ...
- HBuilder的默认工作空间的修改
HBuilder的默认工作空间的修改并不像其他ide一样,在设置里进行更改,而是在工具中进行设置. 1.单击菜单栏“工具”,选择“变更默认代码存放目录” 2.进行修改即可.
- IOS - PDF合并 - 转
来自:http://www.cnblogs.com/tx8899/p/4082749.html #pragma mark - Merge PDF - (void)mergePDF { NSArray ...
- Solr中的group与facet的区别 [转]
Solr中的group与facet的区别 facet 自己理解就是分组聚合用的, 如下说明 http://blog.csdn.net/a925907195/article/details/472572 ...