進化しよう、コンコン(C++)

9389 ワード

進化せよコンコンコン
問題の説明
巨コンは大コンを食べ、大コンはコンを食べる.コンコンは食べられるのを防ぐために、十分な質のコンを食べて大コンに進化しなければならない.いくつかの(共n個)時刻(秒単位)がコンの目の前の小コン品質を通過することが知られており、コンは毎秒最大2頭の小コンを食べることができるが、現在、コンはいくつかの(共p個)期間[t 1,t 2](t 1,t 2)(t 2を含む)で十分な品質の小コンを食べることができるかどうかを知りたいと思っており、十分であれば他の時間に寝たりバスケットボールをしたりすることができる.
入力フォーマット
1行目、2つの数、nとqは、それぞれn個の時刻とq個の期間を表す.2行目からn+1行目、行ごとに2個の数、aiとMi、ai時刻を表すコン品質はMiである.(注意:同時刻に複数のコンが存在する可能性がある)第n+2からn+1+qは、1行あたり3個の数、t 1,t 2,mであり、期間[t 1,t 2]およびコンコンの進化に質量mが必要であることを示す.
出力フォーマット
q行、各行はyesまたはnoを出力する(現在の期間にコンの総質量>=進化に必要な質量mを食べる場合、yesを出力し、そうでない場合はno).
データ範囲
1<=ai,n<=106,1<=t1<=t2<=106,1<=Mi<=2000,1<=m<=2×1010、データはすべて整数です.
入出力サンプル
サンプル1:
入力
3 1
1 5
1 8
1 3
1 1 10

しゅつりょく
yes

サンプル2:
入力
6 2
1 15
1 8
1 3
2 8
2 9
3 27
2 3 50
1 2 40

しゅつりょく
no
yes

サンプル解釈
サンプル1:コンコンコンは8と5の小コンを選択し,総質量は13>=10であり,進化しyesを出力できる.
サンプル2:最初の質問[2,3]、コンコンは2-3秒目の3匹のコンを食べ、総質量は44<50であり、進化できず、noを出力する.2番目の質問[1,2]に対して,コンコンは1秒目に15と8の品質のコンを選択し,2秒目に2頭のコンはすべて食べ,品質は合計40であり,進化しyesを出力することができる.
コード:
#include 
using namespace std;
int n,q,a[1000002],m[1000001],w,sum,b[1000001][2],c[1000001];
int main(){
	cin>>n>>q;
	for (int i=1; i<=n; i++){
		cin>>a[i]>>m[i];
		if (b[a[i]][1]<m[i]){
			swap(b[a[i]][1],m[i]);
		}
		if (b[a[i]][0]<m[i]){
			swap(b[a[i]][0],m[i]);
		}
	}
	for (int i=1; i<=1000000; i++){
		c[i]=c[i-1]+b[i][1]+b[i][0];//   
	}
	for (int i=1; i<=q; i++){
		int t1,t2;
		sum=0;
		cin>>t1>>t2>>w;
		sum=c[t2]-c[t1-1];
		if (sum>=w){
			cout<<"yes"<<endl;
		}
		else{
			cout<<"no"<<endl;
		}
	}
	return 0;
}

考え方:
欲張りアルゴリズム+接頭辞と!!!水題!!!
PS:私はただこの問題のテーマがとても面白いと思っています.