제출 #344415

#제출 시각아이디문제언어결과실행 시간메모리
344415KWang31Gift (IZhO18_nicegift)Java
0 / 100
272 ms54044 KiB
import java.io.*; import java.util.*; public class nicegift{ static class FastReader { BufferedReader br; StringTokenizer st; public FastReader() { br = new BufferedReader(new InputStreamReader(System.in)); } String next() { while (st == null || !st.hasMoreElements()) { try { st = new StringTokenizer(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); } int nextInt() { return Integer.parseInt(next()); } } public static class Pair implements Comparable<Pair>{ int ind; long val; public Pair(int a, long b){ this.ind=a; this.val=b; } public int compareTo(Pair other){ if(this.val<other.val)return -1; if(this.val>other.val)return 1; if(this.ind<other.ind)return -1; return 1; } } static int MOD=998244353; static int[] rk, p,siz; public static void main(String[] args){ FastReader br=new FastReader(); int N=br.nextInt(); int K=br.nextInt(); Pair[] a=new Pair[N]; long sum=0; long max=0; for (int i = 0; i < N; i++) { a[i]=new Pair(1+i,br.nextInt()); sum+=a[i].val; max=Math.max(max,a[i].val); } if(sum%K>0 || sum/K < max){ System.out.println("-1");return; } //A number is bottle neck if a[i] Arrays.sort(a); long cur=sum/K; //Tracks K+1 elements long d;StringBuilder ans=new StringBuilder(); int op=0; int lp=0; int rp=N-1; long v; for (int j = 0; j < N; j++) { while(lp<N && a[lp].val==0) { lp++; } while(rp>=0 && a[rp].val==cur) { rp--; } if(rp<lp+K)break; //System.out.println(j+" "+lp+" "+rp); d=Math.min(a[lp].val, cur-a[rp].val); if(d==0)continue; op++; //System.out.println(j+" "+cur+" "+d); ans.append(d+" "); //System.out.println(lp+K-(N-rp-1)); for(int k=lp; k<lp+K-(N-rp-1); k++) {//There are at least K elements v=a[k].val-d; a[k]=new Pair(a[k].ind,v); ans.append(a[k].ind+" "); } for(int k=rp+1; k<N; k++) { v=a[k].val-d; a[k]=new Pair(a[k].ind,v); ans.append(a[k].ind+" "); } cur-=d; ans.append("\n"); } //Now K of them are "bottlenecks" boolean val=false; for (int i = 0; i < N; i++) { if(a[i].val>0){ if(!val){ val=true; op++; ans.append(a[i].val+" "); } ans.append(a[i].ind+" "); } } System.out.println(op); System.out.println(ans.toString()); } } //Debugging: //Are you sure your algorithm is correct? //Bounds: long //Special cases: n=0,1? //Make sure you remove your debugging code before you submit!
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...