情報のプッシュ(更新のシングルポイント、および接頭辞を求めて)

https://codeforces.com/contest/1288/problem/E

問題の意味:情報のNは、シーケンスの開始は各操作は、シフト後の後上部、付加情報となり、1-N、Mの操作であります

上から最小および最大距離から各情報を確認して下さい。

溶液は、単一点フェンウィックツリーを使用して、間隔のn + m個の長さを拡大し、接頭辞と需要、各位置のレコードを有する別の配列を更新します。

//#<ビット/ STDC ++。H>含みます
書式#include <cstdioを>
書式#include <CStringの>
書式#include <cmath>
書式#include <アルゴリズム>
書式#include <iostreamの>
書式#include <cstdioを>
書式#include <文字列>
書式#include <stdio.hに>
書式#include <キュー>
書式#include <スタック>
書式#include <マップ>
書式#include <セット>
書式#include <string.hの>
書式#include <ベクトル>
#define ME(x、y)はmemsetの(X、Y、はsizeof(x))を
#define SF(N)のscanf( "%d個"、&N)
#define担当者(I、N)のために(INT I = 0; iは<N; I ++)
#define INF 0x3f3f3f3f
#defineモッズ十億七
#define PIのACOS(-1)
名前空間stdを使用。
長い長いLLのtypedef。
INT C [600009]。
あなたがいない[300 009]、その[300 009]。
int型リットル;
INT年[300009]

int型lowerbit(int型x)は、
{
    リターンX&( -  x)は、
}

無効アドオン(int型のx、int型のval)
{
    (int型I = X; I <= L、I + = lowerbit(I))のために
    {
        C [I] + =ヴァル。
    }
}

int型getsum(int型x)は、
{
    INT年= 0;
    ( -  = lowerbit(I)I; I> = 1のint I = X)のために
    {
        年+ = C [i]は、
    }
    ANSを返します。
}

メインint型()
{
    整数N、M。
    scanf関数( "%D%D"、&N、&M)。
    L = N + M。
    (I ++; I <= N I = 1の整数)のために
    {
        ANS [I] = I + M。
        I [I] = [I] = I。
        追加(I + M、1)。
    }
    (I ++; I <M I = 0の整数)のために
    {
        int型のx;
        scanf関数( "%のD"、&x)は、
        私の[X] = 1;
        MA [X] = MAX(MA〔X〕、getsum(ANS [X])); //毎回クエリから移動する前に。
        (ANS [x]は、-1)を追加。
        ANS [X] = M  -  I; //更新場所
        アド(ANS [x]は、1)。
    }
    //上に何の情報がなくてもよいし、再度スクリーニング必要とするため(; iは<= N I ++ INT I 1 =)
    {
        MA [I] = MAX(MA [I]、getsum(ANS [I]))。
    }
    (I ++; I <= N I = 1の整数)のために
    {
        COUT << MI [I] << "" << MA [I] << ENDL。
    }

    0を返します。
}

 

おすすめ

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