T1 爬山

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

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n,d,a,b,ans;
ll read()
{ll aa=0,bb=1;char cc=getchar();while(cc>'9'||cc<'0'){if(cc=='-') bb=-1;cc=getchar();}while(cc>='0'&&cc<='9'){aa=(aa<<3)+(aa<<1)+(cc^'0');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-1) return true;return false;
}
int main()
{n=read();d=read();a=read();b=read();if(n==2){printf("%lld\n",max(a,b));return 0;}ll l=max(a,b),r=d*(n-1),mid;while(l<=r){mid=(l+r)>>1;if(check(mid)){ans=mid;l=mid+1;}else r=mid-1;}printf("%lld\n",ans);return 0;
}

爬山

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[100100];
ll n,Q,t[100100],p[100100];
stack<node>s;
set<ll>st;
map<ll,ll>mp;
char ch[5];
ll read()
{ll aa=0,bb=1;char cc=getchar();while(cc>'9'||cc<'0'){if(cc=='-') bb=-1;cc=getchar();}while(cc>='0'&&cc<='9'){aa=(aa<<3)+(aa<<1)+(cc^'0');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=1;i<=n;i++){h[i].x=read();h[i].id=i;st.insert(h[i].x);}ll num=0;while(st.size()){mp[*st.begin()]=++num;p[num]=*st.begin();st.erase(*st.begin());}sort(h+1,h+n+1,cmp1);for(int i=1;i<=n;i++) h[i].x=mp[h[i].x];sort(h+1,h+n+1,cmp2);for(int i=1;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+1;else h[i].l=1;s.push(h[i]);}while(s.size()) s.pop();for(int i=n;i>=1;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+1;s.push(h[i]);}sort(h+1,h+n+1,cmp1);for(int i=1;i<=n;i++){t[h[i].x]=t[h[i-1].x]+(h[i].id-h[i].l+1)*(h[i].r-h[i].id);}ll x;for(int i=1;i<=Q;i++){scanf("%s",ch);x=read();ll pos=lower_bound(p+1,p+num+1,x)-p;if(ch[0]=='>'){if(p[pos]==x) printf("%lld\n",t[num]-t[pos]);else printf("%lld\n",t[num]-t[pos-1]);}if(ch[0]=='='){if(p[pos]==x) printf("%lld\n",t[pos]-t[pos-1]);else puts("0");}if(ch[0]=='<'){if(p[pos]==x) printf("%lld\n",t[pos-1]);else printf("%lld\n",t[pos-1]);}}return 0;
}

学数数

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[100100];
ll quick(ll x,ll p)
{ll as=1;while(p){if(p&1) as=as*x%mod;x=x*x%mod;p>>=1;}return as;
}
int main()
{scanf("%lld",&n);ll sum=1,tot=1;for(ll i=1;i<=n;i++){f[i]=(f[i-1]*i%mod+(tot-1)*sum%mod)%mod;tot=tot*2%mod;sum=sum*i%mod;}printf("%lld\n",f[n]*quick(sum,mod-2)%mod);return 0;
}

七十和十七

转载于:https://www.cnblogs.com/jrf123/p/11396254.html

8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七相关推荐

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

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

  2. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  3. NOIP模拟测试22「位运算」

    范围n-----$100000$   m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$,那么你可以达到任何`一种$n$个$1$的情况 例如 ...

  4. NOIP模拟测试25

    这次考试后面心态爆炸了...发现刚了2h的T2是假的之后就扔掉了,草率地打了个骗分 T1只会搜索和m=0 最先做的T3,主要是发现部分分很多,当时第一眼看上去有87分(眼瞎了). 后来想了想,感觉一条 ...

  5. 【NOIP模拟赛】小猫爬山

    Description Freda和rainbow饲养了N只小猫,这天们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下(呜咕><><). Fre ...

  6. NOIP模拟测试19

    T1: 题目大意:将一颗有N个节点的树分割,使得每个联通块大小相等,问一共有多少方案.(N<=1000000) 首先,一条很显然的性质,每个联通块的大小一定是N的因子. 然后,我们可以对于每个因 ...

  7. NOIP模拟测试49·50「养花·折射·画作·施工·蔬菜·联盟」

    一套题 养花 题解 分块\主席树 这里我用的是主席树 查询分段$1-(k-1)$找最大的,能向右找就向右找 for(ll nowl=1,nowr=k-1;nowl<=maxx;nowl+=k,n ...

  8. NOIP模拟测试21「折纸·不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  9. NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」

    待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...

最新文章

  1. 详解死机的原因和预防方法
  2. loj 1251(2-sat + 输出一组可行解)
  3. IPFS的文件存储模式
  4. SpringCloud工作笔记058---springBoot项目maven命令打包部署
  5. 人工智能目标检测模型总结(一)——R-CNN、Fast R-CNN、Faster R-CNN
  6. 纯Git实现前端项目打包部署
  7. 随机梯度下降算法SGD
  8. TensorFlow - 正弦曲线
  9. cout与printf区别
  10. HDU6069(数学)
  11. 九九乘法表居中c语言,JavaScript实现九九乘法表的简单实例
  12. 重读经典(CLIP上):《Learning Transferable Visual Models From Natural Language Supervision》
  13. OO ALV 设置搜索帮助的三种方式 ONF4 EVENT
  14. 单片机AD转换程序 TLC2543
  15. c# sha256withrsa 算法 rsa公钥私钥 源码
  16. 记离职同事给我们的建议之一:关于人员培养方面的思考
  17. JSON Editor 中文文档
  18. opensips代码分析
  19. android 商城常用控件,android 自定义商城app价格正序倒序控件
  20. 智能计算机的功能有哪些功能,智能机器人有什么功能—智能机器人功能介绍

热门文章

  1. WPF视频会议系统资料
  2. Omi v1.0震撼发布 - 令人窒息的Web组件化框架
  3. 【博客美化】09.评论带头像,且支持旋转
  4. 开源监控解决方案Nagios+Cacti+PNP4Nagios+NConf+NDOUtils+Nagvis(九)NagVis安装
  5. Oracle忘记密码如何重置
  6. 全球信息产业的云转型浪潮
  7. VS2008安装后无法安装office2007的解决办法
  8. vue 切换页面没有改变滚动条_Web前端高级Vue学习笔记(三)
  9. Tidal Finance在Uniswap开启流动性挖矿
  10. IOTA基金会宣布推出终端用户钱包Firefly