結果
| 問題 | 
                            No.3325 陰陽師
                             | 
                    
| コンテスト | |
| ユーザー | 
                             msksknkn
                         | 
                    
| 提出日時 | 2025-11-01 16:56:02 | 
| 言語 | Java  (openjdk 23)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,657 bytes | 
| コンパイル時間 | 3,031 ms | 
| コンパイル使用メモリ | 89,200 KB | 
| 実行使用メモリ | 85,096 KB | 
| 最終ジャッジ日時 | 2025-11-01 16:56:53 | 
| 合計ジャッジ時間 | 34,330 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 5 WA * 18 TLE * 7 | 
ソースコード
package q7;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner sc = new Scanner(System.in);
		TreeMap<Integer,Integer> map = new TreeMap<>();
		int n = sc.nextInt();
		int m = sc.nextInt();
		int INF = Integer.MAX_VALUE/2;
		map.put(INF,-1);
		int[] a = new int[n];
		int[] t = new int[m];
		for(int i = 0;i < n;i++) {
			a[i] = Integer.parseInt(sc.next());
			if(!map.containsKey(a[i])) {
				map.put(a[i], 0);
			}map.put(a[i], map.get(a[i]) + 1);
		}int max = 0;
		for(int i = 0;i < m;i++) {
			t[i] = Integer.parseInt(sc.next());
		}
		//貪欲にやるのが最大にできそう
		for(int i = 0;i < m;i++) {
			int c = map.ceilingKey(t[i]);
			if(c == INF)break;
			max = i + 1;
			map.put(c,map.get(c) - 1);
			if(map.get(c) == 0)map.remove(c);
		}ArrayList<Integer> l = new ArrayList<>();
		for(int i = 0;i < max;i++) {
			l.add(t[i]);
		}Collections.sort(l,Collections.reverseOrder());
		Arrays.sort(a);
		int left = -1;
		int right = 1000000001;
		while(left < right - 1) {
			int mid = (left + right)/2;
			int used = n;
			boolean ok = true;
			for(int i = 0;i < max;i++) {
				int ind = binSearch(used,a,l.get(i) + mid);
				if(ind == -1 || a[ind] < l.get(i)) {
					ok = false;
					break;
				}
			}if(ok) {
				right = mid;
			}else {
				left = mid;
			}
		}		
		System.out.print(right);
	}public static int binSearch(int used,int[] a,int target) {
		int left = -1;
		int right = used;
		while(left < right - 1) {
			int mid = (left + right)/2;
			if(a[mid] <= target) {
				left = mid;
			}else {
				right = mid;
			}
		}return left;
	}
}
            
            
            
        
            
msksknkn