# 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. Jquery选择器大全、属性操作、css操作、文档、事件等

    一.简介   定义  jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. jQuery对象  jQuery产 ...

  2. IDEA Terminal

    如果IDEA在Terminal中无法使用环境变量,提示没有此命令的话,请查看在cmd中是否可以正常使用,然后,请右击IDEA以管理员方式进行运行,Terminal就可以正常使用了

  3. HDU1180:诡异的楼梯

    传送门 题意 迷宫搜索 分析 这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据 trick 1.遇到梯 ...

  4. HDU1072:Nightmare [DFS]

    题目链接:Nightmare 题意: 给出一张n*m的图,0代表墙,1代表可以走,2代表起始点,3代表终点,4代表炸弹重置点 问是否能从起点到达终点 分析: 一道很好的DFS题目,炸弹重置点必然最多走 ...

  5. pytest特色与实用插件

    pytest特色 1.fixture的特点 fixture是pytest特有的功能,其特点如下: 必须用pytest.fixture装饰器装饰:fixture有明确的名字,在其他函数(function ...

  6. 线程池之ThreadPoolExecutor使用

    ThreadPoolExecutor机制  一.概述 1.ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线 ...

  7. 安装 Spring 框架库

    下载地址:http://repo.spring.io/release/org/springframework/spring

  8. 执行linux脚本出现问题

    1. 权限不够: 使用 chmod +x XXX.sh 提升权限 2. 出现:/bin/bash^M: bad interpreter: No such file or directory 原因:文件 ...

  9. Hdu 5352 MZL's City (多重匹配)

    题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...

  10. mysql 中 时间函数 now() current_timestamp() 和 sysdate() 比较

    转载请注明出处 https://www.cnblogs.com/majianming/p/9647786.html 在mysql中有三个时间函数用来获取当前的时间,分别是now().current_t ...