t1:有n個不相交矩形障礙,求從原點走到某個目標點的最短路,目標點在x軸上
顯然矩形的右端點是沒用的,我們保留左邊即可
顯然不會往左走,dp一下是n
2n^2
n2的,用掃瞄線優化一下即可
#include
#define pb push_back
#define ll long long
using
namespace std;
inline
intread()
while
(isdigit
(ch)
)return res*f;
}const
int n=
5e5+
5,inf=
1e9;
inline
intd
(int x1,
int y1,
int x2,
int y2)
int n,aim;
struct sqr
}p[n]
;struct info
info
(int _x,
int _y,
int _dis):x
(_x),y
(_y)
,dis
(_dis)
inline
bool
operator
<
(const info &rhs)
const};
sets;
intmain()
s.insert
(info(0
,0,0
));sort
(p+1
,p+n+1)
;for
(int i=
1;i<=n;i++
) s.
insert
(info
(p[i]
.lx,p[i]
.ry,l));
s.insert
(info
(p[i]
.lx,p[i]
.ly,r));
}int ans=inf;
for(set
::iterator it=s.
begin()
;it!=s.
end(
);it++
) ans=
min(ans,it-
>dis+
d(aim,
0,it-
>x,it-
>y));
cout
}
t2:loj火鍋盛宴
乙個優先佇列維護沒熟的,乙個線段樹維護熟的,然後模擬就完了
#include
#define pii pair
#define pb push_back
#define mp make_pair
#define ll long long
#define fi first
#define se second
#define db double
using
namespace std;
inline
charnc(
)inline
intread()
struct info
info
(int _x,
int _id):x
(_x),id
(_id)
inline
bool
operator
>
(const info &rhs)
const};
int n;
const
int n=
1e5+5;
namespace segtreetr[n<<2]
;#define ls tr[k].l
#define rs tr[k].r
#define mid (ls+rs>>1)
inline
void
build
(int k,
int l,
int r)
inline
void
modify
(int k,
int pos)
inline
intquery_min
(int k)
inline
intquery_pos
(int k,
int pos)
int res=0;
if(pos<=mid) res=
query_pos
(k<<
1,pos)
;else res=
query_pos
(k<<1|
1,pos)
; tr[k]
.sum-
=res;
return res;
}inline
intquery_seq
(int k,
int ql,
int qr)
}using
namespace segtree;
int w[n]
;priority_queue
,greater
>q;
deque<
int>son[n]
;inline
void
file()
intmain()
if(op==0)
else
if(op==1)
else
if(op==2)
else}}
return0;
}
t3:給出乙個多邊形的三角剖分,求乙個由多邊形頂點構成的三角形使得它與盡量多的三角形有交,求最大交數
構造乙個對偶圖(不包含最外面那個平面),一定是一棵樹,然後樹上一條連線兩個葉子的路徑對應一種連兩個頂點交三角形的方案,且數量就是路徑長度
則我們要找乙個三角形就是三條路徑,樹形dp即可
code:
#include
#define pii pair
#define mp make_pair
#define pb push_back
#define ll long long
using
namespace std;
inline
intread()
while
(isdigit
(ch)
)return res*f;
}const
int n=
1e5+5;
int vis[n<<1]
,head[n<<1]
,nxt[n<<1]
,tot=0;
inline
void
add(
int x,
int y)
mapint>m;
int n,cnt=
0,ans=0;
int h[n]
;void
dfs1
(int v,
int fa)
++h[v];}
void
dfs2
(int v,
int fa,
int val)
ans=
max(ans,val+1)
; ans=
max(ans,dp[0]
+val+1)
; ans=
max(ans,dp[0]
+dp[1]
+val+1)
;for
(int i=head[v]
;i;i=nxt[i])}
intmain()
for(
int j=
0;j<
2;j++
)for
(int k=j+
1;k<
3;k++
) m[
mp(seq[j]
,seq[k])]
=cnt;
++cnt;
}dfs1(0
,-1)
;dfs2(0
,-1,
0); cout
}
19 2 18 測試題解
題太水了懶得乙個乙個發 t1 題意就是5000000個點,10000000條邊,邊權只有1或2,求最短路 我的做法 先bb一句,要開始考試的時候l讓我和gigo,gsy去樓下考,我說看一下題再決定,然後他說 你看,第一題是裸的最短路。又因為我懶得搬東西去樓下並且不想承受爆零 墊底的壓力,於是就留在樓...
7 21模擬測試題解
用nlogn求出最長不下降子串行長度然後判長度是否有n 1就行了 因為每個數只能用一次,所以前i個數所能組成的最大和為a 1 a 2 a i 若a i 1 a 1 a 2 a i 1 則因為比a 1 a 2 a i 大的下乙個數必 a i 1 所以a 1 a 2 a i 1為答案。include i...
2018 10 25 模擬測試題解
目錄問題 b 蜀傳之單刀赴會 問題 c 吳傳之火燒連營 本篇題解也發表於zwcblog作者是同乙個人 眾所周知,劉備在長阪坡上與他的一眾將領各種開掛,硬生生從曹操手中逃了出去,隨後與孫權一 燒赤壁 占有荊益 成就霸業。而曹操則在赤壁一敗後再起不能,終生無力南下。建安二十五年 220年 曹操已到風燭殘...