题解:

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

  1. 牛客网 --java问答题

    http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...

  2. 牛客网《BAT面试算法精品课》学习笔记

    目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...

  3. C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...

  4. 牛客网第9场多校E(思维求期望)

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...

  5. 牛客网暑期ACM多校训练营(第七场)Bit Compression

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...

  6. Beautiful Numbers(牛客网)

    链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...

  7. 牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  8. 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  9. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

随机推荐

  1. 使用Boost Regex 的regex_search进行遍历搜索

    在regex_search函数中,会将找到的第一个匹配结果保存到一个smatch类中. 然而如果搜索字符串中有多个匹配结果,则需要自己实现了. 在smatch中,有两个成员,官方文档如下: itera ...

  2. c++不定参数函数

    不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多.除了格式化输出之外,我实在没看到多少应用.主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替 ...

  3. why should the parameter in copy construction be a reference

    if not, it will lead to an endless loop!!! # include<iostream> using namespace std; class A { ...

  4. jenkins每次构建前删除工作目录操作

    背景: 想在拉取代码前,删除代码,结果百度白天找到答案,mark下 需要安装Workspace Cleanup Plugin插件, 再看创建任务项,勾选即可实现

  5. [MySQL]子语句的查询技巧

    一.统计group by语句的行数 group by语句中,如果包含字段统计函数(诸如:count(),sum()...),这种情况下统计函数只会作用于group by的字段,因此想拿到最终结果的行数 ...

  6. GZip、deflate和sdch压缩(网摘整理)

    GZip和deflate: gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代 ...

  7. Python-Numpy数组计算

    一.NumPy:数组计算 1.NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础.2.NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环 ...

  8. 分页插件pagination.js

    项目中有分页功能,之前都是自己写,样式不好看,功能也简单,就找了这个插件pagination.js 页面导入pagination.js html代码 <div class="list_ ...

  9. SSM框架应用

    一.更新用户密码功能的实现 1. 新建页面 profile.jsp,添加三个输入框和提交按钮:用户输入当前密码.输入新密码.再次确认密码和重置按钮.修改密码按钮: 2. 前台 js(JavaScrip ...

  10. Confluence 6 禁用或者重新启用一个任务

    在默认的情况下,所有的 Confluence 计划任务都是默认启用的. 使用 启用(Disable )/ 禁用(Enable )连接操作来启用和禁用每一个计划任务. 不是所有的加护任务都可以被禁用的. ...