題目概述:
給一塊長度為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 線段樹的區...