牛客网 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 ...
随机推荐
- hdu6035
树形dp 并没有想出来... 这个点分治很明显做不了,没办法批量处理信息,那么我们就只能考虑树形dp了,然后觉得用虚树什么的每个颜色单独考虑,GG 事实上我们可以这样考虑,我们对树进行dfs,每个节点 ...
- Mysql数据库的用户和日志管理
Mysql数据库的用户和日志管理 数据库的用户管理 1.mysql用户账号管理 用户账号 user@host user:账户名称 host:此账户可通过哪些客户端主机请求创建连接线程,可以是ip.主机 ...
- ArcGIS for JavaScript 3.9 本机IIS部署
arcgis 官方网站经常会打不开,天朝人民都懂得!因此将arcgis for javascript 配置到本机访问 首先esri中国下载最新版3.9的API: http://support.esri ...
- 你不知道的Eclipse用法:全局搜索和更替 (转载)
转自:http://blog.csdn.net/p106786860/article/details/9162537 Eclipse中全局搜索和更替 Eclipse全局搜索步骤 使用快捷键“ctrl+ ...
- NOIp 2010/Luogu P1525 关押罪犯 【二分图/并查集】 By cellur925
题目传送门 感想:相信自己的想法!继续挖掘! 读完题目后:看到的最大值最小?二分答案啊!再仔细一看:wi达到了1e9,二分可能费点劲.(其实真的是可以的)而且check函数貌似并没有什么行之有效的写法 ...
- 1.1.1最短路(Floyd、Dijstra、BellmanFord)
转载自hr_whisper大佬的博客 [ 一.Dijkstra 比较详细的迪杰斯特拉算法讲解传送门 Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkstra常常作为其他算 ...
- 牛客网暑期ACM多校训练营(第五场)
J-plan(贪心) 题目描述 There are n students going to travel. And hotel has two types room:double room and t ...
- ORA-00020: maximum number of processes (300) exceeded
SQL> select count(*) from v$session; COUNT(*)---------- 98 SQL> select count(*) from v$process ...
- 187 Repeated DNA Sequences 重复的DNA序列
所有DNA由一系列缩写为A,C,G和 T 的核苷酸组成,例如:“ACGAATTCCG”.在研究DNA时,识别DNA中的重复序列有时非常有用.编写一个函数来查找DNA分子中所有出现超多一次的10个字母长 ...
- AJPFX总结JAVA基本数据类型
1:关键字(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: ...