這次考掛了。。。
其實遇到了舊題,但由於種種原因坑在上面了,於是爆零了…
總結一句就是心態問題,早餐很重要~~~~
第一題 跳格仔
題目大意
給定n+1個相鄰的格仔,標號為0~n,1~n的格仔都有乙個權值a[i](整數,可能為負),給定乙個v,表示一次最多跳到往後第v個格仔裡,求乙個方案,滿足從0到x再回到0,所站過格仔權值和最大,且不能走重複點(除0點),往回走時站的格仔必須是在已到過的格仔前(即:當前站的為x,那麼x+1必須已經走過,除0點)
貼**
時間複雜度 nlogn#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()
第二題 數三角形
題目大意
給定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...