tyvj1473 校門外的樹3

2021-07-10 20:03:51 字數 1395 閱讀 3398

tyvj1473

這道題可以用兩個樹狀陣列來做把每次更新的端點分別插入兩個樹狀陣列,在查詢區間時,之前更新的區間會對當前查詢區間產生影響的條件是

更新的末端點大於查詢的始端點且更新的始端點小於等於查詢的末端點,那麼由於如果某次更新的始端點大於查詢的末端點,那麼這次更新的末端點也大於查詢的末端點

因而我們所求的就是

已更新線段的末端點不小於查詢的始端點的個數 - 已更新線段的始端點大於查詢的末端點的個數

能用樹狀陣列就不用線段樹咯。。。畢竟10分鐘a掉的題目就不麻煩寫幾種方法了

includeusing

namespace

std;

const

int maxn = 50000 + 10;

int n, m, c1[maxn], c2[maxn];

int lowbit(int x)

void add1(int x)

}void add2(int x)

}int sum1(int x)

return cnt;

}int sum2(int x)

return cnt;

}int main()

else

printf("%d\n",( sum2(n)-sum2(l-1) ) - ( sum1(n)-sum1(r) ));

}return

0;}

hzwer學長的線段樹**附上

#include

#include

using namespace std;

int n,m;

struct datatr[200001];

void build(int k,int

s,int t)

void insertl(int k,int

x,int

y) int mid=(l+r)>>1;

if(y

<=mid)insertl(k<<1,x,y);

else

if(x>mid)insertl(k<<1|1,x,y);

else

}void insertr(int k,int

x,int

y) int mid=(l+r)>>1;

if(y

<=mid)insertr(k<<1,x,y);

else

if(x>mid)insertr(k<<1|1,x,y);

else

}int askl(int k,int

x)int askr(int k,int

x)int main()

else

}return

0;}

hzwer學長部落格

TYVJ1473 校門外的樹3

思路 維護兩個樹狀陣列,乙個記錄種樹區間左端點,乙個記錄右端點。每次詢問查詢 看不見的樹區間 即右端點小於查詢區間左端點和左端點小於查詢區間右端點。1 include2 include3 include4 inline int getint 11const int n 50001 12 intn 1...

JoyOI1473 校門外的數3 (線段樹)

題意很簡單 一開始想用乙個bitset維護,明顯這個是超記憶體的。但是我為什麼還要寫 然後想了一下,能不能維護每次種樹的左右區間來寫,然而發現並不行。接著想,維護種類和維護區間沒辦法了,能不能在種樹的次數上下功夫呢?我想維護乙個種了樹和沒種樹的線段樹,詢問就是查詢區間內中了樹的最大值和沒種樹的最小值...

校門外的樹(3)

校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k 1,讀入l,r表示在l r之間種上的一種樹 k 2,讀入l,r表示詢問l r之間能見到多少種樹 l,r 0 這道題暴力線段樹無法維護...