貪欲本土の問題にP2184ソリューション

P2184の貪欲本土

タイトル説明

防衛の小さなFF最後の行は、長さNの溝である多数の小さなFF様々な鉱山を有し、それぞれがSCVであってもよい\([L、R] \ ) 既に地雷の敷設に同じ前の敷設は異なる範囲。場合は、あなたは$の範囲内でどのように多くの異なった鉱山$で[L「R」]を頼むかもしれないいくつかの点で緊急、小型FFてきたので、彼はあなたができるだけ早く返信したいと考えています。

データの30%:\(0 <= N、M <= 1000 \)

データの100%に:\(0 <= N、M <= 10 5 ^ \)

入力形式

整数の最初の二つの行為\(N- \)\(M \)

\(N- \)防御の長さを表し、\(mは\)回数と小鉱山SCV FF照会の合計を表します。

そこ\(M \)三つの整数の行\(Q、L、R&LT \) ;場合\(Q = 1 \) SCVを示す([L、R] \ \ ) このクロスセクションの鉱山の一種に、場合(Q = 2 \)\、小電流クエリFF前記\([L、R] \ ) 鉱山の種類の間隔の合計数。

出力フォーマット

常に小さなFFを求める、答え(単線)の出力は、地雷の総数の現在の範囲ことを示しています。

サンプル入力と出力

エントリー

5 4
1 1 3
2 2 5
1 2 4
2 3 5

輸出

1
2

問題の解決策

分析

我々は、我々は唯一の電流範囲の最後に先頭の番号が含まれているを見つける必要があり、確認した後、私たちは場所の現在のレンジに1前にチェック末尾の番号が含まれ、これは、我々はどのように多くの不良を知ることができます地雷は現在の間隔で存在している場合、この質問は、私たちが正常に変更、クエリの簡単な質問セクションの単一のポイントに変換していることです。

フェンウィックツリーツリーラインでと個人的な好みを見ることができ、ここでは比較的簡単フェンウィック木コードです\(\下矢印\)

コード

#include<bits/stdc++.h>
#define ll long long
using namespace std;

template <typename T>
inline void read(T &x) {
	x = 0;
	ll f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = x * 10 + (ch ^ 48);
        ch = getchar();
    }
    x *= f;
    return;
}
template <typename T>
inline void write(T x){
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    if(x > 9)
        write(x/10);
    putchar(x % 10 + '0');
    return;
}
int head[500005], tail[500005], n, m;
inline int lowbit(int x){return x & (-x);}
inline void add_head(int x){
    for (int i = x; i <= n; i += lowbit(i))
        head[i]++;
}
inline void add_tail(int x){
    for (int i = x; i <= n; i += lowbit(i))
        tail[i]++;
}
inline int sum_head(int x){
    int s = 0;
    for (int i = x; i > 0; i -= lowbit(i))
        s += head[i];
    return s;
}
inline int sum_tail(int x)
{
    int s = 0;
    for (int i = x; i > 0; i -= lowbit(i))
        s += tail[i];
    return s;
}
int main(){
    int qwq,x,y;
    read(n), read(m);
    for (register int i = 1; i <= m; i++)
    {
        read(qwq);
        read(x);
        read(y);
        if(qwq==1)
        {
            add_head(x),add_tail(y);
        }
        else
            cout << sum_head(y) - sum_tail(x-1) << endl;
        
    }
        return 0;
}

おすすめ

転載: www.cnblogs.com/iloveori/p/12556126.html