結果

問題 No.3282 Photos and Friends
コンテスト
ユーザー ID 21712
提出日時 2026-04-29 00:42:46
言語 Go
(1.26.1)
コンパイル:
env GOCACHE=/tmp go build _filename_
実行:
./Main
結果
AC  
実行時間 319 ms / 2,000 ms
コード長 1,283 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 12,368 ms
コンパイル使用メモリ 276,800 KB
実行使用メモリ 16,128 KB
最終ジャッジ日時 2026-04-29 00:43:08
合計ジャッジ時間 19,610 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge1_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 50
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

package main

import . "fmt"
import . "os"
import bf "bufio"

type Req struct {
	x,a,b int
}

type Res struct {
	a, b int
}

func main() {
	rd:=bf.NewReader(Stdin)
	wr:=bf.NewWriter(Stdout)
	defer wr.Flush()
	
	var n,p,q int
	Fscan(rd,&n,&p,&q)
	rs := make([]*Req, n)
	for i := range rs {
		var x,a,b int
		Fscan(rd,&x,&a,&b)
		rs[i] = &Req{x,a,b}
	}
	
	ans := solve(n,p,q,rs)
	if len(ans) == 0 {
		Fprintln(wr,"No")
	} else {
		Fprintln(wr,"Yes")
		for _, r := range ans {
			Fprintln(wr, r.a, r.b)
		}
	}
}

func solve(n, p, q int, rs []*Req) []*Res {
	sum := 0
	for _, r := range rs {
		if r.a+r.b < r.x {
			return nil
		}
		sum += r.x
	}
	if sum > p+q {
		return nil
	}
	ans := make([]*Res, n)
	for i := range ans {
		ans[i] = new(Res)
	}
	for i, r := range rs {
		if r.a < r.x {
			nb := r.x - r.a
			if q < nb {
				return nil
			}
			ans[i].b = nb
			q -= nb
		}
		if r.b < r.x {
			na := r.x - r.b
			if p < na {
				return nil
			}
			ans[i].a = na
			p -= na
		}
	}
	for i, r := range rs {
		s := ans[i]
		if p > 0 && s.a+s.b<r.x && r.a-s.a > 0 {
			c := min(p, r.x-s.a-s.b, r.a-s.a)
			s.a += c
			p -= c
		} 
		if q > 0 && s.a+s.b<r.x && r.b-s.b > 0 {
			c := min(q, r.x-s.a-s.b, r.b-s.b)
			s.b += c
			q -= c
		}
		if s.a+s.b < r.x {
			return nil
		}
	}
	return ans
}
0