トピックへのリンクを見つけます。
トピック:
トピックは非常に明確なので、これ以上は触れません。
分析:
実際、この質問を見て、アイデアはすぐに思い付きました。まず、最も激しいものから始めましょう。毎回、最大の逆アセンブリを見つけ、それ以外のすべて、つまり直接シミュレーションを追加します。最初に、この正確さは問題はありませんが、時間は機能しません。したがって、他の方法を見つけたい場合は、最大のものだけが、優先キューを簡単に考える必要があります。直接優先キューシミュレーションの複雑さは、暴力ほどよくありませんが、最適化できます。
この問題について考えてみてください。ここにa1、a2、a3、a4、a5という数字があります。。。各番号をda(セグメントツリーではなく...)ずつ増やしたい場合、どのように操作するか、実際には操作する必要はありません。カーディナリティを見つけ、カーディナリティにdaを追加させ、各要素をクエリするときにこのカーディナリティを追加します。さて、更新されていないものがある場合は、daを直接減算できます(もちろん、この変換は、減算されていないものが減算よりも少ないためです)。次に、再びシミュレーションできますが、tle、tle、tleです。。。実際、nlognのChangshuは少し小さいですが、実際にはここを通過できません。vjudgeの制限時間は10000msですが、これは通過できません。もちろん、同じヒープの手書きヒープも試しました。
実際、ここで考えるのは簡単です。実際、ログの多くは複雑さの無駄です。考えてみましょう。nは比較的小さいです。n個の数値を並べ替えると、それらを並べ替えることなく、3つのキューを開きます。 n個の数値を別々に保存します。半分の長さと他の半分の長さです。並べ替えてみませんか?各ミミズは操作後に長く成長しますが、それをカーディナリティに追加するので、3つのキューが増加していることを保証できます。この問題は解決されました。
次に、あります:stlを使用する場合、キューのlong longは緩やかになります(stl定数の大きさは...)。したがって、open int、もちろんqは200だけで、intを爆発させません。しかし、答えは必ずしもintであるとは限りません。
最後に、コード。
#include <cstdio> #include <queue> #include <algorithm> using namespace std; const int maxn = 1e5 + 10 ; int a [maxn]; キュー < int > qu1; キュー < int > qu2; キュー < int > qu3; int Top(){ int qu11、qu22、qu33; if (qu1.empty()) qu11 = -1e9; それ以外の場合、 qu11 = qu1.front(); もし(qu2.empty()) qu22 = -1e9; それ以外の場合、 qu22 = qu2.front(); if (qu3.empty()) qu33 = -1e9; それ以外の場合、 qu33 = qu3.front(); if(qu11> qu22 && qu11> qu33) return qu11; else if(qu22> qu33) がqu22を返す。 それ以外の場合は qu33を返します。 } void Pop(){ int qu11、qu22、qu33; if (qu1.empty()) qu11 =-1e9; それ以外の場合、 qu11 = qu1.front(); if (qu2.empty()) qu22 = -1e9; それ以外の場合、 qu22 = qu2.front(); if (qu3.empty()) qu33 = -1e9; それ以外の場合、 qu33 = qu3.front(); if(qu11> qu22 && qu11> qu33) qu1.pop(); else if(qu22> qu33) qu2.pop(); それ以外の場合は qu3.pop(); } int main(){ int n、m; intq、u、v、t; // freopen( "P2827_2(1).in"、 "r"、stdin); // freopen( "ouou.out"、 "w"、stdout); scanf(" %d%d%d%d%d%d "、&n、&m、&q、&u、&v、&t); long long Ha = 0 ; for(int i = 1 ; i <= n; i ++ ) scanf(" %d "、&a [i]); sort(a + 1、a + 1 + n); for(int i = n; i> = 1 ; for(int i = 1 ; i <= m; i ++ ){ long long x = Top()+ Ha; ポップ(); int x1 = u * x / v-Ha- q; int x2 = xu * x / v-Ha- q; qu2.push(x1); qu3.push(x2); if(i%t == 0 ) printf(" %lld " 、x); Ha + = q; } printf(" \ n " ); for(int i = 1 ; i <= m + n; i ++ ){ if(i%t == 0 ) printf(" %lld "、Top()+ Ha); ポップ(); } 0を返し ます。 }