線段樹(狀態壓縮二進位制)

2022-09-06 22:51:25 字數 1936 閱讀 9832

題意:給出n(1e5)的長度的木棒,初始的顏色都為1,給出顏色種類t(1<=t<=30),給出q(1e5)個操作, c l r x 將l到r內的所有顏色更改為x , p l r 問在l到r內有多少種顏色。

解法:觀察發現顏色種類不多,將顏色轉為二進位制,每一位代表一種顏色,1表示有改顏色。

用線段樹儲存下當前的每一段的顏色,更改用陣列lazy標記,將顏色轉化為二進位制數,統計一段顏色時,對每一段可以對它的左右子樹取 | 這樣就可以統計這一段中的顏色出現的種類。

//#include#include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll ;

#define int ll

#define mod 1000000007

#define gcd __gcd

#define rep(i , j , n) for(int i = j ; i <= n ; i++)

#define red(i , n , j) for(int i = n ; i >= j ; i--)

#define me(x , y) memset(x , y , sizeof(x))

//ll lcm(ll a , ll b)

ll quickpow(ll a , ll b)return ans;}

//int euler1(int x)if(x>1)ans-=ans/x;return ans;}

//const int n = 1e7+9; int vis[n],prime[n],phi[n];int euler2(int n)for(int j=1;j#define fi first

#define se second

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

using namespace std;

const int n = 1e6+100;

const int maxn = 1e5+9;

int n , t , q ;

int cl[maxn<<2] , lazy[maxn<<2];

char s[5];

void pushup(int rt)

void pushdown(int rt)

void build(int l , int r , int rt)

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

build(lson);

build(rson);

pushup(rt);

}void update(int l , int r , int l , int r , int rt , int c)

if(lazy[rt]) pushdown(rt);

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

if(mid >= l) update(l , r , lson , c);

if(mid < r) update(l , r , rson , c);

pushup(rt);

}int query(int l , int r , int l , int r , int rt)

if(lazy[rt]) pushdown(rt);

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

if(mid >= l) sum |= query(l , r , lson);

if(mid < r) sum |= query(l , r , rson);

return sum;

}int ans(int sum)

return cnt ;

}void solve()else

}}signed main()

二進位制狀態壓縮

二進位制狀態壓縮,即將乙個長度為m的bool陣列用乙個m位的二進位制數來表示和儲存 操作運算 取出整數n在二進位制表示下的第k位 n k 1 取出整數n在二進位制表示下的第0 k 1位 後 k 位 n 1 取出整數n在二進位制表示下的第k位取反 n xor 1 取出整數n在二進位制表示下的第k位賦值...

Sleep Buddies (二進位制狀態壓縮)

演算法 狀態壓縮,把每乙個集合都壓縮成乙個數字。使用方法 把每個狀態都進行1 ac code 1 include 2 using namespace std 3 typedef long long ll 4 const int maxn 1e5 10 5 define rep i,first,las...

總結 二進位制狀態壓縮

目錄 二 二進位制狀態壓縮的操作 三 具體應用 1.定義 二進位制狀態壓縮,是指將乙個長度為 m 的 bool 型別陣列用乙個二進位制下有 m 位的整數表示並儲存的方法。2.應用範圍 二進位制狀態壓縮是狀態壓縮動態規劃,寬度優先搜尋狀態壓縮優化的重要基礎。我們在構建程式時一定要注意 在 m 位二進位...