比赛链接

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

  1. Nowcoder 提高组练习赛-R7

    Nowcoder 提高组练习赛-R7 https://www.nowcoder.com/acm/contest/179#question 中间空了两场,因为实在是太难了... 第五场的第二题好像还比较 ...

  2. nowcoder提高集训营第5场

    凉 (比赛链接)[https://www.nowcoder.com/acm/contest/177#question] T1 (题目链接)[https://www.nowcoder.com/acm/c ...

  3. Nowcoder 提高组练习赛-R3

    https://www.nowcoder.com/acm/contest/174#question 今天的题好难呀,只有94个人有分.然后我就爆零光荣 考到一半发现我们班要上物理课,还要去做物理实验( ...

  4. Nowcoder 提高组练习赛-R2

    https://www.nowcoder.com/acm/contest/173#question T1:https://www.nowcoder.com/acm/contest/173/A 题意概述 ...

  5. Nowcoder 提高组练习赛-R1

    https://www.nowcoder.com/acm/contest/172#question 单人报名300元,五人合报免费,于是就和学弟同学学长们组了一个三世同堂的队伍,高一的学长wzhqwq ...

  6. nowcoder 提高组模拟赛 选择题 解题报告

    选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...

  7. nowcoder 提高组模拟赛 最长路 解题报告

    最长路 链接: https://www.nowcoder.com/acm/contest/178/A 来源:牛客网 题目描述 有一张 \(n\) 个点 \(m\) 条边的有向图,每条边上都带有一个字符 ...

  8. nowcoder提高组2题解

    T1 化一下试子就ok code #include<cstdio> #include<algorithm> inline long long read() { long lon ...

  9. NOIP2018 游记 QAQ

    写在前面: 本人初三党.NOIP前两个月不好好停课搞信竞愣是要搞文化课.于是,期中考与NOIP一起凉凉[微笑] 本人写的第一篇NOIP游记,各位大佬们随便看一看就好 Day -n 初赛71,竟然跟wx ...

随机推荐

  1. Simulink--MATLAB中的一种可视化仿真工具

     Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模.仿真和分析的一个软件包,被广泛应用于线性系统.非线性系统.数字控制及数字信号处理的建 ...

  2. 笔记软件 notion

    笔记软件 notion :     https://www.notion.so 注册:zengxinle@126.com     团队:Hopesun

  3. Child Process模块

    目录 exec() execSync() execFile() spawn() fork() send() 参考链接 child_process模块用于新建子进程.子进程的运行结果储存在系统缓存之中( ...

  4. 在Asp.Net Core中使用中间件保护非公开文件

    在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) ...

  5. angular下载安装

    1.下载安装nodejs 官方地址:https://nodejs.org/en/download/   2.验证是否安装成功 node -v npm -v   公司内网需要设置代理 npm confi ...

  6. Centos socket TCP代码

    一.功能描述: 能够在Centos中创建TCP socket,实现Client给Server发送消息,Server能够Client发送消息. 二.代码如下: ①client代码: #include & ...

  7. ubuntu git hub 建立仓库

    https://www.cnblogs.com/woider/p/6533709.html 1.安装git apt-get install git 2.配置 Git 用户信息 把用户名和邮箱换成你自己 ...

  8. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...

  9. 《剑指offer》-数组中只出现一次的数字

    /* 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 如果是只有一个数字出现一次,那么所有数字做异或就得到结果: 现在有两个数字x,y分别出现一次 ...

  10. ***使用Fiddler抓取Android安卓手机的APP请求

    安装Fiddler,百度搜索Fiddler,就会有下载链接.   启动Fiddler,开始设置.点击“tools-->fiddler options”.   设置HTTPS选项.在设置过程中会有 ...