稍加分(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...