8 5省選模擬總結

2021-07-04 08:55:44 字數 3855 閱讀 9247

這次考掛了。。。

其實遇到了舊題,但由於種種原因坑在上面了,於是爆零了…

總結一句就是心態問題,早餐很重要~~~~

第一題 跳格仔

題目大意

給定n+1個相鄰的格仔,標號為0~n,1~n的格仔都有乙個權值a[i](整數,可能為負),給定乙個v,表示一次最多跳到往後第v個格仔裡,求乙個方案,滿足從0到x再回到0,所站過格仔權值和最大,且不能走重複點(除0點),往回走時站的格仔必須是在已到過的格仔前(即:當前站的為x,那麼x+1必須已經走過,除0點)

貼**

#include

#include

#include

#include

#define n 300001

#define minx -5000000000000000

using

namespace

std;

int n,v;

int a[n];

long

long ans1;

long

long b[n],f[n*4][2],ans[n],c[n];

void init()

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

}void up(int l,int r,int s,int ll,int rr,int v)

up(l,(l+r)/2,s+s,ll,rr,v),up((l+r)/2+1,r,s+s+1,ll,rr,v);

f[s][0]=max(f[s+s][0],f[s+s+1][0]);

}long

long get(int l,int r,int s,int ll,int rr)

void ins(int l,int r,int s,int ll)

static

int ss;

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

else

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

f[s][0]=max(f[s+s][0],f[s+s+1][0]);

}void work()

}void write()

int main()

時間複雜度 nlogn

第二題 數三角形

題目大意

給定n個點,求有多少個三角形(這n個點組成)包含原點。

cf有類似的原題

方法一:(我以前的方法,正著做)

我們可以發現,對於已知兩個點,要想再有乙個點使得所構成的三角形合法,則有第三個點必定在該兩個點與原點連線的反向延長線內(如陰影部分)

那麼我們可以通過預處理,所有點對原點反向延長線的順時針方向點數,用r-l來得到

然而要列舉兩個點會超時,我們發現,對於這樣的點對,若已知乙個點,那麼另乙個點必定在其順時針(這裡我們同一乙個方向才可以避免重複計算)180°的範圍內,這樣我們可以對之前的預處理進行字首和和字尾和,同樣用r-l解決,當然還會有多出來的部分要減去,細節要處理好。

時間複雜度nlogn

貼**

#include

#include

#include

#include

using

namespace

std;

#define n 100001

#define pi 3.1415926535898

int n,m;

long

long ans;

long

long f[n],up[n],down[n];

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

double c[n];

void init()

bool cmp(int x,int y)

double did(double x)

int calc(double x1,double y1)

return s;

}void add(int x)

void work()

sort(b+1,b+n+1,cmp);

ans=0;

for (int i=1;i1]+calc(did(c[b[i]]+pi),did(c[b[i+1]]+pi));

f[n]=f[n-1]+calc(did(c[b[n]]+pi),did(c[b[1]]+pi));

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

up[i]=up[i-1]+(f[i]-f[i-1])*i,down[i]=down[i-1]+(f[i]-f[i-1])*(n-i+1);

for (int i=1;ifor (int i=1;i<=n;i++)a[i][1]+=y,a[i][0]+=x;

printf("%lld\n",ans/3);

}int main()

方法二(正難則反)

我們可以用n*(n-1)*(n-2)/6的總方案減去不合法的方案

我們對於已知的乙個點c,不合法方案一定形如:

(我們假定都落在在點c與原點連線的同一側,避免重複計算)

這樣,通過列舉點c,求出點c與原點連線同側的點數sum,用ans減去sum*(sum-1)/2

時間複雜度 nlogn

貼**

#include

#include

#include

#include

using

namespace

std;

#define n 100002

#define pi m_pi

int n,mid;

long

long ans;

long

double c[n+n];

long

double did(long

double x)

void init()

void pre()

int did1(int x)

void work()

}void write()

int main()

我們可以仔細分析得出最後的答案形如:

可以發現最終我們只要解決這幾種:

第乙個可以通過排序,二分查詢或掃瞄得到

第二種可以將詢問離線,沿y軸或x軸掃瞄線得到,也可以用主席樹(空間64m還是可以接受的)

第三種就比較「無恥」的麻煩了,也是詢問離線,我們可以用x+y(可以發現一定是135°)(另一種斜率自己yy吧..)表示乙個點被哪條135°的斜線經過(可以看做斜線與y軸交點),排序x+y後插入時按x插入(即沿45°方向掃瞄)

據觀察,第三種要做8次掃瞄線..由於程式設計較複雜,**量較大,還沒打出來,故不貼**。。

8 6省選模擬總結

今天被低2屆的虐暴了 感覺最近狀態有點低迷,做題速度低下.要多到網上刷題才行!第一題 刪數字 題目大意 給你乙個n 個數組成的序列v,要你刪除其中k 個數,m 表示剩下的數字中任意兩個數的差值的最大值,m 表示最小差值,要你計算刪除k 個數後,m m 的最小值。這題我一下在腦抽了.排序後可以發現若維...

省選模擬5 總結

改題 t3 真的改到自閉。第一眼錯覺是網路流,但是在每個石頭,站不同青蛙時跳躍的代價不同,就不太能了。這題其實和之前noip模擬16的那個青蛙題有點像,只不過這題加了代價。首先乙個性質是 對於乙個青蛙,如果他一心想跳到對面 即不考慮踩光石頭 最優是不花費,要不然只花一次就過去。那麼我們可以看看所有石...

2020 09 26 省選組 模擬 總結

估分 60 80 0 140 考場 10 70 0 80 簡單三角形原來可以是凹多邊形。簡單三角形原來可以是凹多邊形。我的方法只能處理凸多邊形的問題,時間複雜度 o n 2 m s q 其實就是將多邊形分成多個三角形,而對於每個三角形,我們可以拆成三個其中乙個節點為原點的三角形。於是我們可以 o n...