• Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)


    A[i][j]表示在循环节下标i开头j结尾的最长不减子序列,这个序列的长度为p,另外一个长度为q的序列对应的矩阵为B[i][j],

    将两序列合并,新的序列对应矩阵C[i][j] = max(A[i][k]+B[k][j])。非法的情况标记为-INF,用倍增加速。

    #include<bits/stdc++.h>
    using namespace std;
    
    
    const int INF = 0x3f3f3f3f;
    const int maxn = 101;
    int n;
    typedef int MType;
    struct Matrix
    {
        MType dat[maxn][maxn];
        MType *operator [](int x){ return dat[x]; }
        Matrix operator | (Matrix& B) {
            Matrix re;
            for(int i = 0; i < n; i++){
                for(int j = 0; j < n; j++){
                    re[i][j] = -INF;
                    for(int k = 0; k < n; k++){
                        re[i][j] = max(re[i][j],dat[i][k]+B[k][j]);
                    }
                }
            }
            return re;
        }
        Matrix operator ^ (int q){
            Matrix Re, A = *this;
            memset(Re.dat,0,sizeof(Re.dat));
            while(q){
                if(q&1){
                    Re = Re | A;
                }
                A = A | A;
                q >>= 1;
            }
            return Re;
        }
    };
    
    int a[maxn];
    
    //#define LOCAL
    int main()
    {
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif
        int T; scanf("%d%d",&n,&T);
        for(int i = 0; i < n; i++){
            scanf("%d",a+i);
        }
    
        Matrix A;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(a[i]>a[j] ) A[i][j] = -INF;
                else {
                    A[i][j] = 1;
                    for(int k = 0; k < j; k++){
                        if(a[k] <= a[j])
                        A[i][j] = max(A[i][j],A[i][k]+1);
                    }
                }
            }
        }
        A = A^T;
        int ans = 0;
        for(int i = 0; i < n;i++){
            for(int j = 0; j < n; j++){
                ans = max(ans,A[i][j]);
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    批量管理增量日志(seek、tell)
    字符串和编码
    5.activiti--完成任务
    4.activiti--代理任务Claiming the task
    3.activiti--待办任务
    2.activiti-启动流程实例
    1.activiti-流程图
    html 各种高度
    redis-过期时间、访问限制与缓存
    spring mvc controller 接收参数
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4854795.html
Copyright © 2020-2023  润新知