具體思路:用線段樹儲存每個區間的顏色,然後再打乙個染色的標記,注意最後統計的時候,相鄰區間的不注意的話會被算成兩種。如果按照我一開始的思路的打,(1,4)這個區間,(5,8)這個區間,如果(1,4)的顏色和(5,7)的顏色相同,但是如果(5,8)是乙個混色的時候,這個時候會被統計成兩個顏色,其實是只有一種顏色,這個地方注意下。
ac**:
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
# define inf 0x3f3f3f3f
# define ll long long
# define maxn 5000000+1000
# define lson l,m,rt<<1
# define rson m+1,r,rt<<1|1
int a[maxn];
int col[maxn];
mapq;
int ans[maxn];
int t;
void up(int rt)
if(a[rt<<1]!=a[rt<<1|1])
a[rt]=a[rt<<1];
col[rt]=1;
}void down(int rt)
}void update(int l,int r,int p,int l,int r,int rt)
down(rt);
int m=(l+r)>>1;
if(l<=m)update(l,r,p,lson);
if(r>m)update(l,r,p,rson);
up(rt);
}void query(int l,int r,int rt)
down(rt);
int m=(l+r)>>1;
query(lson);
query(rson);
}int main()
query(1,8010,1);
q[ans[1]]++;
int num=0;
for(int i=2; i<=t; i++)
}for(int i=0; i<=8001; i++)
}printf("\n");
}return 0;
}
線段樹注意事項
1.所有的乘除法都用位運算,速度快,而且好像可以防wrong answer 2.樹的大小開maxn的四倍,即maxn 2 3.如果範圍是 0,n 1 子節點為2 root 1和2 root 2 如果範圍是 1,n 子節點為root 1和root 1 1 4.區間更新時,節點表示範圍內的總和,和表示範...
ZOJ 1610 線段樹區間染色
給長度8000公尺的板,對其中區間染色,問最後能看到的顏色,和該顏色一共出現了幾段 線段覆蓋法 資料比較水 也可以暴力水過 線段樹 include stdio.h include string.h struct node data 40010 int color 8011 void build in...
區間染色 kuagnbin線段樹專題(3)
hdu 1698 just a hook p2161 shoi2009 會場預約 本來是把區間染色放到第一次總結的,但是後來才發現自己對區間染色並沒有那麼熟練,所以特意提取出來總結一遍。區間染色的查詢主要有兩種 一種是直接詢問 l,r 之間的顏色種類,還有就是對每個顏色有一定的權值,求 l,r 之前...