HDU 3874 Necklace 樹狀陣列

2022-07-21 06:45:09 字數 1126 閱讀 8508

題意:求區間內不同的數的和

離線處理,按查詢右端點從小到大排序,從左往右掃一遍。

記錄每個數出現的上乙個位置,如果該數之前沒有出現過,就加上,否則就在上乙個位置減去。

#include #include 

#include

#include

#define ll long long int

using

namespace

std;

const

int maxn = 1000100

;struct

node

;int

n, q;

int pre[maxn]; //

某數之前出現的位置

ll sum[50100

];ll val[

50100

];int

maxl;

node d[

200100

];ll ans[

200100

];int lowbit( int

x )ll query(

intx )

return

res;

}void update( int x, int

val )

return;}

bool

cmp( node a, node b )

intmain()

memset( pre, -1, sizeof

(pre) );

memset( sum,

0, sizeof

(sum) );

sort( d, d +q, cmp );

int cur = 1

;

for ( int i = 0; i < q; ++i )

ans[ d[i].id ] = query( d[i].r ) - query( d[i].l - 1

); }

for ( int i = 0; i < q; ++i )

printf(

"%i64d\n

", ans[i] );

}return0;

}

Hdu 3874 Necklace 樹狀陣列

題意 詢問某一區間的值之和,相同元素只算一次 思路,樹狀陣列求解,由於區間相同元素只算一次,採用離線演算法,把區間右端點從小到大排序,按順序處理。首先我們找到乙個點時,記錄它的下標,若在後面還有與它相同的元素,我們把之前的元素去掉,插入到當前位置,每次進行這樣的一次處理,就要判斷一下,處理後該點有沒...

HDU 3874 Necklace 莫隊演算法

題目 題意 給定乙個陣列,每次詢問乙個區間 l,r 求區間內所有數字的和,出現多次的數字只加一次 思路 莫隊演算法掃一遍即可,注意會爆int。我陣列開小了不少re而是tle,蛋疼。include include include include include include using namesp...

HDU 3874 Necklace 數狀陣列

題意 求 l,r 區間內不重複的數的和。n個數,m次詢問 解 離線處理m次詢問,看得別人的思路後才知道的。思維侷限在預處理n個數上了。對m次詢問按右區間的值從小到大排序。掃一遍n個數,如果發現當前這個數在之前出現過,就從之前出現這個數的位置上把這個數刪除,在新位置上插入這個數。這樣做的好處是刪除前面...