程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces 19D Points(樹狀數組)

Codeforces 19D Points(樹狀數組)

編輯:C++入門知識

Codeforces 19D Points(樹狀數組)


題目鏈接:Codeforces 19D Points

題目大意:N中操作,每次添加一個點,或者刪除一個點,以及找到給定x,y坐標最近的一個坐標,並且保證xi,yi在x,y的右上角。

解題思路:這題的解法還是很機智的。

y坐標離散化,然後樹狀數組的每個單位用一個set代替,set記錄的是點集。

剩下的操作就像樹狀數組一樣,每次添加就等於是+w的操作,移除就等於是-w,只是w是一個點,那麼find操作就等於是在sum操作生成的點集中二分查找。

#include 
#include 
#include 
#include
#include 
#include 

using namespace std;
const int maxn = 2 * 1e5 + 5;
const int INF = 0x3f3f3f3f;
#define lowbit(x) ((x)&(-x))
typedef pair pii;
typedef set::iterator iter;

int N, M, pos[maxn];
set fenw[maxn];

struct Camd {
    int x, y;
    char op[10];
    void read() { scanf("%s%d%d", op, &x, &y); }
    void add() {
        for (int i = maxn - y; i < maxn; i += lowbit(i))
            fenw[i].insert(make_pair(x, y));
    }
    void del() {
        for (int i = maxn - y; i < maxn; i += lowbit(i))
            fenw[i].erase(make_pair(x, y));
    }
    void find() {
        pii ans(INF, INF);
        for (int i = maxn-y-1; i; i -= lowbit(i)) {
            iter it = fenw[i].lower_bound(make_pair(x+1, y));
            if (it != fenw[i].end())
                ans = min(ans, *it);
        }
        if (ans == make_pair(INF,INF))
            printf("-1\n");
        else
            printf("%d %d\n", ans.first, pos[ans.second]);
    }
    void solve() {
        if (op[0] == 'a') add();
        else if (op[0] == 'r') del();
        else find();
    }
}p[maxn];

void init () {
    M = 0;
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        p[i].read();
        pos[i] = p[i].y;
    }
    sort(pos + 1, pos + 1 + N);
    M = unique(pos+1, pos+1+N) - (pos+1);

    for (int i = 1; i <= N; i++)
        p[i].y = lower_bound(pos+1, pos+1+M, p[i].y) - pos;
}

int main () {
    init();

    for (int i = 1; i <= N; i++)
        p[i].solve();
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved