zoukankan      html  css  js  c++  java
  • 2019牛客暑期多校训练营(第一场)

    题目传送门

    题号 A B C D E F G H I J
    状态 Ο . . . Ø Ο . . . Ο

    A.Equivalent Prefixes

    题意:给出两个序列$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
    ",ans);
        }
    }
    View Code

    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
    ",dp[n+m][n+m]);
        }
    }
    View Code

    F.Random Point in Triangle

    题意:给出坐标系上的三个点,然后在三角形内随机生成一个点,和三个点相连,问面积最大的三角形的期望是多少。

    思路:由于题目说输出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
    ", s);
        }
        return 0;
    }
    View Code

    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(">
    ");
            } else if (x / a < y / b) {
                printf("<
    ");
            } else {
                x %= a;
                y %= b;
                if (x * b > y * a) {
                    printf(">
    ");
                } else if (x * b < y * a) {
                    printf("<
    ");
                } else {
                    printf("=
    ");
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    node.js学习
    CSS3——3D效果
    解决HTML5布局,兼容IE问题
    Java 反射调用的一种优化
    jQuery中常用正则表达式
    8种NoSql数据库系统对比
    Java的ClassLoader机制
    Maven / Nexus 的用法和经验
    Spring中BeanFactory和ApplicationContext的区别
    Spring Bean的作用域
  • 原文地址:https://www.cnblogs.com/mountaink/p/11209457.html
Copyright © 2011-2022 走看看