牛客网 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 ...
随机推荐
- ChartCtrl源码剖析之——CChartAxis类
CChartAxis类用来绘制波形控件的坐标轴,这个源码相对较复杂,当初阅读的时候耗费了不少精力来理解源码中的一些实现细节. CChartAxis类的头文件. #if !defined(AFX_CHA ...
- Bootstrap指定表格字段宽度
默认情况下,表格会占据屏幕所有宽度,可以使用bootstrap的布局功能.但表格标题字段的宽度必须与相应字段内容的宽度一致. <div class="container"&g ...
- vs2010统计代码行数
参考:http://www.cnblogs.com/zfanlong1314/archive/2013/03/08/2950100.html 正则表达式:^:b*[^:b#/]+.*$ 文件类型:*. ...
- bzoj 2303: [Apio2011]方格染色【并查集】
画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...
- bzoj 4176: Lucas的数论【莫比乌斯反演+杜教筛】
首先由这样一个结论: \[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1] \] 然后推反演公式: \[ \sum_{i=1}^{n}\sum_{j=1}^{n}\su ...
- centos 7 添加普通用户
adduser username username 是你要创建的用户名 passwd username 创建密码,输入个稍微复杂的 usermod -a -G wheel username 将用户加入 ...
- git 文件回滚
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file.场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第 ...
- Java中关键字continue、break和return的区别
Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break: 跳出循环体,继续执行循环外的函数体 return: 跳出整个函数 ...
- [poj2096] Collecting Bugs【概率dp 数学期望】
传送门:http://poj.org/problem?id=2096 题面很长,大意就是说,有n种bug,s种系统,每一个bug只能属于n中bug中的一种,也只能属于s种系统中的一种.一天能找一个bu ...
- 洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110
用树套树就很麻烦,用整体二分就成了裸题.... 错误: 1.尝试线段树套平衡树,码农,而且n*log^3(n)慢慢卡反正我觉得卡不过去 2.线段树pushdown写错...加法tag对于区间和的更新应 ...