2019山東省賽 除了神仙題(G,I,J)

2021-09-23 05:52:01 字數 1849 閱讀 9108

個人認為的難度順序:

a:模擬

m:模擬(當n較大的時候  要考慮到1直接輸出  不然會t)

f:貪心。直接取所有石子的平均數,然後少的從多的補,多的去除(一定能補完,因為取平均數是向下取整)

c:直接遍歷第一遍迴圈和最後一遍迴圈上的所有點距離原點的曼哈頓距離,即可。

d:博弈,給出無向圖,每次輪著刪除一條邊,直到某個人刪除任意一條變後,都不能使這個圖聯通,就gg.

仔細一想,發現:

n個定點,要組成連通圖  肯定要至少n-1條邊,每個人都是最優的刪除方法的話,無論怎麼刪除順序,最後哪個輸的人是確定的

(即刪到n-1條邊的時候),然後讓那一組都輸即可。

l;dfs+拓撲排序判環。

把大小關係轉化成有向圖連邊,大於關係dfs走一次,小於走一次,每個點算出他的子樹大小  就是比他小的數的個數。

最後判斷輸入的2個數是否相同和圖是否成環 成環就不可能存在 輸出全0串。

以上是模擬賽a的

下面補題

b:e:

baobao loves reading

題意:按照順序依次從書架上取書到桌上,桌上的容量為k(1<=k<=n),當桌上書本個數小於k時,直接取書,若》=k,則需要把桌上最早閱讀的書放回再取,問每次需要取書的次數是多少。

如果直接考慮對於每個k,如果要考慮要取的次數,要對每本書都遍歷,比較困難。

但我們逆向思維一手,就會發現,只考慮不需要取的書:肯定是之前書桌上有這本書才不需要取,

而且那本書的閱讀次序越靠後越好。(因為)是優先放回最先讀的書。

所以我們只需要查詢所有2個最近相同的數,如果這2個數之間的數,不同數的個數小於等於k,則書桌容量大於k的時候都不需要取。

我們可以讓dp[i]是k==i的時候   不取書的次數。

那麼 每次我們查詢到2個相鄰的數發現不同數等於m,那麼所有書桌容量i>=m的不取書數都要+1.

這個操作我們可以用字首和直接線性處理(每次只讓第乙個數+1)

然後輸出的時候用樹狀陣列來處理查詢2最近相同數之間的不同數的個數。

即:輸入了乙個與之前都不同的數  讓這個位置+1,否則讓之前相同的數-1,這個位置+1.這樣不會影響以後的查詢

查詢時就直接查詢2個數座標之間數的和即可。

#include using namespace std;

typedef long long ll;

#define fi first

#define se second

typedef pairp;

const int m = 1e5 + 10;

using namespace std;

int a;

int n;

int c[m];

void add(int x,int d)

}int ask(int x)

return ans;

}int pre[m];

int dp[m];

int main()

else

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

dp[i]+=dp[i-1];

for(int i=1;iprintf("%d ",n-dp[i]);

printf("%d\n",n-dp[n]);

} return 0;

}

2019山東省賽L題題解

最後半個小時心態崩掉的時候看到了這個題,只能說兜兜轉轉都是緣分啊,愉快的敲了50行模板交上了 題意 n個數字,給出一些大小關係 給出的關係中沒有等於 對於1 x n,看是否可以構造出乙個序列a使得ax為中位數 n為奇數 思路 1 只要有環,對於所有1 x n都是不可能滿足題意的 2 考慮中位數的特殊...

2019山東省賽C題(c )

原題 題目大意 乙個點 x,y 在座標軸上按如下規則移動 預設最初點為 0,0 輸入 第一行是整數t,有t組樣例 每組樣例中,第一行是整數n m,代表有n個操作,m次執行這n個操作,第二行是字串,是要執行的操作 輸出 對每組樣例,在一行中輸出 x y 的最大值 思路 對一組樣例來說,每次執行的n個操...

2019山東省賽補題

a題 題解 a題注意看清題目每月三十天每週五天很關鍵,因為每月星期幾是固定的。include define ll long long using namespace std const ll nl 1e5 5 ll a nl ll b nl ll c nl int main else if s tu...