8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七
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) 爬山+学数数+七十和十七相关推荐
- NOIP模拟测试29「爬山·学数数·七十和十七」
爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- NOIP模拟测试22「位运算」
范围n-----$100000$ m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$,那么你可以达到任何`一种$n$个$1$的情况 例如 ...
- NOIP模拟测试25
这次考试后面心态爆炸了...发现刚了2h的T2是假的之后就扔掉了,草率地打了个骗分 T1只会搜索和m=0 最先做的T3,主要是发现部分分很多,当时第一眼看上去有87分(眼瞎了). 后来想了想,感觉一条 ...
- 【NOIP模拟赛】小猫爬山
Description Freda和rainbow饲养了N只小猫,这天们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下(呜咕><><). Fre ...
- NOIP模拟测试19
T1: 题目大意:将一颗有N个节点的树分割,使得每个联通块大小相等,问一共有多少方案.(N<=1000000) 首先,一条很显然的性质,每个联通块的大小一定是N的因子. 然后,我们可以对于每个因 ...
- NOIP模拟测试49·50「养花·折射·画作·施工·蔬菜·联盟」
一套题 养花 题解 分块\主席树 这里我用的是主席树 查询分段$1-(k-1)$找最大的,能向右找就向右找 for(ll nowl=1,nowr=k-1;nowl<=maxx;nowl+=k,n ...
- NOIP模拟测试21「折纸·不等式」
折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...
- NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」
待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...
最新文章
- 详解死机的原因和预防方法
- loj 1251(2-sat + 输出一组可行解)
- IPFS的文件存储模式
- SpringCloud工作笔记058---springBoot项目maven命令打包部署
- 人工智能目标检测模型总结(一)——R-CNN、Fast R-CNN、Faster R-CNN
- 纯Git实现前端项目打包部署
- 随机梯度下降算法SGD
- TensorFlow - 正弦曲线
- cout与printf区别
- HDU6069(数学)
- 九九乘法表居中c语言,JavaScript实现九九乘法表的简单实例
- 重读经典(CLIP上):《Learning Transferable Visual Models From Natural Language Supervision》
- OO ALV 设置搜索帮助的三种方式 ONF4 EVENT
- 单片机AD转换程序 TLC2543
- c# sha256withrsa 算法 rsa公钥私钥 源码
- 记离职同事给我们的建议之一:关于人员培养方面的思考
- JSON Editor 中文文档
- opensips代码分析
- android 商城常用控件,android 自定义商城app价格正序倒序控件
- 智能计算机的功能有哪些功能,智能机器人有什么功能—智能机器人功能介绍
热门文章
- WPF视频会议系统资料
- Omi v1.0震撼发布 - 令人窒息的Web组件化框架
- 【博客美化】09.评论带头像,且支持旋转
- 开源监控解决方案Nagios+Cacti+PNP4Nagios+NConf+NDOUtils+Nagvis(九)NagVis安装
- Oracle忘记密码如何重置
- 全球信息产业的云转型浪潮
- VS2008安装后无法安装office2007的解决办法
- vue 切换页面没有改变滚动条_Web前端高级Vue学习笔记(三)
- Tidal Finance在Uniswap开启流动性挖矿
- IOTA基金会宣布推出终端用户钱包Firefly