CCF二次求和(JAVA 继续混分 20分)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Main{
    static int N = 300,idx = 0,Q = 1000000007,count = 0;
    static int h[] = new int[N];
    static int e[] = new int[N*2];
    static int ne[] = new int[N*2];
    static long w[] = new long[N];
    static boolean st[] = new boolean[N]; 
    static Set<String> set = new HashSet<String>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        br.readLine();
        int T = 10;
        while(T-->0) {
            idx = 0;
            Arrays.fill(h, -1);
            Arrays.fill(e, 0);
            Arrays.fill(ne, 0);
            Arrays.fill(w, 0);
            Arrays.fill(st, false);
            String[] s = br.readLine().split(" ");
            int n = Integer.parseInt(s[0]);//节点
            int m = Integer.parseInt(s[1]);//操作
            int l = Integer.parseInt(s[2]);
            int r = Integer.parseInt(s[3]);//l~~r
            String[] sa = br.readLine().split(" ");
            for(int i = 1 ; i <= n ; i++ ) w[i] = Integer.parseInt(sa[i-1]);
            String[] sc = br.readLine().split(" ");
            for(int i = 2; i <= n ; i++) {
                int j = Integer.parseInt(sc[i-2]);
                add(i,j);add(j,i);
            }
            while(m-->0) {//m个操作
                String[] sm = br.readLine().split(" ");
                int a = Integer.parseInt(sm[0]);
                int b = Integer.parseInt(sm[1]);
                int c = Integer.parseInt(sm[2]);
                w[a] = (w[a]+c)%Q;
                st[a] = true;
                wDfs(a,b,c);
                Arrays.fill(st, false);
                long res = 0;
                for(int k = l; k <= r; k++) {
                    set.clear();
                    for(int i = 1; i <= n ; i++) {
                        ArrayList<String> sb = new ArrayList<String>();
                        sb.add(i+"");
                        st[i] = true;
                        res = (res + sDfs(i,k-1,w[i],sb))%Q;
                        st[i] = false;
                    }
                }
                bw.write(res+"\n");
            }
            bw.flush();
        }
    }
    private static long sDfs(int u, int k, long sw, ArrayList<String> sb) {
        if(k==0) {//
            String s = get1(sb);
            if(!set.contains(s.toString())) {
                s = get2(sb);
                set.add(s);
                return sw;
            }
            return 0;
        }
        long res = 0;
        for(int i = h[u]; i != -1; i = ne[i]) {
            int j = e[i];//u的邻点j
            if(st[j]) continue;
            st[j] = true;
            sb.add(j+"");
            res = (res + sDfs(j,k-1,(sw+w[j])%Q,sb))%Q;
            st[j] = false;
            sb.remove(sb.size()-1);
        }
        return res;
    }
    private static String get2(ArrayList<String> sb) {//逆序
        String res = "";
        for(int i = sb.size()-1; i >=0 ; i--) {
            res += sb.get(i);
        }
        return res;
    }
    private static String get1(ArrayList<String> sb) {//正序
        String res = "";
        for(int i = 0; i <sb.size() ; i++) {
            res += sb.get(i);
        }
        return res;
    }
    private static boolean wDfs(int a, int b, int c) {
        if(a==b) return true;
        for(int i = h[a]; i !=-1; i = ne[i]) {
            int j = e[i];//与a的邻点
            if(st[j]) continue;
            st[j] = true;
            w[j] = (w[j]+c)%Q;
            if(wDfs(j,b,c)) return true;
            w[j] = (Q+w[j]-c)%Q;
            st[j] = false;
        }
        return false;
    }
    private static void add(int a, int b) {
        e[idx] = b;ne[idx] = h[a];h[a] = idx++;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容