9 16 牛客提高集訓營2

2022-04-02 15:13:17 字數 3543 閱讀 9757

目錄考試**

期望得分: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\)時

把上述做法推廣,我們給每個元素定義乙個優先順序,使得不同元素優先順序不同。

然後對於乙個集合,定義其"特徵"為其中優先順序最高的元素的編號。

那麼把特徵相同的集合全部分給乙個人,這樣構造的方案一定是合法的。

同時我們可以證明,對於所有方案都可以用這種方法構造。

證明:

假設 \(\\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\)也成立。

那麼問題有兩個:1.確定每個元素的優先順序,從而計算集合的特徵;2.把特徵相同的集合分給同乙個人。

因為有\(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個石子,兩人輪流對石子塗色 先手塗紅,後手塗藍 且需要保證當前回合塗的石子顏色不能和它相鄰的兩個同色,誰塗不下去誰輸。一...