HDU1199 動態線段樹 離散化

2022-05-20 05:26:30 字數 2397 閱讀 1651

附動態線段樹ac**

在乙個全部塗黑色的條子上塗上一些白色或黑色的片段,問最大白色片段。

僅僅從線段樹維護節點的角度上來看很簡單,維護最大白色片段,左邊最大白色片段,右邊最大白色片段就好了。

由於條子的長度長達1-int_max;

採用離散化,或者像我一樣失了智去用動態線段樹的方法,也能ac

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define for(i, x, y) for(int i=x; i<=y; i++)

#define _for(i, x, y) for(int i=x; i>=y; i--)

#define mem(f, x) memset(f, x, sizeof(f))

#define sca(x) scanf("%d", &x)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i = 0; i <= n ; i ++) u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second

using

namespace

std;

typedef vector

vi;const

double eps = 1e-9

;const

int maxn = 2010

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; inline

intread()

intn,m;

struct

tree

}tree[maxn * 60

];int

tot;

void check(int &t)

void add(int &t,ll l,ll r,int

v)else

tree[t].lazy =v;

}void pushdown(int&t,ll l,ll r)

void pushup(int

t,ll l,ll r)

tree[t].rsum =tree[rs].rsum;

if(tree[rs].rsum == r -m)

}void update(int &t,int q1,int q2,ll l,ll r,int

v) pushdown(t,l,r);

ll m = (l + r) >> 1

;

if(q1 <=m) update(tree[t].lt,q1,q2,l,m,v);

if(q2 > m) update(tree[t].rt,q1,q2,m + 1

,r,v);

pushup(t,l,r);

}ll left,right;

void query(int

t,ll l,ll r)

check(tree[t].lt); check(tree[t].rt);

int ls = tree[t].lt; int rs =tree[t].rt;

ll m = (l + r) >> 1

;

if(tree[ls].sum ==tree[t].sum) query(ls,l,m);

else

if(tree[rs].sum == tree[t].sum) query(rs,m + 1

,r);

else }

intmain()

else

}if(!tree[root].sum)

query(root,l,r);

printf(

"%lld %lld\n

",left,right);

}return0;

}

HDU1199 離散化線段樹

題目大意 一段長度未知的線段,一種操作 a b c 表示區間 a,b 要塗的顏色,c w塗白色,c b塗黑色,問你最長的白色區間段時多長。解題思路 就快去南京邀請賽了,最近做題超沒狀態,cf rating一直掉,這麼簡單的線段樹離散化居然搞了我乙個晚上,糾結。開始用線段樹區間合併的方法做,wa到死,...

HDU 3333 線段樹 離散化

只查詢區間不同的數的和 思路好題 對查詢離線 不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 等價操作的轉換 離散化一下 include define mem a,b memset a,b,sizeof a define lson root 1 define rson ro...

離散化 線段樹

題目 分析 每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和 一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列 sum 區間數的值的和 nu...