六省聯考2017

2022-03-25 18:28:02 字數 3188 閱讀 4934

luogu

lojbzoj

顯然我們只需要考慮最後公布成績的那一天。

列舉這一天,預處理字首和之後即可\(o(1)\)計算最小代價。

注意倒數第二個subtask這最優的日期就是\(\min(b_i)\),直接計算即可。(如果套用通法會爆long long,但是開unsigned long long就行了)

#include#include#includeusing i64=unsigned long long;

const int n=100007;const i64 inf=1e18;

i64 t1[n],t2[n],a,b,c;

int read()

i64 cal(i64 a,i64 b)

int main()

printf("%lld",ans);

}

luogu

lojbzoj

給定乙個數\(p\),最多進行\(o(\log p)\)次\(p\leftarrow\varphi(p)\)即可令\(p=1\)。

也就是說乙個位置在被修改了\(o(\log p)\)次之後,它的值就不會變了。

那麼我們記錄乙個位置被修改過多少次,每次修改的時候區間內的所有位置單獨拿出來暴力計算即可。

預處理快速冪即可\(o(\log^2p)\)進行單點計算。

為了不再訪問那些被修改超過\(o(\log p)\)次之後的位置,我們可以使用線段樹記錄區間修改最小次數,或者利用並查集+樹狀陣列。

時間複雜度為\(o(n\log p(\log p+\log n))\)。

#include#include#include#includeconst int n=50007,m=10007;

int n,m,p,c,a[n],o[n],t[n],tim[n],fa[n],pw1[30][m],pw2[30][m];std::vectormod;

void inc(int&a,int b)

int pow(int a,int b)

int read()

int phi(int x)

int find(int x)

void add(int p,int v)

int ask(int p)

void modify(int p,int t)

void update(int l,int r)

int main()

for(int o,l,r;m;--m) o=read(),l=read(),r=read(),o? printf("%d\n",(ask(r)-ask(l-1)+p)%p):(update(l,r),0);

}

luogu

lojbzoj

\(\sum\limits_=[x^r](1+x)^\bmod(x^k-1)\)

迴圈卷積快速冪即可。

#include#includeusing vec=std::vector;

int n,r,p,k;

void inc(int&a,int b)

int mul(int a,int b)

vec operator*(const vec&f,const vec&g)

luogu

lojbzoj

很顯然是乙個樹形dp。

\(f_\)表示\(u\)子樹內過\(u\)的一條單鏈。

\(f_\)表示\(u\)子樹內不經過\(u\)的一條路徑。

\(f_\)表示\(u\)子樹內過\(u\)的一條路徑。

\(f_\)表示\(u\)子樹內的一條路徑和過\(u\)的一條單鏈。

具體的看這個吧link。

或者寫個暴力拍,拍出錯就加一種情況。

考場上這種曠野大討論的題一般都不會去做的。

#include#include#include#includeconst int n=100007;

int ans,f[n][4],deg[n];std::vectore[n];char ibuf[1<<23|1],*is=ibuf;

int read()

void max(int&a,int b)

void dfs(int u,int fa)

}int main()

}

luogu

lojbzoj

顯然最優的決策是倒序遍歷,碰到開著的燈就關上。

然後我們可以列舉約數變列舉倍數在\(o(n\log n)\)的時間複雜度內求出最小操作次數\(cnt\)。

設\(f_i\)表示從最小操作次數為\(i\)的狀態轉移到最小操作次數為\(i-1\)的期望操作次數。

轉移方程很顯然,\(f_i=\frac in+\fracn(f_i+f_+1)\)即\(f_i=\frac}i\)。

最後答案就是\(\min(k,cnt)+\sum\limits_^f_i\)。

#include#includeconst int p=100003;

int a[p],f[p];

int read()

void inc(int&a,int b)

int mul(int a,int b)

int pow(int a,int b)

int main()

luogu

lojbzoj

首先**裡面的\(cx\)部分可以直接由\(d_\leftarrow d_-a_i\)完成。

然後我們發現這就是個標準的最大權閉合子圖,選\(d_\)必須選\(d_,d_\)。

然後考慮**中\(mx^2\)這部分,建\(\max(a)\)個點,選\(d_\)必須選\(-a_i\)即可。

#include#include#include#includeconst int n=107,v=6507,e=60007,inf=1e9;

int a[n],id[n][n],d[n][n],s,t,tot=1,head[v],cur[v],dep[v];struct edgee[e];std::queueq;

int read()

void add(int u,int v,int f),head[u]=tot,e[++tot]=,head[v]=tot;}

int bfs()

題解 六省聯考2017

題目順序不是做題順序也不是考試順序更不是難度順序,是隨機順序。為了不影響 體驗決定把 刪去,需要請私信我,qq或皆可。題目裡的難度評分是個人評分,僅供參考開心就好。題意是給定期末考試每門課的出分時間和學生希望的出分時間,如果學生要等就會有不滿意度。你可以進行老師的增加和調換操作,但是都會產生不滿意度...

六省聯考2017 題解

t1 期末考試 題意 有 n 位同學,每位同學都參加了全部的 m 門課程的期末考試,都在焦急的等待成績的公布。第 i 位同學希望在第 t i 天或之前得知所有課程的成績。如果在第 t i 天,有至少一門課程的成績沒有公布,他就會等待最後公布成績的課程公布成績,每等待一天就會產生 c 不愉快度。對於第...

六省聯考2017題解

觀察資料範圍,發現 n 非常大,但是 k 和 r 很小,容易想到矩陣乘法。原題式子的組合意義就是從 n times k 個物品選擇 i i bmod k r 個物品。考慮dp,設 f 表示從 i 個物品中選擇 s s bmod k j 個物品。由於 c c c 因此可以推出 f f f 發現所有的 ...