2017雅禮7 6 right 分塊

2021-08-03 14:42:29 字數 1808 閱讀 7281

稍加分(da)析(biao)可知,當p為奇數時,sg(x)=x&1,當p為偶數時,sg(x)=(x%(p+1)==p)?2:((x%(p+1))&1)。

奇數的話相當於區間翻轉,區間異或和,直接線段樹即可。

偶數的話分塊來處理,每個塊維護乙個add標記和兩個有序陣列,分別表示奇餘數和偶餘數,區間加的時候整塊的打標記,零散的直接重構,時間複雜度o(n/s+slogs)。查詢的時候整塊lower_bound找有多少個1和2,1的話應該是奇數陣列中還沒+add不超過p的,偶數陣列中+p超過了add的,2的話根據add的奇偶性來決定在哪個陣列查詢,零散的也直接重構,時間複雜度o(nlogs/s+slogs)。

所以我也不知道s該取多少,大概250最優吧。

**:

#include

#include

#include

#include

#define mod (p+1)

using

namespace

std;

const

int maxn=100100;

const

int size=220;

int n,p,q,a[maxn];

inline

int id(int x)

inline

int l(int x)

inline

int r(int x)

struct tree

void pushdown()

}void update()

void build(int lx,int rx)

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

(ls=new tree)->build(lx,mid);

(rs=new tree)->build(mid+1,rx);

update();

}void reverse(int lx,int rx)

pushdown();

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

if(rx<=mid) ls->reverse(lx,rx);

else

if(lx>mid) rs->reverse(lx,rx);

else

update();

}int query(int lx,int rx)

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

if(rx<=mid) return ls->query(lx,rx);

else

if(lx>mid) return rs->query(lx,rx);

else

}}*xtr;

struct block

void build()

sort(rst[1]+1,rst[1]+num[1]+1);

sort(rst[0]+1,rst[0]+num[0]+1);

}void modify(int x)

void bmodify(int l,int r,int x)

int query()

int bquery(int l,int r)

return re;

}}blk[600];

int main()

if(p&1) (xtr=new tree)->build(1,n);

else

for(int i=1;i<=id(n);i++)

while(q--)

else

}

}else

printf("%d\n",(ans!=0));}}

}

}

雅禮集訓 2017 價

傳送門 乙個不太顯然的最小割做法。我們這麼連邊 源點向藥物連 infty p i 容量的邊,藥物向它對應的藥材連 infty 容量的邊,藥材向匯點連 infty 容量的邊。用源點的流量減去最小割,再負回來就可以求出答案了。怎麼理解呢?割掉一條邊表示不選其對應的藥物或藥材,我們發現最後的方案一定是完美...

2017國慶雅禮集訓 長沙雅禮划水記

一題給出數軸上 n 個座標xi 有權值w i 求由 x i xj wi wj 連邊構成的最大團。這個式子長得太像兩圓相離或外切的表示了 連數軸都告訴你了呀 於是瞬間變成取最多不重區間的水題。然而我居然忘了還有右端點排序後o n 的簡單貪心,寫了個o n2 的dp加二分優化 我太鹹啦 好在總複雜度還是...

雅禮集訓 2017 Day5 珠寶

題目描述 miranda 準備去市裡最有名的珠寶展覽會,展覽會有可以購買珠寶,但可惜的是只能現金支付,miranda 十分糾結究竟要帶多少的現金,假如現金帶多了,就會比較危險,假如帶少了,看到想買的右買不到。展覽中總共有 n種珠寶,每種珠寶都只有乙個,對於第 i種珠寶,它的售價為 ci 萬元,對 m...