Nowcoder 提高 Day1
比赛链接
A 中位数(前缀和 二分)
额,确实没想到逼近...
然后写了n^2log的暴力,还CE了
只需要判断是否能有大于当前mid的中位数就好
这显然是可以二分的
代码
#include<bits/stdc++.h>
using namespace std;
#define li long long
#define gc getchar()
#define pc putchar
li read(){
li x = 0,y = 0,c = gc;
while(!isdigit(c)) y = c,c = gc;
while(isdigit(c)) x = (x << 1) + (x << 3) + (c ^ '0'),c = gc;
return y == '-' ? -x : x;
}
void print(li q){
if(q < 0){
pc('-');
q = -q;
}
if(q >= 10) print(q / 10);
pc(q % 10 + '0');
}
int n,m;
int a[100010],b[100010],c[100010],d[100010];
bool chk(int p){
int i,j;
for(i = 1;i <= n;++i) b[i] = a[i] >= p ? 1 : -1;
for(i = 1;i <= n;++i) c[i] = c[i - 1] + b[i];
for(i = 1;i <= n;++i) d[i] = min(d[i - 1],c[i]);
for(i = n,j = -n;i >= m;--i){
j = max(j,c[i]);
if(j - d[i - m] > 0) return 1;
}
return 0;
}
int main(){
int i,j;
n = read();m = read();
for(i = 1;i <= n;++i) a[i] = read();
int l = 1,r = 1000000000,mid,as = 1;
while(l <= r){
mid = l + r >> 1;
if(chk(mid)) as = mid,l = mid + 1;
else r = mid - 1;
}
print(as);
return 0;
}
B 数数字(数位DP)
数位DP不会
不过yy一下,写个暴力dp,map转移似乎就...过了
代码
#include<iostream>
#include<cstdio>
#include<map>
#define LL long long
using namespace std;
inline LL read() {
char c = getchar(); LL x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
LL L, R, L1, R1;
map<LL, LL> f[20];
LL s[21], num = 0;
LL dfs(int x, int lim, LL mul) {
if(x < 0) return 0;
if(x == 0) {
if(mul == -1) mul = 0;
return mul >= L1 && mul <= R1;
}
if((!lim) && (f[x].find(mul) != f[x].end())) return f[x][mul];
LL ans = 0;
for(int i = 0; i <= (lim ? s[x] : 9); i++) {
if(mul == -1) {
if(i == 0) ans += dfs(x - 1, 0, -1);//tag
else ans += dfs(x - 1, lim && (i == s[x]), i);
} else ans += dfs(x - 1, lim && (i == s[x]), i * mul);
}
if(!lim) f[x][mul] = ans;
return ans;
}
LL solve(LL x) {
if(x == -1) return 0;
num = 0;
while(x) s[++num] = x % 10, x /= 10;
return dfs(num, 1, -1);
}
int main() {
L = read(); R = read(); L1 = read(); R1 = read();
LL ans = solve(R) - solve(L - 1);
cout << ans;
return 0;
}
C 保护(dfs序 主席树)
额,主席树维护一下子树中点能覆盖的第k小深度..就没了
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
struct sj{int to,next;}line[maxn*2];
int size,n,m,num,q,siz[maxn];
int head[maxn],id[maxn],tot,idx[maxn];
int a[maxn],b[maxn],c[maxn],T[maxn];
int L[maxn * 64],R[maxn * 64],sum[maxn * 64];
void add(int x,int y) {
line[++size].to=y;
line[size].next=head[x];
head[x]=size;
}
int old[maxn],deep[maxn];
int dad[maxn][27];
void dfs(int x,int fa = 0) {
siz[x] = 1;
++ num;
id[x]=num;
old[num]=x;
deep[x] = deep[fa] + 1;
for(int i=head[x];i;i=line[i].next) {
int tt=line[i].to;
if(!siz[tt]) {dad[tt][0] = x;
dfs(tt,x);
siz[x]+=siz[tt];
}
}
}
inline int lca(int x,int y) {
if(deep[x] > deep[y]) std::swap(x,y);
for(int i = 20;i >= 0;-- i) if(deep[dad[y][i]] >= deep[x]) y = dad[y][i];
if(x == y) return x;
for(int i = 20;i >= 0;-- i)
if(dad[x][i] != dad[y][i])
x = dad[x][i],y = dad[y][i];
return dad[x][0];
}
int build(int l,int r) {
int rt=++tot;
if(l!=r) {
int mid=(l+r)/2;
L[rt]=build(l,mid);
R[rt]=build(mid+1,r);
}
return rt;
}
int update(int pre,int l,int r,int x) {
int rt =++ tot;
L[rt]=L[pre];
R[rt]=R[pre];
sum[rt]=sum[pre] + 1;
int mid=(l+r)/2;
if(l!=r) {
if (x<=mid) L[rt]=update(L[pre],l,mid,x);
else R[rt]=update(R[pre],mid+1,r,x);
}
return rt;
}
int query(int x,int y,int l,int r,int k) {
if(l==r)return l;
int now=sum[L[y]]-sum[L[x]];
int mid=(l+r)/2;
if(now>=k) return query(L[x],L[y],l,mid,k);
else return query(R[x],R[y],mid+1,r,k-now);
}
vector<int> qq[maxn];
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++) {
int x,y; scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
dfs(1);
for(int i = 1;i <= 20;++ i)
for(int x = 1;x <= n;++ x) dad[x][i] = dad[dad[x][i - 1]][i - 1];
for(int u,v,i = 1;i <= m;++ i) {
scanf("%d%d",&u,&v);
int l = lca(u,v);
qq[u].push_back(deep[l]);
qq[v].push_back(deep[l]);
}
T[0]=build(1,n + 1);
for(int i=1;i <= n;i ++) {
if(qq[old[i]].size()) {
for(int j = 0;j < qq[old[i]].size();++ j) {
if(j == 0) T[i] = update(T[i - 1],1,n + 1,qq[old[i]][j]);
else T[i] = update(T[i],1,n + 1,qq[old[i]][j]);
}
}
else T[i] = update(T[i - 1],1,n + 1,n + 1);
}
scanf("%d",&q);
while(q--) {
int x,k;
scanf("%d%d",&x,&k);
int p=query(T[id[x]-1],T[id[x]+siz[x] - 1],1,n + 1,k);
printf("%d\n",std::max(deep[x] - p,0));
}
return 0;
}
Nowcoder 提高 Day1的更多相关文章
- Nowcoder 提高组练习赛-R7
Nowcoder 提高组练习赛-R7 https://www.nowcoder.com/acm/contest/179#question 中间空了两场,因为实在是太难了... 第五场的第二题好像还比较 ...
- nowcoder提高集训营第5场
凉 (比赛链接)[https://www.nowcoder.com/acm/contest/177#question] T1 (题目链接)[https://www.nowcoder.com/acm/c ...
- Nowcoder 提高组练习赛-R3
https://www.nowcoder.com/acm/contest/174#question 今天的题好难呀,只有94个人有分.然后我就爆零光荣 考到一半发现我们班要上物理课,还要去做物理实验( ...
- Nowcoder 提高组练习赛-R2
https://www.nowcoder.com/acm/contest/173#question T1:https://www.nowcoder.com/acm/contest/173/A 题意概述 ...
- Nowcoder 提高组练习赛-R1
https://www.nowcoder.com/acm/contest/172#question 单人报名300元,五人合报免费,于是就和学弟同学学长们组了一个三世同堂的队伍,高一的学长wzhqwq ...
- nowcoder 提高组模拟赛 选择题 解题报告
选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...
- nowcoder 提高组模拟赛 最长路 解题报告
最长路 链接: https://www.nowcoder.com/acm/contest/178/A 来源:牛客网 题目描述 有一张 \(n\) 个点 \(m\) 条边的有向图,每条边上都带有一个字符 ...
- nowcoder提高组2题解
T1 化一下试子就ok code #include<cstdio> #include<algorithm> inline long long read() { long lon ...
- NOIP2018 游记 QAQ
写在前面: 本人初三党.NOIP前两个月不好好停课搞信竞愣是要搞文化课.于是,期中考与NOIP一起凉凉[微笑] 本人写的第一篇NOIP游记,各位大佬们随便看一看就好 Day -n 初赛71,竟然跟wx ...
随机推荐
- numpy中 array数组的shape属性
numpy.array 的shape属性理解 在码最邻近算法(K-Nearest Neighbor)的过程中,发现示例使用了numpy的array数组管理,其中关于array数组的shape(状态)属 ...
- Django 利用管理器实现文章归档
Django管理器:class Manager 管理器是Django的模型进行数据库查询的接口,Django应用的每个模型都拥有至少一个管理器.默认情况下,Django为每个模型类添加一个名为obje ...
- VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)
在win下配置opencv3.0.0还是比较简单的,这里简单说一下配置过程:参考链接:http://blog.csdn.net/u010009145/article/details/50756751 ...
- C# 关于用7zip压缩文件提示win32exception 系统找不到文件解决方案(win7 x64)
网上已经很多这方面的资料了,我就简单的说下好了 为了方便以后的查看 --------------------- 1.需要下载7zSharp:http://7zsharp.codeplex.com/re ...
- Ex 3_17 无穷路径..._十一次作业
(a) Inf(p)在p中出现了无穷多次,说明Inf(p)存在一个环当中,所以这个环的顶点肯定是某一个强连通部件的子集. (b) 若G中存在一条无穷路径,则G中至少存在一个环,且这个环至少有两个顶点, ...
- Python-CSS高级 题目
一.简答1.完整总结display三种基础显示方式的显示方式与嵌套规则 /* inline */ /*1.同行显示, 就相当于纯文本, 当一行显示不下, 如就是一个字显示不下,那么显示不下的那一个字就 ...
- SQL日期时间和字符串函数
- iOS学习笔记之UITableViewController&UITableView
iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...
- linux下如何使用gdb调试
gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb下常用的命令. 首先编译生成可执行文件(这里的test.c是一个简单的求前n ...
- bootstrap 文本对齐风格
Bootstrap通过定义四个类名来控制文本的对齐风格: ☑ .text-left:左对齐 ☑ .text-center:居中对齐 ☑ .text-right:右对齐 ☑ .text- ...