NowCoder 9.9 模拟赛
T1.中位数
二分答案x,原序列大于x的置为1,小于x的置为-1,判断是否存在长度大于m的区间和大于0(也就是大于x的数多于小于x的数),若有,则ans>=x,否则ans<x
#include<iostream>
#include<cstdio> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=; int n,m; int a[MAXN],b[MAXN];
bool check(int x){
int mn=<<;
for(int i=;i<=n;i++)b[i]=a[i]<x?-:;
for(int i=;i<=n;i++){
if(i>=m) mn=min(mn,b[i-m]);
b[i]+=b[i-];
if(i>=m&&b[i]>mn)return ;
}
return ;
} int main(){
n=rd();m=rd();
int l=,r=<<,mid,ans;
for(int i=;i<=n;i++) a[i]=rd();
while(l<=r){
mid=l+r>>;
if(check(mid))ans=mid,l=mid+;
else r=mid-;
}
cout<<ans;
return ;
}
T2.数数字
数位DP还行,记忆化搜索实现
#include<iostream>
#include<cstdio>
#include<map> using namespace std; typedef long long ll; inline ll rd(){
ll ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=; int a[MAXN];
ll l,r,l1,r1;
map<ll,ll> mp[MAXN]; ll dfs(int cur,ll sum,ll lim,ll xzero){
if(!cur){
if(xzero) sum=;
return (l1<=sum&&sum<=r1);
}
if(!xzero&&!lim&&mp[cur].count(sum))return mp[cur][sum];
ll ret=;
int mx=;
if(lim)mx=a[cur];
for(int i=;i<=mx;i++){
if(xzero)ret+=dfs(cur-,(i==)?1ll:i*1ll,lim&&(i==mx),xzero&&(i==));
else ret+=dfs(cur-,sum*1ll*i,lim&&(i==mx),xzero&&(i==));
}
if(!xzero&&!lim)mp[cur][sum]=ret;
return ret;
} ll solve(ll x){
int cnt=;
while(x){
a[++cnt]=x%;
x/=;
}
return dfs(cnt,,,);
} int main(){
l=rd();r=rd();l1=rd();r1=rd();
cout<<solve(r)-solve(l-);
return ;
}
T3.保护
ErkkiErkko的主席树想法
#include<iostream>
#include<cstdio>
#include<vector> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=; int n,m,q;
vector<int> vec[MAXN]; int rt[MAXN]; struct Edge{
int next,to;
}e[MAXN<<];
int ecnt,head[MAXN];
inline void add(int x,int y){
e[++ecnt].next = head[x];
e[ecnt].to = y;
head[x] = ecnt;
} int fa[MAXN],hson[MAXN],siz[MAXN],dep[MAXN];
int top[MAXN],id[MAXN],tim=;
int ll[MAXN],rr[MAXN];
void dfs1(int x,int pre){
fa[x]=pre;siz[x]=;dep[x]=dep[pre]+;
ll[x]=++tim;id[tim]=x;
int mx=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==pre) continue;
dfs1(v,x);siz[x]+=siz[v];
if(siz[v]>mx){mx=siz[v];hson[x]=v;}
}
rr[x]=tim;
} void dfs2(int x,int tp){
top[x]=tp;
if(hson[x])dfs2(hson[x],tp);
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==fa[x]||v==hson[x]) continue;
dfs2(v,v);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
return dep[x]<=dep[y]?x:y;
}
int ch[MAXN*][],val[MAXN*],tot;
void update(int x,int &cur,int l,int r){
int f=cur;cur=++tot;val[cur]=val[f]+;
ch[cur][]=ch[f][];ch[cur][]=ch[f][];
if(l==r)return;
int mid=l+r>>;
if(x<=mid)update(x,ch[cur][],l,mid);
else update(x,ch[cur][],mid+,r);
}
int query(int cur,int l,int r,int f,int K){
if(val[f]-val[cur]<K) return -;
if(l==r)return l;
int mid=l+r>>;
if(K<=val[ch[f][]]-val[ch[cur][]])
return query(ch[cur][],l,mid,ch[f][],K);
return query(ch[cur][],mid+,r,ch[f][],K-(val[ch[f][]]-val[ch[cur][]]));
} int main(){
int x,y;
n=rd();m=rd();
for(int i=;i<n;i++){
x=rd();y=rd();add(x,y);add(y,x);
}
dfs1(,);dfs2(,);
for(int i=;i<=m;i++){
x=rd();y=rd();
int z=lca(x,y);
vec[x].push_back(dep[z]);
vec[y].push_back(dep[z]);
}
for(int i=;i<=n;i++){
rt[i]=rt[i-];
int up=vec[id[i]].size();
for(int j=;j<=up-;j++){
update(vec[id[i]][j],rt[i],,n);
}
}
q=rd();
int ans=;
for(int i=;i<=q;i++){
x=rd();y=rd();
if(!y)ans=dep[x]-dep[];
else{
int tmp=query(rt[ll[x]-],,n,rt[rr[x]],y);
if(tmp==-||tmp>=dep[x])ans=;
else ans=dep[x]-tmp;
}
printf("%d\n",ans);
}
}
NowCoder 9.9 模拟赛的更多相关文章
- 「NOWCODER」CSP-S模拟赛第3场
「NOWCODER」CSP模拟赛第3场 T1 货物收集 题目 考场思路即正解 T2 货物分组 题目 考场思路 题解 60pts 算法:一维 DP 100pts 算法:一维 DP ?线段树 + 单调栈 ...
- 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(牛客网)提高组模拟赛第一场 解题报告
T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
随机推荐
- Luogu P1637 三元上升子序列【权值线段树】By cellur925
题目传送门 emmm..不开结构体的线段树真香! 首先我们知道"三元上升子序列"的个数就是对于序列中的每个数,**它左边比他小的数*它右边比他大的数**.但是如何快速求出这两个数? ...
- gitlab之source tree使用方法
一.简介 1.source tree 是什么 可视化项目版本控制软件,使用git项目管理,支持windows/mac 客户端使用source tree开发源码,图形化提交到gitlab 二.使用sou ...
- 从各处收集的switch语句
重构之重复代码: 1.(重复代码是)语义一致的逻辑 反例:语义一致的逻辑产生了多个实体 缺点:如果你为语义一致的逻辑产生了多个实体,那么当需要修改这个逻辑时,你必须保证同时修改所有的实体,并确保它们是 ...
- Python面向对象之单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某 一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就 能派上用场. 单例 ...
- [软件工程基础]2017.11.05 第九次 Scrum 会议
具体事项 项目交接燃尽图 每人工作内容 成员 已完成的工作 计划完成的工作 工作中遇到的困难 游心 #10 搭建可用的开发测试环境:#9 阅读分析 PhyLab 后端代码与文档:#8 掌握 Larav ...
- [HNOI2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于××师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- python HTTP 状态码
404 Not Found 在HTTP请求的路径无法匹配任何RequestHandler类相对应的模式时返回404(Not Found)响应码. 400 Bad Request 如果你调用了一个没有默 ...
- python Fuction 方法的调用
def display():#无参数 print("No") return # display() def callfun():#调用 print("2") d ...
- 小G的城堡
B 小 G 的城堡文件名 输入文件 输出文件 时间限制 空间限制castle.pas/c/cpp castle.in castle.out 1s 128MB题目描述小 G 家有一座城堡.城堡里面有 n ...
- Java开发笔记(九十七)利用Runnable启动线程
前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...