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=,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) 爬山+学数数+七十和十七的更多相关文章
- NOIP模拟测试29「爬山·学数数·七十和十七」
爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...
- NOIP模拟测试29(A)
T1: 题目大意:有一张有向无环图,第$x$次经过边$i$的代价为$a_ix+b_i$,最多经过$c_i$次,起点为1,$s$个点可作为终点,求走$k$次的最小代价. 我们新建一个汇点,将所有可做为终 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
随机推荐
- centos 安装python3.7
先安装依赖包: yum -y install bzip2 bzip2-devel ncurses openssl openssl-devel openssl-static xz lzma xz-dev ...
- MYSQL5.6免安装版在windows下的使用
一.去MYSQL官网下载MYSQL免安装版,由于我的系统是64位的,所以就下载了64位的Mysql版本 http://cdn.mysql.com//Downloads/MySQL-5.6/mysql- ...
- 模型的细致程度--Level of Development
模型的细致程度,英文称作Level of Details,也叫作Level of Development.描述了一个BIM模型构件单元从最低级的近似概念化的程度发展到最高级的演示级精度的步骤.美国建筑 ...
- 【LOJ#3145】[APIO2019]桥梁(分块,并查集)
[LOJ#3145][APIO2019]桥梁(分块,并查集) 题面 LOJ 题解 因为某个\(\text{subtask}\)没判\(n=1\)的情况导致我自闭了很久的题目... 如果没有修改操作,可 ...
- ocelot性能测试
网上搜索发现多篇文章指出ocelot的性能有问题,可是在ocelot项目issue提问中,维护者指出,ocelot的性能问题不大.瓶颈在于.net的httpclient. 我参考文章 https:// ...
- ASP.NET MVC 中的过滤器
这里用实例说明各种过滤器的用法,有不对的地方还请大神指出,共同探讨. 1. ActionFilter 方法过滤器: 接口名为 IActionFilter ,在控制器方法调用前/后执行. 在新建的MVC ...
- laravel Method Illuminate\Validation\Validator::validateReuqired does not exist.
Method Illuminate\Validation\Validator::validateReuqired does not exist. 此错误是由于我们在配置验证时,写错了关键字, publ ...
- Redis操作篇(二)
redis的发布与订阅,主从架构,哨兵架构,cluster集群 下载编译安装redis # 1. 下载redis wget http://download.redis.io/releases/redi ...
- ASP.NET Core系列:依赖注入
1. 控制反转(IoC) 控制反转(Inversion of Control,IoC),是面向对象编程中的一种设计原则,用来降低代码之间的耦合度. 1.1 依赖倒置 依赖原则: (1)高层次的模块不应 ...
- BUUCTF--checkin
文件上传文件上传一般验证方式:1.本地js验证(客户端)2.MIME验证(服务端)3.拓展名验证(服务端)4.脚本内容(文件头)验证(服务端) 通常会用到exif_imagetype()函数,这个函数 ...