ミミズ、問題解決

トピックへのリンクを見つけます

トピック:

  トピックは非常に明確なので、これ以上は触れません。

分析:

  実際、この質問を見て、アイデアはすぐに思い付きました。まず、最も激しいものから始めましょう。毎回、最大の逆アセンブリを見つけ、それ以外のすべて、つまり直接シミュレーションを追加します。最初に、この正確さは問題はありませんが、時間は機能しません。したがって、他の方法を見つけたい場合は、最大のものだけが、優先キューを簡単に考える必要があります。直接優先キューシミュレーションの複雑さは、暴力ほどよくありませんが、最適化できます。

  この問題について考えてみてください。ここに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 ;
    forint i = 1 ; i <= n; i ++ 
        scanf(" %d "、&​​a [i]); 
    sort(a + 1、a + 1 + n);
    forint i = n; i> = 1 ;
    forint 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 " );
    forint i = 1 ; i <= m + n; i ++ ){
        if(i%t == 0 
            printf(" %lld "、Top()+ Ha); 
        ポップ(); 
    } 
    0を返し ます
}

 

おすすめ

転載: www.cnblogs.com/wish-all-ac/p/12714974.html