# 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的更多相关文章

  1. 牛客网NOIP赛前集训营-提高组18/9/9 A-中位数

    链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. [牛客网NOIP赛前集训营-提高组(第一场)]C.保护

    链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...

  3. 牛客网 --java问答题

    http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...

  4. C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...

  5. 牛客网第9场多校E(思维求期望)

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...

  6. 牛客网暑期ACM多校训练营(第七场)Bit Compression

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...

  7. Beautiful Numbers(牛客网)

    链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...

  8. 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  9. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

随机推荐

  1. poj1419 求最大独立集

    题目链接:http://poj.org/problem?id=1419 题意:求最大独立集 思路: 这里有一个定理: 最大独立集=补图的最大团最大团=补图的最大独立集 所以这里我们只要求给出的图的最大 ...

  2. bzoj 4318: OSU!【期望dp】

    思路有点眼熟啊,就是设l1记录长为x的极长全1串贡献x的答案,l2记录长为x的极长全1串贡献x^2的答案,f记录真正的答案 转移的话根据n-(n-1)=1,n^2-(n-1)^2=2n-1,n^3-( ...

  3. jrebel永久免费使用教程,这个标题怎么样?不能带“激活”俩字?

    文章转载自:https://www.jiweichengzhu.com/article/33c0330308f5429faf7a1e74127c9708 如果还有问题,加群交流:686430774(就 ...

  4. centos 6.4 源码安装php5.4 mysql5.5 apahce2

    centos 6.4 源码安装php5.4 mysql5.5 apahce2 博客分类: php   参考:http://blog.csdn.net/simpleiseasy/article/deta ...

  5. 洛谷 P3808 【模板】AC自动机(简单版)洛谷 P3796 【模板】AC自动机(加强版)

    https://www.cnblogs.com/gtarcoder/p/4820560.html 每个节点的后缀指针fail指针指向: 例如he,she,his,hers的例子(见蓝书P214): 7 ...

  6. [转]Resolve Team Foundation Version Control conflicts

    本文转自:http://msdn.microsoft.com/en-us/library/ms181432.aspx An advantage of using Team Foundation ver ...

  7. 开发一个 Web App 必须了解的那些事

    在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...

  8. AJPFX解析成员变量和局部变量

    成员变量和局部变量 3.1.成员变量和局部变量 A:在类中的位置不同         * 成员变量:在类中方法外         * 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同   ...

  9. hihocoder编程练习赛52-3 部门聚会

    思路: 树形dp. 实现: #include <bits/stdc++.h> using namespace std; ; int n, a[MAXN], in[MAXN]; vector ...

  10. 11 DOM基础

    1.css   标签 js       元素 dom    节点,元素节点,属性节点,文本节点 2.dom浏览器支持率 ie      10% chrome   60% FF       99% 3. ...