今天被低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 ...