質問の意味:
いくつかのクラスがありますが、一部の人はミルクティーを飲みたい各クラスには、また、ドリンクのカップを、いくつかのお茶を提供していますが、人々の独自のクラスは、人々の最大数は、お茶を飲む持ってしようと、自分のミルククラスを飲むことはできません。
ソリューション:
クラスプレス降順の数。
人々の独自のクラスを防ぐためにお茶独自のクラス、クラスのドリンク茶の残りの部分の前にバッファストアの確立を飲みます。
教室の後ろにはお茶のお茶を持っていた場合、ドリンク、後でクラスをつかむ、背後にお茶を飲むのクラスならば、バッファは残りの牛乳を残していない見に行きました。
自国民の最後のクラスは、飲んだか飲まする必要はありませんでした、そして彼自身のチームは、ミルクバッファを盗むクラスの前に配置されていません。
そして、上記の手順を実行し、その後、次のシフトに向けます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 typedefの長い 長いLL。 typedefのペア < int型、LL> P; const int型 M = 4E5 * 4 + 5 ; CONST LLのMOD = 1E9 + 7 。 constの LL LINF = 0x3f3f3f3f3f3f3f3f 。 #define LS(RT << 1) の#define RS(RT << 1 | 1) LLのGCD(LL、LL b)は{ 戻り B?GCD(B、%のB)。} LL RES LLのquickpow(LLのA、LLのB、LLのMOD) { = 1 。 一方、(b)は、 { もし、(B&1 ) RES =(RES * A)%MOD。=(* A)%MOD。 B >> = 1 。 } 戻りRESと、 } 構造体ノード{ LL、B。 } TR [M]。 int型のトン。 int型のn; LLのCNT; ANS LL; int型の蓋。 BOOL CMP(ノードX、ノードY) { 戻り XB> YB。 } int型)(主 { scanf関数(" %のD "、&T)。 一方、(t-- ) { scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++ ) { scanf関数(" %のLLDの%のLLD "、&TR [I] .A、&TR [I] .B)。 } ソート(TR + 1、TR + 1 + N、CMP)。 ANS = CNT = 0 。 蓋 = 2 ; にとって(int型 i = 1 ; iが<= N; iが++ ) { 一方(LID < I) { CNT + = TR [蓋] .A。 蓋 ++ ; } であれば(蓋== I) 蓋 ++ 。 一方、(TR [I] .B) { 場合(LID <= N) { LL TMP = 分([I] .B TR TR [蓋] .A)。 ANS + = TMP; TR [i]は.B - = }TMP; TR [蓋] .A - = TMP。 もし(!TR [蓋] .A) 蓋 ++ ; } 他 { LL TMP = 分(TR [I] .B、CNT)。 ANS + = TMP; TR [I] .B - = TMP。 CNT - = TMP; もし(!CNT) ブレーク。 } CNT + = TR [I] .A。 TR [I] .A = 0 。 } のprintf(" %LLDする\ n " 、ANS)。 } }