雅禮集訓 2018 Day7 A 題解

2022-05-20 07:23:32 字數 1477 閱讀 7198

題意:「雅禮集訓 2018 day7」a

題解:線段樹處理。

考慮只有一種與的操作。顯然當乙個區間的或和與上將要與的數還是原數時就沒必要遞迴計算了,剪枝剪掉。當一段區間與和與上將要與的數等於這段區間或和與上將要與的數時,更新後這段區間的最小值位置還是更新前的位置。由於一次操作至少將數的乙個二進位制改變,所以最多改變 \(\log }\) 次,時間複雜度\(o(n \times \log } \times \log )\)。

當存在兩個修改操作時同樣操作即可。

**:

#include#define re register

using namespace std;

const int n=500010,mx=2147483647;

int n,m,a[n];

struct p ;p t[n<<2];

int lz_or[n<<2],lz_and[n<<2];

template inline void read(t &x)

inline int min(const int &x,const int &y)

int mid=(l+r)>>1; build(u*2,l,mid),build(u*2+1,mid+1,r);

t[u]=pushup(t[u*2],t[u*2+1]);

}void mdy_and(int u,int l,int r,int l,int r,int w)

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

if(r<=mid) mdy_and(u*2,l,mid,l,r,w);

else if(l>mid) mdy_and(u*2+1,mid+1,r,l,r,w);

else mdy_and(u*2,l,mid,l,mid,w),mdy_and(u*2+1,mid+1,r,mid+1,r,w);

t[u]=pushup(t[u*2],t[u*2+1]);

}void mdy_or(int u,int l,int r,int l,int r,int w)

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

if(r<=mid) mdy_or(u*2,l,mid,l,r,w);

else if(l>mid) mdy_or(u*2+1,mid+1,r,l,r,w);

else mdy_or(u*2,l,mid,l,mid,w),mdy_or(u*2+1,mid+1,r,mid+1,r,w);

t[u]=pushup(t[u*2],t[u*2+1]);

}int qry(int u,int l,int r,int l,int r)

int main()

// printf("<<< ");

// for(int i=1;i<=n;i++) printf("%d ",qry(1,1,n,i,i));

// printf("\n");

} return 0;

}

雅禮集訓 2018 Day4 Magic

傳送門本部分 於 這位大佬 題中要求本質不同的序列數量,不太好搞。我們考慮給相同顏色的牌加上編號,這樣所有牌都不相同。那麼如果我們求出了答案,只需要將答案除以 prod a i 就好了。恰好有 k 對 不能直接求,考慮容斥,如果我們求出了 g x 表示至少有 x 對的方案數,那麼答案即為 sum l...

雅禮集訓Day4

今天炸的1p。t1,給你100次詢問,每次l,r,選 l,r 中的若干數進行異或,求有多少種結果,1 l r 1e18.做法 暴力很顯然是將l,r這些數加入線性基,然後算一下線性基里有多少個數。我們可以考慮線性基的每一位最早在多久被加入。這個就可以看l了,它二進位制的最高位很顯然是一開始就加入線性基...

雅禮集訓Day4

今天炸的1p。t1,給你100次詢問,每次l,r,選 l,r 中的若干數進行異或,求有多少種結果,1 l r 1e18.做法 暴力很顯然是將l,r這些數加入線性基,然後算一下線性基里有多少個數。我們可以考慮線性基的每一位最早在多久被加入。這個就可以看l了,它二進位制的最高位很顯然是一開始就加入線性基...