T1 爬山

二分最高高度,$O(1)$判断是否可行。

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n,d,a,b,ans;
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
bool check(ll x)
{
ll ha=(x-a)/d,hb=(x-b)/d;
if(d*ha<x-a) ha++;
if(d*hb<x-b) hb++;
if(ha+hb<=n-) return true;
return false;
}
int main()
{
n=read();d=read();a=read();b=read();
if(n==){
printf("%lld\n",max(a,b));
return ;
}
ll l=max(a,b),r=d*(n-),mid;
while(l<=r){
mid=(l+r)>>;
if(check(mid)){
ans=mid;
l=mid+;
}
else r=mid-;
}
printf("%lld\n",ans);
return ;
}

爬山

T2 学数数

先离散化,用单调栈维护以一个数$x$为最大值,向左到哪,向右到哪,左$×$右就是一共有多少个区间以$x$为最大值。

用前缀和维护以$x$为最大值的区间有多少个,询问的时候$lower_bound$二分位置直接查询。

对于后$40%$的数据中,存在重复的数,那么找左右边界的时候左闭右开(左开右闭也可以),就可以避免这种情况。

记得开$long long$

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
using namespace std;
struct node
{
ll x,id,l,r;
}h[];
ll n,Q,t[],p[];
stack<node>s;
set<ll>st;
map<ll,ll>mp;
char ch[];
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
bool cmp1(node a,node b)
{
return a.x<b.x;
}
bool cmp2(node a,node b)
{
return a.id<b.id;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("4.out","w",stdout);
n=read();Q=read();
for(int i=;i<=n;i++){
h[i].x=read();
h[i].id=i;
st.insert(h[i].x);
}
ll num=;
while(st.size()){
mp[*st.begin()]=++num;
p[num]=*st.begin();
st.erase(*st.begin());
}
sort(h+,h+n+,cmp1);
for(int i=;i<=n;i++) h[i].x=mp[h[i].x];
sort(h+,h+n+,cmp2);
for(int i=;i<=n;i++){
ll x=h[i].x;
while(s.size()&&s.top().x<=x) s.pop();
if(s.size()) h[i].l=s.top().id+;
else h[i].l=;
s.push(h[i]);
}
while(s.size()) s.pop();
for(int i=n;i>=;i--){
ll x=h[i].x;
while(s.size()&&s.top().x<x) s.pop();
if(s.size()) h[i].r=s.top().id;
else h[i].r=n+;
s.push(h[i]);
}
sort(h+,h+n+,cmp1);
for(int i=;i<=n;i++){
t[h[i].x]=t[h[i-].x]+(h[i].id-h[i].l+)*(h[i].r-h[i].id);
}
ll x;
for(int i=;i<=Q;i++){
scanf("%s",ch);x=read();
ll pos=lower_bound(p+,p+num+,x)-p;
if(ch[]=='>'){
if(p[pos]==x) printf("%lld\n",t[num]-t[pos]);
else printf("%lld\n",t[num]-t[pos-]);
}
if(ch[]=='='){
if(p[pos]==x) printf("%lld\n",t[pos]-t[pos-]);
else puts("");
}
if(ch[]=='<'){
if(p[pos]==x) printf("%lld\n",t[pos-]);
else printf("%lld\n",t[pos-]);
}
}
return ;
}

学数数

T3 七十和十七

设$f[i]$为长度为$i$的序列(不是排列)中计数器的大小。假设现在已知$f[i-1]$

那么第$i$位与前面的相对大小关系一共有i种

1.第$i$位相对大小为i,对计数器没有任何影响,直接转移 $f[i]=f[i-1]$

2.第$i$位相对大小小于$i$ (即$1~i-1$),设为$j$,那么计数器的值就需要增加$2^{j-1}$ (可以拿几个数试一下),对于前$i-1$个数,他们的顺序有$(i-1)!$种,所以$ f[i]=f[i-1]+2^{j-1}*(i-1)!$

综上,

$f[i]=f[i-1]+(f[i-1]+2^{1-1}*(i-1)!)+(f[i-1]+2^{2-1}*(i-1)!)+(f[i-1]+2^{3-1}*(i-1)!)...+(f[i-1]+2^{i-1-1}*(i-1)!)$

