POJ2777解題報告 線段樹,二進位制儲存狀態

2022-03-01 10:48:58 字數 1744 閱讀 7352

題目概述:

給一塊長度為l的板子,有兩種操作,第一種將a到b刷成顏色c,第二種詢問a到b一共有多少種顏色。顏色數小於等於30。

大致思路:

首先很容易發現線段樹可以解決問題,不過怎麼儲存顏色呢?我們發現顏色總數很少,於是可以為2進製位來表示顏色,問題就可以很好地解決了。

**:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define sacnf scanf

#define scnaf scanf

#define maxn 100010

#define maxm 26

#define inf 1061109567

#define eps 0.00001

const

double pi=acos(-1.0

);#define mod 7

#define maxnum 10000

void swap(int &a,int &b)

int abs(int x)

typedef

long

long

ll;typedef unsigned

intuint

;struct

node

tree[maxn*3

];int t,p2[32

];void build_tree(int l,int r,int

dir)

void pushdown(int l,int r,int

dir)

tree[dir].color=(1

void set(int l,int r,int dir,int sl,int sr,int

c)

if(tree[dir].set_flag!=0

) pushdown(l,r,dir);

int m=(l+r)>>1

; set(l,m,dir*2

,sl,sr,c);

set(m+1,r,dir*2+1

,sl,sr,c);

tree[dir].color=(tree[dir*2].color|tree[dir*2+1

].color);

}int query(int l,int r,int dir,int ql,int

qr)void debug(int

n) printf("\n

");}int

main()

else

if(c=='p'

)

//debug(l);

} }

//clock_t ed=clock();

//printf("\n\ntime used : %.5lf ms.\n",(double)(ed-st)/clocks_per_sec);

return0;

}

線段樹模板 poj2777

線段數塗色 include include using namespace std define maxn 100005 struct node tree maxn 4 bool visit 40 int sum void build int left,int right,int id tree i...

POJ2777 線段樹染色

初始顏色均為1,倆操作 修改 將 l,r 染為顏色z 查詢 l,r 的不同顏色數 1e5個點,1e5個操作,30種顏色 查詢 如果查詢維護區間顏色數,不滿足區間加法 顏色數較少,維護區間顏色狀態s val pushup 當前子樹s 左子樹s 右子樹s 修改 維護顏色替換標記lazy 注意pushdo...

POJ 2777 線段樹 位運算

poj 2777 有乙個長位l的區間,有t種顏色,進行o次操作,每次操作 1 n 100000,1 t 30 1 o 100000 每次操作有兩種形式 p a b c 將區間 a,b 染成顏色c q a b 詢問區間 a,b 有多少種不同的顏色 每個點的初始顏色都是1 注意 a可能大於b 線段樹的區...