洛谷 P4964 綾小路的特別考試 解題報告

2022-04-30 01:27:11 字數 3496 閱讀 7167

這世界上「勝利」便是一切。無關乎過程。

要付出多少犧牲都無所謂。只要最後我「勝出」那就行了。

一場新的特別考試來臨了,這次的考試內容是(wan e de)文化課,但有所不同的是,考試中允許學生使用對講機。然而,對講機的接收範圍有限(每個對講機都能傳送無限遠,但是只能接收到接收範圍內的訊號),所以,需要周密地安排才能將對講機的功效發揮到最大。這時,綾小路找到了你,希望你能幫他計算某種方案下的結果。

考試時,共有 \(n\) 名學生坐成一排(從左至右依次編號為 \(1\) ~ \(n\)),綾小路自己坐在第 \(c\) 號位置。每名學生都有乙個能力值 \(w_i\)。綾小路已經給每名學生安排了乙個接收範圍為 \(d_i\) 的對講機。

每名學生可以直接做出難度不超過自身能力值的所有題目,一旦一名學生憑能力做出某道題,他就會把這道題的做法進行廣播。一名坐在位置 \(i\),有接收範圍為 \(d_i\) 的對講機的學生,可以接收到 \([i-d_i,\ i+d_i]\) 範圍內所有學生的廣播,若這個範圍內有人公布了做法,則他將會做這道題,並也會把這道題的做法進行廣播。

綾小路會問你一些問題:當一道題目難度為 \(x\) 時,有多少學生會做這道題?由於綾小路想隱藏實力,他可能會修改自己的能力值。這兩種操作分別用以下兩種方式表示:

形式化描述(與上文同義):

給你兩個長為 \(n\) 的數列 \(w_\) 和 \(d_\),以及乙個 \(w_c\) 可修改的位置 \(c\)。現在有兩種操作:

建議你忽略輸入格式,直接使用下面提供的資料生成器模板,了解具體的生成過程對你來說是不必要的。第一行,三個正整數 \(n,\ m,\ c\),分別代表學生的總人數,操作總數和綾小路所在的位置。

第二行,五個整數 \(\mathrm,\ \mathrm,\ \mathrm,\ \mathrm,\ k\)。

此處的 \(\mathrm,\ \mathrm\) 僅用於生成初始的 \(d_\),下文中調整 \(d_p\) 所用的 \(t\) 可能不在 \([\mathrm,\ \mathrm]\) 範圍內。

接下來的 \(k\) 行,每行兩個整數 \(p,\ t\),表示調整第 \(p\) 號同學的對講機接收範圍(即 \(d_p\))為 \(t\)。

若一名同學的對講機接收範圍被調整多次,以最後一次為準。

** 資料生成器模板:**

#include unsigned long long seed;

int n, m, c, mfq, mind, maxd, k, w[2000001], d[2000001];

inline int randint()

void generate()

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

}void getoperation(int lastans, int &opt, int &x)

else

x = (0ll + randint() + lastans) % n;

}int main()

// 從這裡開始,你可以使用生成的 w 陣列和 d 陣列.

int lastans = 0, finalans = 0;

for (int i = 1; i <= m; i++)

else

}printf("%d\n", finalans);

return 0;

}

令 \(ans_i\) 表示第 \(i\) 次詢問(操作 \(1\) )的答案,\(t_i=\begin(t_\times 233+ans_i)\mod 998244353\quad(i\ge 1)\\0\quad(i=0)\end\)

設 \(q\) 表示詢問(操作 \(1\) )的個數,你只需要輸出乙個整數 \(t_q\)。

\(1\le c\le n\le 2\times 10^6\),\(1\le m\le 2\times 10^6\),\(0\le w_i,\ d_i,\ x。

\(1\le \mathrm,\ \mathrm\le 10^9\),\(0\le \mathrm\le \mathrm,\(0\le k\le 2\times 10^5\),\(1\le p\le n\),\(0\le t。

思路很簡單但是為什麼想不出來的乙個題目??

考慮暴力,每個點向可以接收到\(\tt\)的點連有向邊,這樣從每個點出發可以遍歷到的點都是\(\tt\)可以把答案傳出去的點。這樣連邊是\(o(n^2)\)的

考慮優化連邊,發現找離它最近左右的可以連到\(\tt\)的點就可以了。

實現的時候拿個棧就可以維護了。

發現修改每次只改乙個位置的值,可以特殊處理\(\tt\)

預處理出每個詢問在路哥傳不傳答案時的貢獻。

可以把元素排序以後從大到小進行\(\tt\),並每次記錄被染色的點。

排序可以桶排,計數排序保證複雜度,也可以直接\(\tt\),跑的也挺快的。

code:

#include #include #include unsigned long long seed;

const int n=2e6+10;

int n,m,c,mfq,mind,maxd,k,d[n],ans[2][n];

struct node

}w[n];

inline int randint()

void generate()

void getoperation(int lastans,int &opt,int &x)

int sum,used[n],wc,ch[n][2],s[n],tot;

int max(int x,int y)

void dfs(int now)

void init()

std::sort(w+1,w+1+n);used[0]=1;

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

dfs(w[i].id);

ans[0][w[i].w]=sum;

}memset(used,0,sizeof(used));

used[0]=1,sum=0,dfs(c);

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

for(int i=n-10;~i;i--) ans[0][i]=max(ans[0][i],ans[0][i+1]),ans[1][i]=max(ans[1][i],ans[1][i+1]);

}int main()

else

wc=x;

}printf("%d\n",finalans);

return 0;

}

2018.11.7

洛谷 P1771 方程的解

這道題是組合數的知識,就是讓我們求k個正整數加起來等於xx 1000的方案有多少種 由於我們是要找正整數,所以肯定不會有0,所以就把xx 1000用隔板法分成k份,這樣得到就是c k 1,xx 1000 1 因為這個數範圍比較大,所以我們需要高精度處理 ac 如下 include using nam...

洛谷 P1020 關於最長上公升子串行的四種解法

首先講題目意思,第一問求最長不上公升子串行,第二問求最長上公升子串行,說實話第二問一開始我沒看出是求上公升子串行的,看了別的大佬的題解才發現用上公升子串行。第一種,簡單的動態規劃,o n 2 的演算法 include include include include include include i...

洛谷 P1141 01迷宮 一道並查集巧解的題

不難想到,該題可以用dfs做 但是這道題用並查集的方法可能還更簡單些 因為從乙個點出發只能走到與他數字不同的那個點,所以單獨在並查集模板的基礎上用乙個num陣列表示當前節點及其子節點的連通塊數。1.因為當前這個點只與上乙個點有關,所以可以用乙個滾動陣列優化記憶體 2.如何實現從乙個點出發只能走到與他...