2019牛客暑期多校训练营(第一场)
题号 | A | B | C | D | E | F | G | H | I | J |
状态 | Ο | . | . | . | Ø | Ο | . | . | . | Ο |
题意:给出两个序列rmq相等的定义:任意子区间最小值相等,然后给出a、b两个数组,求最长的前缀相等序列长度。
题解:我们考虑前k个数字已经是相等序列了,这个时候我们加入第k+1个元素x,如果x比第k个元素大,会发现这绝对不会使序列变的不合法。当x比第k个小时,我们发现x会影响从k往前开始,从后往前直到出现第一个比x小的数字。在这个位置会改变最小值的关系,所以我们用一个权值单调递增的单调栈来维护序列,如果每个地方影响的位置都相同,则合法,否则就break。

#include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; int n; const int maxn=100010; int a[maxn],b[maxn]; struct node{ int val,pos; }sta1[maxn],sta2[maxn]; int top1,top2; int main(){ while(cin>>n){ top1=top2=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int ans=0; int flag=1; for(int i=1;i<=n;i++){ scanf("%d",&b[i]); while(top1!=0&&a[i]<sta1[top1].val){ top1--; } sta1[++top1].val=a[i]; sta1[top1].pos=i; int x=i-sta1[top1-1].pos; while(top2!=0&&b[i]<sta2[top2].val){ top2--; } sta2[++top2].val=b[i]; sta2[top2].pos=i; int y=i-sta2[top2-1].pos; if(x==y&&flag){ ans++; }else{ flag=0; } } printf("%d\n",ans); } }
E.ABBA
题意:构造一个长度为2*(n+m)的AB串,使这个串可以划分成n和“AB”的子序列和m个“BA”的子序列,求方案数量
题解:我们将符合条件的串称为合法序列,比如“AAABBBB”不可能是合法序列,“AAAABBB”就可能是一个合法序列。设dp[i][j]表示用了i个A和j个B组成的合法序列的方案数,这里的i也就是A的个数最多是j+n个,即j个“BA”的“A”和n个“AB”的‘A’,(j个B全部用来组成BA,这是最多的情况),此时我们可以转移到dp[i+1][j],同理,B也是一样的转移方式。

#include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int maxn=2010; int n,m; ll p=1e9+7; ll dp[maxn][maxn]; int main(){ while(cin>>n>>m){ for(int i=0;i<=n+m;i++){ for(int j=0;j<=n+m;j++)dp[i][j]=0; } dp[0][0]=1; for(int i=0;i<=n+m;i++){ for(int j=0;j<=n+m;j++){ if(i+1<=j+n){ dp[i+1][j]=(dp[i+1][j]+dp[i][j])%p; } if(j+1<=i+m){ dp[i][j+1]=(dp[i][j+1]+dp[i][j])%p; } } } printf("%lld\n",dp[n+m][n+m]); } }
题意:给出坐标系上的三个点,然后在三角形内随机生成一个点,和三个点相连,问面积最大的三角形的期望是多少。
思路:由于题目说输出ans*36,并且保证这是整数,说明答案如果是个分数,分母肯定是36的因子,就大胆的随机生成了一些点,算了一下期望,发现就是三角形面积的11/2。
要注意随机数的生成是有范围的,最多生成2^16这么大的数。longlong取模也要用labs

#include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; int main(void) { ll a1, b1, a2, b2, a3, b3; while (~scanf("%lld %lld %lld %lld %lld %lld", &a1, &b1, &a2, &b2, &a3, &b3)) { long long x1=a2-a1,x2=a3-a1,y1=b2-b1,y2=b3-b1; long long s=11*labs(x1*y2-x2*y1); printf("%lld\n", s); } return 0; }
J.
题意:给出x,a,y,b,判断x/a与y/b的大小,0<=x,y<=1e18,1<=a,b<=1e9。
思路:x/a=x//a+x%a,y/b也一样拆开来,先判断x//a和y//b的大小,如一样,再判断(x%a)*b和(y%b)*a的大小。

#include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; using namespace std; int main(void) { long long x, y, a, b; while (~scanf("%lld %lld %lld %lld", &x, &a, &y, &b)) { if (x / a > y / b) { printf(">\n"); } else if (x / a < y / b) { printf("<\n"); } else { x %= a; y %= b; if (x * b > y * a) { printf(">\n"); } else if (x * b < y * a) { printf("<\n"); } else { printf("=\n"); } } } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!