牛客网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 ...
随机推荐
- Boost多线程编程
Boost多线程编程 背景 • 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时, ...
- a.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import os import sys import re import shutil import glob d ...
- MD5加密算法工具类
import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorith ...
- 转载:Eureka 开发时快速剔除失效服务
原文地址:https://www.cnblogs.com/flying607/p/8494568.html 服务端配置: # 关闭保护机制 eureka.server.enable-self-pres ...
- java后台发送请求并获取返回值(续)
在java后端发送请求给另一个平台,从而给前端实现 "透传"的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀 ...
- 前端-----JavaScript 初识基础
JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:操作网页上的 ...
- bootstrap的treeview使用方法
首先引入文件: <link href="./css/bootstrap.css" rel="stylesheet"> <script src= ...
- android招聘啦,美图秀秀欢迎你加入!
前言 最近朋友公司招聘,美图秀秀大家一定很熟悉吧,欢迎你的加入. 了解相关更多技术以外的,可参考<除了敲代码,你还有什么副业吗?>,再往下看,今天给需要换工作或者还未找到工作的童鞋们谋一个 ...
- 处理:“ORA-28002: the password will expire within 7 days”的问题
一:问题描述: 二:处理步骤 [oracle@localhost 2018_07_14]$ rlwrap sqlplus / as sysdba; SQL*Plus: Release 11.2.0.3 ...
- TeamLab安装及使用
http://blog.csdn.net/crazin/article/details/9529061 最近想装个项目管理管理系统方便项目管理,调研了下这方面开源的软件还是比较多的,国内的有禅道,试用 ...