牛客网round1
题解:
1.
二分答案之后判断
把式子移项使得x,y不关联
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
const int N=3e5;
int a[N],sum[N],n,m;
const int INF=1e9;
bool check(int x)
{
sum[]=;
int mina=-INF;
rep(i,,n)
{
if (a[i]<x) sum[i]=sum[i-]+; else sum[i]=sum[i-];
if (i-m+>) mina=max(mina,*sum[i-m]-(i-m+));
if (*sum[i]-i<=mina) return();
}
return();
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m;
rep(i,,n) cin>>a[i];
int h=,t=INF;
while (h<t)
{
int mid=(h+t+)>>;
if (check(mid)) h=mid; else t=mid-;
}
cout<<h<<endl;
return ;
}
2.
数位dp
考虑10个数字一共有18个
C(27,9) 算一下发现不大
然后就直接记忆化搜索就行了
数比较大可以用map记录
但好像比较慢于是改了hash
然后有3个点是考细节的
后面两个是map如果初值为0就炸了 可能之后一直为0 因为y可以是-1
另外一个是0要特殊考虑dfs(0)
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define ll long long
#define mp(x,y) make_pair(x,y)
ll l,n,m,f[];
int cnt=;
const int mo=6e6+;
struct re{
bool a,b;
short c;
ll d,ans;
}hs[mo+];
queue<int> q;
struct hash{
ll find(bool a,bool b,short x,ll y)
{
int t1=((1ll*x%mo*y%mo)%mo+mo)%mo;
while (hs[t1].c&&!(hs[t1].a==a&&hs[t1].b==b&&hs[t1].c==x&&hs[t1].d==y))
t1++,cnt++;
if (hs[t1].c) return(hs[t1].ans);
return(-);
}
void insert(bool a,bool b,short x,ll y,ll ans)
{
int t1=((1ll*x%mo*y%mo)%mo+mo)%mo;
while (hs[t1].c) t1++,cnt++;
hs[t1].a=a; hs[t1].b=b; hs[t1].c=x; hs[t1].d=y; hs[t1].ans=ans;
q.push(t1);
}
void clear()
{
while (!q.empty())
{
int x=q.front(); q.pop();
hs[x].c=hs[x].ans=;
}
}
}M;
ll dfs(short x,ll y,bool z,bool kk)
{
cnt++;
ll ans1=M.find(z,kk,x,y);
if (ans1!=-) return(ans1);
if (x==l+)
{
if (kk==) y=;
if (y<=m)
{
return();
}
return();
}
ll ans=;
rep(i,,)
if (i==&&kk==) ans+=dfs(x+,,,);
else
{
if (z==)
{
if (i<f[x]) ans+=dfs(x+,y*i,,);
if (f[x]==i) ans+=dfs(x+,y*i,,);
} else ans+=dfs(x+,y*i,,);
}
M.insert(z,kk,x,y,ans);
return(ans);
}
ll js(ll x,ll y)
{
if (x<) return();
M.clear();
ll tmp=x; l=;
if (x==) l=,f[]=;
while (tmp) l++,f[l]=tmp%,tmp/=;
reverse(f+,f+l+);
m=y;
return dfs(,,,);
}
int main()
{
ios::sync_with_stdio(false);
ll x1,x2,y1,y2;
cin>>x1>>x2>>y1>>y2;
cout<<js(x2,y2)
-js(x2,y1-)-
(js(x1-,y2)-
js(x1-,y1-))<<endl;
return ;
}
3.
大体思路就是差分来做
刚开始傻逼的写了直接dfs拿线段树来维护。。
这样显然是有问题的。。。
并且,我的树上二分也很傻比。。。
取了比它深度浅的二分所以既要多写代码又要多写细节。。
拍完了细节才发现要改成线段树合并
5min改完就a了。。
另外一种做法是主席树+二分 二分部分和这种做法一样
主席树就是维护dfs序也和这个基本一样
利用相减表示出当前子树
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)>>1)
const int N=3e5;
int head[N],l,dep[N],bz[N][],ans[N];
vector<int> ve[N],ve3[N];
struct re{
int a,b;
}a[N*];
vector<re> ve2[N];
void arr(int x,int y)
{
a[++l].a=head[x];
a[l].b=y;
head[x]=l;
}
void dfs(int x,int y)
{
bz[x][]=y; dep[x]=dep[y]+;
for (rint u=head[x];u;u=a[u].a)
{
rint v=a[u].b;
if (v!=y) dfs(v,x);
}
}
int lca(int x,int y)
{
if (dep[x]<dep[y]) swap(x,y);
dep(i,,) if (dep[bz[x][i]]>=dep[y]) x=bz[x][i];
if (x==y) return(x);
dep(i,,) if (bz[x][i]!=bz[y][i]) x=bz[x][i],y=bz[y][i];
return(bz[x][]);
}
int f[N],ph[N],pt[N],num,n,m,root[N];
struct sgt{
int v[N*],ls[N*],rs[N*],cnt;
#define updata(x) v[x]=v[ls[x]]+v[rs[x]]
void change(int &x,int h,int t,int pos,int k)
{
if (pos<=) return;
if (!x) x=++cnt;
if (h==t)
{
v[x]+=k; return;
}
if (pos<=mid) change(ls[x],h,mid,pos,k);
else change(rs[x],mid+,t,pos,k);
updata(x);
}
int query(int x,int h,int t,int h1,int t1)
{
if (h1<=h&&t<=t1) return(v[x]);
int ans=;
if (h1<=mid) ans+=query(ls[x],h,mid,h1,t1);
if (mid<t1) ans+=query(rs[x],mid+,t,h1,t1);
return(ans);
}
void find(int x,int h,int t,int h1,int t1)
{
if (h1<=h&&t<=t1)
{
f[++num]=x; ph[num]=h; pt[num]=t;
return;
}
if (h1<=mid) find(ls[x],h,mid,h1,t1);
if (mid<t1) find(rs[x],mid+,t,h1,t1);
}
int find2(int x,int h,int t,int k)
{
if (h==t)
{
if (v[x]>=k) return(h);
else return(h+);
}
if (v[rs[x]]<k) return(find2(rs[x],mid+,t,k));
else return(find2(ls[x],h,mid,k-v[rs[x]]));
}
int query2(int kk,int x,int y)
{
int k1=y-query(kk,,n,dep[x]+,n);
num=; find(kk,,n,,dep[x]);
dep(i,num,)
{
if (v[f[i]]>=k1) k1-=v[f[i]];
else return(find2(f[i],ph[i],pt[i],k1));
}
return();
}
int merge(int x,int y)
{
if (!x||!y) return(x|y);
v[x]+=v[y];
ls[x]=merge(ls[x],ls[y]);
rs[x]=merge(rs[x],rs[y]);
return(x);
}
}S;
void dfs2(int x,int y)
{
for (rint u=head[x];u;u=a[u].a)
{
rint v=a[u].b;
if (v!=y) dfs2(v,x),root[x]=S.merge(root[x],root[v]);
}
int l=(int)(ve3[x].size())-;
rep(i,,l)
{
S.change(root[x],,n,dep[x],);
S.change(root[x],,n,dep[ve3[x][i]]-,-);
}
l=(int)(ve2[x].size())-;
rep(i,,l)
{
int x1=ve2[x][i].a,y1=ve2[x][i].b;
ans[x1]=dep[x]-S.query2(root[x],x,y1);
}
l=(int)(ve[x].size())-;
rep(i,,l)
{
S.change(root[x],,n,dep[x]-,);
S.change(root[x],,n,dep[ve[x][i]],-);
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
rep(i,,n-)
{
int x,y;
cin>>x>>y;
arr(x,y); arr(y,x);
}
dfs(,);
rep(i,,)
rep(j,,n)
bz[j][i]=bz[bz[j][i-]][i-];
rep(i,,m)
{
int x,y;
cin>>x>>y;
int k=lca(x,y);
ve[k].push_back(x); ve[k].push_back(y);
ve3[x].push_back(k); ve3[y].push_back(k);
}
int q;
cin>>q;
rep(i,,q)
{
int x,t;
cin>>x>>t;
ve2[x].push_back((re){i,t});
}
dfs2(,);
rep(i,,q) cout<<max(,ans[i])<<endl;
return ;
}
牛客网round1的更多相关文章
- 牛客网 --java问答题
http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...
- 牛客网《BAT面试算法精品课》学习笔记
目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...
- 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 ...
- 牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 牛客网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 ...
随机推荐
- 题解-bzoj3569 DZY Loves Chinese II
Problem bzoj 题意概要:给定\(n\)点\(m\)边无向连通图,\(Q\)次询问删除\(k\)条边后是否仍然连通,强制在线 Solution 半年前考到过这类题目(询问删除任意两条边使得图 ...
- Win2008R2配置WebDeploy发布网站
一.配置服务器 1.安装管理服务 2.点击管理服务进行配置 二.安装WebDeploy 2.1通过离线安装包方式安装: https://www.iis.net/downloads/microsoft/ ...
- oracle procedure存储过程
1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS/AS 变量1 ; 变量2 DATE: BEG ...
- Apollo 启动脚本解析
Apollo 启动脚本解析 sudo service docker start -- 是在ubuntu14.04中打开 在dev_start.sh脚本中会调用restart_map_volume.sh ...
- Vue 指令篇 案例(输入提交显示 提交数据_列表)
一.文本操作指令 //1.v-text <p v-text="msg"></p> 等价于 <p>{{msg}}</p> //2.v- ...
- 快速安装freeswitch
前不久在Centos 6.4上安装了一台Freeswitch,测试已经OK.为了测试FS 的集群效果,从新在安装一台FS,快速安装的过程如下: 方案一:快速安装前提:不用重新下载Freeswitch. ...
- Eleaticsearch源码分析(一)编译启动
转自:https://lunatictwo.github.io/2017/12/21/Eleaticsearch%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90(%E4%B8% ...
- PYTHON- 操作系统和python程序
操作系统基础 应用程序的启动:(重点!!!) python解释器安装,多版本共存 执行python程序的两种方式 运行一个python程序经历的三个阶段(重要) python 的内存管理 ====== ...
- 分布式全文检索引擎之ElasticSearch
一 什么是 ElasticSearch Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elas ...
- swift 实践- 08 -- UISegmentedControl
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...