ヒント+暴力

http://acm.hdu.edu.cn/showproblem.php?pid=4027

あなたはこれらのクエリに答えることはできますか?

制限時間:2000分の4000 MS(Javaの/その他)メモリの制限:65768分の65768 K(Javaの/その他)
の合計提出(S):33385受理提出(S):8020


問題の説明
悪の戦艦の多くは戦いの前に並んで配置されています。私たちの司令官は戦艦を排除するために私たちの秘密兵器を使用することを決定しました。戦艦のそれぞれは、耐久性の値をマークすることができます。私たちの秘密兵器のすべての攻撃のために、それはそれの平方根持久力の元の値に自分の持久力を加えることにより、戦艦の連続した部分の耐久性を減少させることができました。私たちの秘密兵器の攻撃の一連の期間中、指揮官は、武器の効果を評価したいので、彼は助けをお願いします。
あなたは戦艦ラインの連続した部分の耐久性の総和そのクエリに応答するように求められます。

平方根演算は整数に切り捨てされなければならないことに注意してください。
 

 

入力
入力はEOFで終了し、いくつかのテストケースを、含まれています。
  各テストケースのために、最初の行は、行の悪のN個の戦艦があり表す、単一の整数Nを含んでいます。(1 <= N <= 100000)、
  2行目は最後まで行の先頭から各戦艦の耐久値を示し、Nは整数EIが含まれています。あなたは、すべての耐久値の合計が2未満であると仮定することができる 63
  次の行は、アクションおよびクエリの数を表す、整数Mを含んでいます。(1 <= M <= 100000)
  次のM行のため、各ラインは、包括三つの整数T、XおよびYザT = 0 X番目及びY番目戦艦間の戦艦の耐久値を減少する秘密兵器の作用を示すが含ま。X番目及びY番目、包括間の戦艦の耐久値の和を求める司令のクエリを表すT = 1。
 

 

出力
各テストケースのために、最初の行でケース番号を印刷します。その後、クエリごとに1行を印刷します。そして、各テストケースの後に空白行をたどる覚えています。
 

 

サンプル入力
10 1 2 3 4 5 6 7 8 9 10 5 0 1 10 1 10 1 1 5 0 5 8 1 4 8
 

 

サンプル出力
ケース#1:19 7 6
 

 

ソース
 

 

推薦します
LCY
 彼はさらに、更新間隔なしにR-L + 1 ==ヴァル、及び他の再帰的それぞれの葉を更新するためのルート開口6-7の多数が1であることに留意しました
// の#include <ビット/ STDC ++。H> 
の#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <iostreamの> 
する#include <cstdioを> 
書式#include < 文字列 > 
の#include <CStringの> 
書式#include <stdio.hに> 
する#include <キュー> 
の#include <スタック> 
書式#include <マップ> 
書式#include < セット > 
の#include <
#include <ベクトル>
 #defineする MEを(X、Y)のmemset(X、Y、はsizeof(X))
 の#define SF(N)のscanf( "%d個"、&N)
 の#define(INTのための担当者(I、N) i = 0; iがn <; iは++が)
 の#define 0x3f3f3f3f INF
 の#define MOD十億七
 の#define PIのACOS(-1)を
 使用して 名前空間STD。
typedefの長い 長いLL。
const  int型 N = 100009 ; 
LLの合計。

構造体ノード
{ 
    int型のL、R。
    ヴァルLL; 
}ツリー[N << 2 ]。

無効ビルド(int型の L、int型の R、int型のルート)
{ 
    ツリー[ルート] .L = L、木[ルート] .R = R。
    もし(L == R)
    { 

        scanf関数(" %のLLD "、&ツリー[ルート] .val)。
        返します
    } 
    INT半ば=(L + R)>> 1 
    (リットル、ミッド、ルート構築 * 2 )。
    (半ば構築 + 1、R、根* 2 + 1 ); 
    ツリー[ルート] .val =ツリー[ルート* 2 ] .val +ツリー[ルート*2 + 1 ] .val。
} 

ボイド更新(int型 L、int型の R、int型のルート)
{ 
    もし、((ツリー[ルート] .L> = L &&ツリー[ルート] .R <= R)&&(ツリー[ルート] .R -ツリー[ルート] .L + 1 > = ツリー[ルート] .val))
    { 
        返します
    } 
    もし(ツリー[ルート] .L == ツリー[ルート] .R)
    { 
        ツリー[ルート] .val = SQRT(ツリー[ルート] .val)。
        返します
    } 
    INT半ば=(ツリー[ルート] .L +ツリー[ルート] .R)>> 1 もし(L <= MID)
        アップデート(L、R、根 * 2 )。
    もし(R> MID)
        更新(L、R、根 * 2 + 1 )。
    ツリー[ルート] .val =ツリー[ルート* 2 ] .val +ツリー[ルート* 2 + 1 ] .val。
} 

ボイド getsum(int型 L、int型の R、int型のルート)
{ 
    場合(ツリー[ルート] .L> = L &&ツリー[ルート] .R <= R)
    { 
        合計 + = ツリー[ルート] .val。
        返します
    } 
    int型半ば=(ツリー[ルート] .L +ツリー[ルート] .R)>> 1 もし(L <= MID)
        getsum(L、R、根 * 2 )。
    もし(R> MID)
        getsum(L、R、根 * 2 + 1 )。
    
} 

int型のmain()
{ 
    int型、N M。
    int型 CNT = 0 ;
    しばらく(〜のscanf(" %d個"、&n))は
    { 
        のprintf(" ケース#%dの:\ N "、++ CNT)。
        (ビルド1、nは、1 )。
        scanf関数(" %のD "、&M)。
        以下のためにint型 i = 0 ; iがm <; iは++ 
        { 
            intは であり、L、R。
            scanf関数(" %D%D%D "、&され、&​​L&R)。
            場合(L> R)スワップ(L、R)。// 注意坑
            場合ある == 0 
            { 
                更新(L、R、1 )。
            } 
            
            {
                合計 = 0 ; 
                getsum(L、R、1 )。
                printf(" %LLDの\ nを" 、合計)。
            } 
        } 
        COUT << ENDL。
    } 

    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/nonames/p/11606307.html