81分爆java.lang.StackOverflowError
  • 板块P2170 选学霸
  • 楼主TearsMeow
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/25 01:38
  • 上次更新2024/12/25 17:14:05
查看原帖
81分爆java.lang.StackOverflowError
1211502
TearsMeow楼主2024/12/25 01:38

有佬帮忙看看吗,放esclipse中就是find()函数的报错,应该是数据量太多了,找的层次太多了栈爆了吗。

package Luogu;

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

public class test01 {
	   static int N = 400000,n,m,k,INF = (int)1e9+7;
	    static int[] f = new int[N],v = new int[N],p = new int[N],save = new int[N];
	    static int Int(String s){return Integer.parseInt(s);}
	    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    static PrintWriter pw= new PrintWriter(new OutputStreamWriter(System.out));
	    public static void main(String[] args)throws IOException{
	        String[] arrStr = br.readLine().split(" ");
	        n = Int(arrStr[0]); m = Int(arrStr[1]);k = Int(arrStr[2]);
	        
	        for(int i = 1;i <= n;i++){
	            p[i] = i;
	            v[i] = 1;
	        }
	        for(int i = 1;i <= k;i++){
	            arrStr = br.readLine().split(" ");
	            int a = Int(arrStr[0]);int b = Int(arrStr[1]);
	            p[find(a)] = find(b);
	            
	        }
	        
	        for(int i = 1;i <= n;i++) {
	        	if(p[i] != i) {
	        		v[find(i)] += v[i];
	        		v[i] = 0;
	        	}
	        }
	        int cnt = 0;
	        
	        for(int i = 1;i <= n;i++) {
	        	if(p[i] != i) {
	        		cnt ++;
	        		save[cnt] += p[i];
	        	}
	        }
	        
	        
	        for(int i = 1;i <= cnt;i++){
	            for(int j = 2 * m;j >= save[i] ;j --){
	                f[j] = Math.max(f[j - save[i]] + save[i],f[j]);
	            }
	        }
	        
	        
	        //寻找离m最近的点
	        int dis = INF,ans = INF;
	        for(int i = 1;i <= n;i++) {
	        	if(dis > Math.abs(f[i] - m)) {
	        		 dis = Math.abs(f[i] - m);
	        		 ans = f[i];
	        		 
	        	}
	        }
	        if(ans == INF) pw.println("0");
	        else pw.println(ans);
	        pw.println();
	        
	        pw.flush();br.close();pw.close();
	    }
	    static int find(int x){
	        if(p[x] != x) p[x] = find(p[x]);
	        
	        return p[x];
	    }
}

2024/12/25 01:38
加载中...