ABC略
C爆int,从20min一直调到70min,然后放弃,结束时改了long来了一发然后AC,,多了200++罚时很难受。1100-1800。
D题非常简单(但是我一直在肝C。。。)
题意:求一个具有n个顶点的图,该图有a个联通块,该图的补图有b个联通块。
离散都学了,,然而我都睡过去了导致很懵逼,看了好久才注意到这样一个事情: 补图的联通块的个数等于原图中度数为n-1的顶点的个数加一。
然后我们很容易就能发现 a>=2&&b>=2 时是无解的。那么就只剩下3种情况。
1.a==1&&b==1
首先注意到 n=1,2,3这种特殊情况。剩下的只要按顺序连点就可以(i-i+1相连)。
2.a==1&&b>1(用if-else的话后面的b我就懒得写了)
那么我们首先先让b-1个点都是完全点(我也不知道怎么称呼,就是与其他每个点都有边),然后就不用管了。。。
3.a>1&&b==1
先让a-1个点独立。剩下的连起来就完事了。
前面的是快速IO。。。
正在努力向c++转变,,,
package R45; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.StringTokenizer; public class Main4 { static BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tok; static boolean hasNext() { while(tok==null||!tok.hasMoreTokens()) try{ tok=new StringTokenizer(in.readLine()); } catch(Exception e){ return false; } return true; } static String next() { hasNext(); return tok.nextToken(); } static long nextLong() { return Long.parseLong(next()); } static int nextInt() { return Integer.parseInt(next()); } static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out)); static int n; static int g[][]; public static void main(String[] args) { n = nextInt(); int a = nextInt(); int b = nextInt(); g = new int[n+1][n+1]; if (a>=2&&b>=2){ out.println("NO"); out.flush(); return; }else if (a==1&&b==1){ if (n==1){ out.println("YES"); out.println(0); }else if (n<=3){ out.println("NO"); }else { out.println("YES"); for(int i=2;i<=n;i++){ g[i-1][i]=1; g[i][i-1]=1; } syso(); } }else { out.println("YES"); if (a==1){ for(int i=1;i<=b-1;i++){ for(int j=1;j<=n;j++){ if (i!=j) { g[i][j] = 1; g[j][i] = 1; } } } syso(); }else {//b==1 //先挑出来a-1个单独的点,剩下的随,随意? for(int i=a;i<=n;i++){ for(int j=a;j<=n;j++){ if (i!=j) g[i][j]=g[j][i]=1; } } syso(); } } out.flush(); } public static void syso(){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ out.print(g[i][j]); } out.println(); } } }