結果

問題 No.3389 k-Days Later
コンテスト
ユーザー yu23578
提出日時 2025-11-12 21:01:23
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 483 ms / 2,000 ms
コード長 1,102 bytes
コンパイル時間 1,920 ms
コンパイル使用メモリ 197,812 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-11-28 20:52:47
合計ジャッジ時間 21,108 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
#define int long long

int N,Q;

signed main(){
	//ステップ1. 入力の受け取り
    cin>>N;
    vector<int> D(2*N+1);
    for(int i = 1; i <= N; i++) cin>>D[i];
    //ステップ2. クエリ解答への準備
    for(int i = N+1; i <= N*2; i++) D[i] = D[i-N];
    for(int i = 1; i <= N*2; i++) D[i] += D[i-1];
    int sum_D = D[N]; //1年の日数
    //ステップ3. クエリへの解答
    cin>>Q;
    for(int i = 0; i < Q; i++){
    	int y,m,d,k; cin>>y>>m>>d>>k;
    	int ans_y = y + k / sum_D;
    	int ans_m = m;
    	int ans_d = d;
    	k %= sum_D;
    	if(d + k <= (D[m] - D[m-1])){//k日後が今月中に訪れる場合
    		ans_m = m;
    		ans_d = d + k;
    	}
    	else{
    		ans_d = D[m] - D[m-1];
    		k -= ((D[m] - D[m-1]) - d); //月末に移動
    		ans_m = lower_bound(D.begin(),D.end(),k + D[m]) - D.begin();
    		k -= (D[ans_m-1] - D[m]);
    		if(ans_m > N){//年越しする場合
    			ans_m -= N;
    			ans_y++;
    		}
    		ans_d = k;
    	}
    	cout << ans_y << " " << ans_m << " " << ans_d << "\n";
    }
}
0