CF1826E. Walk the Runway(位图)

Problem - E - Codeforces

思路:该题关键是预处理需要求出在每一行m中,每一列元素的两两大小关系。需要时间复杂为O(m*n^2)。

使用位图进行优化,时间复杂度优化为O((m*n^2)/64)。然后用dp求出最大利润P

位图基本思想就是使64位数Long类型中每一位bit表示大小或存在 等关系(只需1位表示状态的情况)。表示关系的状态压缩后,能利用硬件的位运算使复杂度优化64倍。

该题中预处理时需要对每一行进行排序,以便后一列利用前一列的结果。下标压缩了64倍,所以是i<<6;1<

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String args[]) {new Main().run();}

    FastReader in = new FastReader();
    PrintWriter out = new PrintWriter(System.out);
    void run() {
        work();
        out.flush();
    }
    
    long mod=998244353;
    long inf=Long.MAX_VALUE/3;
    long gcd(long a,long b) {
        return a==0?b:gcd(b%a,a);
    }
    void work(){
        int m=ni(),n=ni();
        long[] P=na(n);
        int[][] A=new int[m][];
        for(int i=0;i>6)+1;
        long[][] rec=new long[n][M];
        for(int p=0;pA[fp][e2]-A[fp][e1]);
            long[] cur=new long[M];
            for(int i=0;i>6]|=1L<A[0][e1]-A[0][e2]);
        for(int i=0;i>6]>>>idx[j]&1)==0){
                        dp[i]=Math.max(dp[i],dp[j]+P[id]);
                    }
                }
            }
            ret=Math.max(ret,dp[i]);
        }
        out.println(ret);
    }

    @SuppressWarnings("unused")
    private ArrayList[] ng(int n, int m) {
        ArrayList[] graph=(ArrayList[])new ArrayList[n];
        for(int i=0;i();
        }
        for(int i=1;i<=m;i++) {
            int s=in.nextInt()-1,e=in.nextInt()-1;
            graph[s].add(e);
            graph[e].add(s);
        }
        return graph;
    }

    private ArrayList[] ngw(int n, int m) {
        ArrayList[] graph=(ArrayList[])new ArrayList[n];
        for(int i=0;i();
        }
        for(int i=1;i<=m;i++) {
            long s=in.nextLong()-1,e=in.nextLong()-1,w=in.nextLong();
            graph[(int)s].add(new long[] {e,w});
            graph[(int)e].add(new long[] {s,w});
        }
        return graph;
    }

    private int ni() {
        return in.nextInt();
    }

    private long nl() {
        return in.nextLong();
    }
    private double nd() {
        return in.nextDouble();
    }
    private String ns() {
        return in.next();
    }

    private long[] na(int n) {
        long[] A=new long[n];
        for(int i=0;i'9'){
                    b=input.read();
                }
                while(b>='0'&&b<='9'){
                    ret=ret*10+(b-'0');
                    b=input.read();
                }
                return ret;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return Long.parseLong(next());
    }

    public double nextDouble()
    {
        return Double.parseDouble(next());
    }
}

你可能感兴趣的:(Codeforces,算法)