目錄考試**
期望得分:100+40+10
實際得分:100+10+10
非要用滾動陣列,還不好好清空,丟了30分吧。
比賽鏈結
題目鏈結
拆一下方差的式子就可以\(o(1)\)得到要求的值了。
出題人:資料是精心設計的,剛好不會爆longlong。
是的,這是在你原題面乘\(n-1\)而不是乘\((n-1)^2\)的情況下。
longlong不好爆嗎,\((10^4)^2\times 10^5\times 10^5\times 10^5=gg\)。so資料(故意)水差評。
輸出格式真心有毒。
#include #include #include #define gc() getchar()
typedef long long ll;
const int n=1e5+5;
int n,a[n];
inline int read()
//void print(__int128 x)
//// if(x>9) print(x/10);
// putchar(x%10+'0');
//}int main()
\times a_i\),這樣多算了\(i\)與\(i+1\)相同的情況,所以再減去\(f_\times\min(a_i,a_)\),...)
首先把\((-1)^i\)提出來:$$f_i=(-1)^i\times\sum_,\ldots,a_i\}\to\min\,\ldots,a_\}\),只改變一項,可以用線段樹取min、求和做。
我們實際是在每個位置維護乙個字尾最小值。
如圖,當新增\(i+1\)時,會使\(a\sim i+1\)的最小值改變,即把\(b\sim c,c\sim i\)這兩段刪去,新增新的一段\(a\sim i+1\)。可以用單調棧維護。
然後是環的問題。即若\(1\)和\(n\)相同則不合法。
我們可以用不考慮環的\(f[n]\),減去不考慮環的\(f[n-1]\),即直接讓\(1\)和\(n\)相等(即不合法方案數)。但是又會多減(不用想感覺應該是這樣...),所以再加\(f[n-3]\)......
還有個問題是合併時\(a_1,a_n\)是否可以取值相同。可以把最小的\(a_i\)轉到\(a_1\)位置,這樣就可以直接和最後一段合併。
坑
題目鏈結\(m=0\)時用\(lb(x)=lowbit(x)\)表示\(x\)二進位制下最低位的\(1\),即\(x\)集合內標號最小的元素。用\(x|y\)表示集合\(x\)與\(y\)的並。
那麼:把\(lb(x)\)相同的元素全部分給乙個人,這樣構造的方案一定是合法的。
證明:因為\(lb(x|y)\)一定等於\(lb(x)\)或\(lb(y)\),所以若集合\(x,y\)都屬於a,集合\(x|y\)也一定屬於a。
\(lb(x)=i\)的\(x\)的個數恰好有\(2^\)個(比\(i\)大的\(n-i\)個元素任選),可以直接對\(k\)二進位制拆分。
\(m>0\)時
把上述做法推廣,我們給每個元素定義乙個優先順序,使得不同元素優先順序不同。
然後對於乙個集合,定義其"特徵"為其中優先順序最高的元素的編號。
那麼把特徵相同的集合全部分給乙個人,這樣構造的方案一定是合法的。
同時我們可以證明,對於所有方案都可以用這種方法構造。
證明:那麼問題有兩個:1.確定每個元素的優先順序,從而計算集合的特徵;2.把特徵相同的集合分給同乙個人。假設 \(\\in s\)
那麼一定存在乙個 \(i\) ,使得 \(\forall u\) 使得 \(i\in u\), 必有 \(u\in s\) .
(如果不存在,那麼 \(\forall i, \exists i\in v_i, v_i\in t\) ,那麼\(\=\bigcup_i v_i \in t\),矛盾)
不失一般性,交換\(s,t\)也成立。
因為有\(k\)限制,哪些集合分給誰是確定的,即第二個問題不需要考慮。
然後第乙個問題我就看不懂了。
求路過dalao解答
坑
#include #include #include #define gc() getchar()
#define maxin 300000
//#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)
#define mod(x) x>=mod&&(x-=mod)
#define mod 1000000007
typedef long long ll;
const int n=1e5+5;//1e6+5
int n,a[n],ref[n],f[2][1005][1005];
char in[maxin],*ss=in,*tt=in;
inline int read()
inline int find(int x,int r)
bool spec1()
/*8 10 10 10 10 10 10 10 10
43046730*/
int main()
now=las, las^=1;
} ll ans=0;
for(int i=1,a1=a[1]; i<=a1; ++i)
for(int j=1,an=a[n]; j<=an; ++j)
if(i!=j) ans+=f[las][i][j];
printf("%d\n",(int)(ans%mod));
return 0;
}
#include #include #include #define gc() getchar()
const int n=(1<<18)+5;
int n,m,lim,k,a[10005];
bool ok,chose[n],need[n],inq[n];
char ans[n];
inline int read()
void dfs(int x,int sum)
if(need[x])
else
int main()
else printf("-1");
return 0;
} if(1||!check1()) return printf("-1"),0;
return 0;
}
10 14 牛客提高集訓營5
目錄比賽鏈結 題目鏈結 首先容斥一下,ans r 1,r 2 r 1,l 2 1 l 1 1,r 2 l 1 1,l 2 1 x,y 表示 l 1 l 2 0,r 1 x,r 2 y 時的答案。因為是異或,我們按位考慮。對於 r 1,r 2 考慮這種特殊情況 r 1 2 n 1,r 2 2 m 1 ...
牛客CSP S提高組賽前集訓營2
然後隨便用乙個資料結構維護一下就行了,我寫的線段樹。我們先找出每個環,然後我們先刪連線環的邊,每刪一條就可以多產生乙個聯通塊,在考慮刪環邊,發現從最大的環刪起一定最優 因為你刪的第一條邊得不到任何新的聯通塊 就很容易想到tar jantarjan tarjan 發現你只能寫出80 8080 分,因為...
牛客CSP S提高組賽前集訓營1
比賽鏈結 官方題解 before t1觀察 結論題,t2樹形dp,可以換根或up down,t3正解妙,轉化為圖上問題。題目質量不錯,但資料太水了 一共n個石子堆,每個石子堆有ai個石子,兩人輪流對石子塗色 先手塗紅,後手塗藍 且需要保證當前回合塗的石子顏色不能和它相鄰的兩個同色,誰塗不下去誰輸。一...