8 6省選模擬總結

2021-07-04 09:25:46 字數 3786 閱讀 9108

今天被低2屆的虐暴了….

感覺最近狀態有點低迷,做題速度低下..要多到網上刷題才行!

第一題 刪數字

題目大意

給你乙個n 個數組成的序列v,要你刪除其中k 個數,m 表示剩下的數字中任意兩個數的差值的最大值,m 表示最小差值,要你計算刪除k 個數後,m+m

的最小值。

這題我一下在腦抽了..

排序後可以發現若維護乙個長度為n-k的數列,中間的數一定不會刪(這個我沒想到….雖然我知道要排序,但還是認為中間有可能刪…),這樣會同時放大m和m,所以答案一定是乙個連續的數列,列舉右邊界,然後用單調佇列來維護m,當左邊界移動時,消除佇列中不合法的數即可。

貼**

#include

#include

#include

#include

using

namespace

std;

#define n 1000001

int n,m,l,r;

int ans;

int d[n][2],a[n];

void init()

void did(int x,int y)

void work()

ans=d[l][1]+a[m]-a[1];

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

}void write()

int main()

第二題 最短路

n 個結點、m 個含k 個結點的完全子圖構成乙個奇怪的圖,問從結點1 走

到結點n 最少需要經過多少個結點。

一開始我以為可以過的,被卡了乙個點,超時…

方法一:我們可以將圖改造一下,將點1、n單獨出來,將完全子圖看做是點,當兩個完全子圖含同乙個數字時將兩個圖(點)連邊,還要將1、n向包含它們的子圖連邊。(這部分我用m^2*k來打,超時了,也可以用位運算強行加速,速)

最後跑個bfs+1就是答案了。

貼**

#include

#include

#include

#define n 100001

#define m 1002

using namespace std;

int n,m,ans,k;

bool bz[m];

int f[n],a[m*m*2][2],g[n],b[m][m],d[n+10];

void ins(int x,int y)

void init()

void spfa()}}

void work()

void write()

int main()

第三題 病毒

題目:

病毒擴散了!村莊中共有m 個人,編號為0 到m-1,病毒症狀只會持續一天,每個人可能多次感染病毒。

第一天,若干個病毒攜帶者感染了病毒,病毒擴散就是由病毒攜帶者引起的,從第二天開始的每一天,編號p 的人在以下條件下就會感染病毒:(a*b)mod m=p(其中a 為前一天感染病毒的某乙個人的編號,b 是其中乙個病毒攜帶者的編號,a 和b 可能相同)

例如村莊共101 個人,病毒攜帶者編號為5 和50,第一天感染病毒的為5和50,第二天有25,48(250 mod 101)和76(2500 mod 101),第三天77 會感染病毒,因為(48*50) mod 101=77

問第k 天哪些人會感染病毒。

可以發現,f[0]=1,f[i]=f[i-1]*e(乘法為兩個陣列內的數字兩兩相乘取mod,e是初始讀入的陣列)乘法滿足結合律,快速冪就行了。。

貼**:

#include

#include

#include

#include

#define n 1501

using

namespace

std;

int m,top;

long

long k;

int b[n],c[n],a[n],bz[n];

void init()

void cheng(int*a,int*b,int*c)

void work(int*a,int*b,int*c)

sort(a+1,a+a[0]+1);

for (int i=1;i<=a[0];i++)

printf("%d ",a[i]);

}int main()

第四題 屏保

題目:

你最近安裝了乙個新的螢幕保護程式,如果你離開鍵盤5 分鐘,屏保將會顯示乙個有熱帶魚的水族館,水族館的底端是由沙石形成的供魚玩耍的地方,沙石的高度可以設定,水位也可以設定。

水族館可以看做是乙個二維平面,寬看作n-1 列,最左端的橫座標為0,最右端橫座標為n-1,每個整數橫座標都對應著乙個沙石的高度h_i(0<=i<=n-1),相鄰橫座標i 和i+1 之間的沙石可以看做是由(i,h_i)和(i+1,h_i+1)這兩個點形成的線段。

如果水位為h,水覆蓋著水族館底端到y=h 這個區域,如果有部分沙石在水面以上,這部分形成乙個島嶼。對於不同的沙石情況,你想知道被水覆蓋區域的面積,即水位以下總面積減去水中沙石的面積。

正如題目所說,我們可以用水位以下總面積減去水中沙石的面積得到答案,那麼我們只需維護水高1~h(1000)時的砂石面積即可(線段樹)。

對於砂石,我們可以維護相鄰視為一種通常情況:

設h1為較低高度,h2為較高高度,h為水高

那麼當h≤h1時,砂石面積=h

當h1<h≤h2時,我們可以拆分成乙個矩形面積(常數h1)和乙個梯形面積,

對於梯形面積,我們引入h3=h2-h1,用相似三角形可得,s=h3/2-(h2-h)^2/h3/2,展開可得到關於h的常數、一次、二次項係數,分別加入線段樹里

當h2<h時,砂石面積=(h1+h2)/2

對於以上的修改,可看做對線段樹里的常數、一次、二次項係數修改,查詢時將標記下傳到最底層後計算即可得到答案。

貼**

#include

#include

#include

#include

#define n 100001

#define h 1000

using

namespace

std;

int n,m;

int a[n];

double f[h*4+1][3];

double ans;

void init()

void down(int l,int r,int s)

}void change(int l,int r,int s,int ll,int rr,double x,double y,double z)

change(l,(l+r)/2,s+s,ll,rr,x,y,z),change((l+r)/2+1,r,s+s+1,ll,rr,x,y,z);

}void find(int l,int r,int s,int ll)

static

int ss;

if ((ss=(l+r)/2)>=ll)find(l,ss,s+s,ll);

else

find(ss+1,r,s+s+1,ll);

}void did(int x,int y,double z)

void pre()

void work()

}else

}}int main()

省選模擬86

首先考慮基礎的dp定義,那麼發現轉移需要的係數只和dp是奇數的點的個數有關,所以將這個東西記錄在dp狀態中就行了。然後推一下dp轉移,發現轉移係數和奇數的點的個數沒有關係,只與是否存在這樣的點有關,所以用01來記錄就可以了。考慮用總方案減去不合法的方案,也就是1號點能到達的點和2號點能到達的點沒有交...

省選模擬86 題解

有一點 dp 套 dp 的意思,內層的 dp 就是直接在拓撲序上進行的簡單 dp。外層記錄的是 dp 的狀態,然後 o n 3 的做法是顯然的。當轉移到第 i 個位置的時候,只要關心前面有多少個黑點 dp 值為 1 前面有多少個白點 dp 值為 1 前面的 dp 值總和的奇偶性。然後寫一下轉移係數,...

考試 省選86

t1 首先設出暴力的 dp dp i j k l 為前 i 個點中有 j 個白點結束方案為奇數,k 個黑點結束方案為偶數,當前全部的結束方案之和奇偶性為 l 的方案數。那麼可以很簡單的轉移。在考慮轉移時候的係數。其實只跟 j,k 是否為0有關係。那麼狀態大大化簡為 dp i 0 1 0 1 0 1 ...