发现$2$的多少次方是一个等比数列,可以直接用前$i-1$项和公式求出来,剩下$i$个$f[i-1]$相加

最终得到$f[i]=f[i-1]*i+(2^{i-1}-1)*(i-1)!$

答案即为$f[n]/n!$

#include<iostream>
#include<cstdio>
#define mod 1000000007
#define ll long long
using namespace std;
ll n,ans,f[];
ll quick(ll x,ll p)
{
ll as=;
while(p){
if(p&) as=as*x%mod;
x=x*x%mod;
p>>=;
}
return as;
}
int main()
{
scanf("%lld",&n);
ll sum=,tot=;
for(ll i=;i<=n;i++){
f[i]=(f[i-]*i%mod+(tot-)*sum%mod)%mod;
tot=tot*%mod;
sum=sum*i%mod;
}
printf("%lld\n",f[n]*quick(sum,mod-)%mod);
return ;
}

七十和十七

8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七的更多相关文章

  1. NOIP模拟测试29「爬山·学数数·七十和十七」

    爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...

  2. NOIP模拟测试29(A)

    T1: 题目大意:有一张有向无环图,第$x$次经过边$i$的代价为$a_ix+b_i$,最多经过$c_i$次,起点为1,$s$个点可作为终点,求走$k$次的最小代价. 我们新建一个汇点,将所有可做为终 ...

  3. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  4. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  5. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  9. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

随机推荐

  1. python-1-基础认识

    前言 将近2020年,python2即将不再更新,但是我们现在的python3也能非常受欢迎的!回顾一下2/3的区别: 1.python2 源码不标准,混乱,重复代码太多, 2.python3 统一 ...

  2. linux 文件详细信息

    权限列: 权限列中一共 10 个字符,第一个字符代表文件类型,后边9 个字符 3 个为一组表示不同用户的权限: 第一字符表示文件类型: [d]:目录 [-]:普通文件 [l]:连接档 [b]:设备文件 ...

  3. oracle中如何更改一个表的一个字段属性(名称,类型)

    修改字段的属性,名称方法 --修改某一个字段的类型,当该字段不为null时alter table 表名add 字段NUMBER(11,0) default 0 not null;--添加表一个字段 A ...

  4. ubuntu16.04安装QGIS工具

    指令安装安装qgis可以通过添加安装源的形式进行 sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable sudo apt-get updat ...

  5. 博客中新浪图床 迁移至 阿里云的OSS

    前言 因为之前有个新浪的图床,还挺好用,而且免费,自己博客的图片上传到其上面也挺方便的,但是,前几周吧,突然图片就不能访问了,之前本来是想通过添加 meta 头来解决的,但是发现没有效果.于是就自己搞 ...

  6. 镭神激光雷达对于Autoware的适配

    1. 前言 我们的自动驾驶采用镭神激光雷达,在使用Autoware的时候,需要对镭神激光雷达的底层驱动,进行一些改变以适配Autoware. 2. 修改 (1)首先修改lslidar_c32.laun ...

  7. 【转】Git GUI基本操作

    一.Git GUI基本操作 1.版本库初始化 gitpractise文件夹就变成了Git可以管理的仓库,目录下多了一个.git文件夹,此目录是Git用于管理版本库的,不要擅自改动里面的文件,这样会破坏 ...

  8. git报错 - remote: HTTP Basic: Access denied

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 git 拉取代码报: remote: HTTP Basic: Access denied,这是因为你的GIT密码修改后,需要重新认证授权,那么怎么操 ...

  9. redis笔记1

    存储结构 字符类型 散列类型 列表类型 集合类型 有序集合 可以为每个key设置超时时间: 可以通过列表类型来实现分布式队列的操作 支持发布订阅的消息模式 提供了很多命令与redis进行交互 数据缓存 ...

  10. Spring登录实例

    Spring登录实例 项目结构 首先看一下整个项目的目录结构,如下: 导入Jar包 工欲善必先利其器,导入一下Jar包 配置文件 web.xml 配置 web.xml配置文件,如下: xmlns:xs ...