日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JZOJ 3947 . 【省常中JSOI模拟】收历史作业

發(fā)布時(shí)間:2025/3/15 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 3947 . 【省常中JSOI模拟】收历史作业 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

小W 回到了教室,可憐的他要收歷史作業(yè),但是0901 班這群不負(fù)責(zé)任的組長把作業(yè)收得亂七八糟,散得每個(gè)座位上都有作業(yè)本,小W 只好挨個(gè)去收。
0901 班的教室可以看作是一個(gè)n 行m 列的矩形,小W 在(0,0)這個(gè)格子(位于教室的左下角),教室的門在(n-1,m-1)這個(gè)格子。每次小W 可以向相鄰的格子走一步,走到某個(gè)格子時(shí),他會收完這個(gè)格子的歷史作業(yè)。小W 是個(gè)很懶的人,他想走一條最短路到教室的門口,但是作業(yè)收得太少了又會引起公憤,所以他決定走一條作業(yè)收得最多的最短路線,你能幫幫他嗎?

Input

第一行三個(gè)整數(shù)n,m,k。
接下來k 行,每行三個(gè)整數(shù)a,b,c,表示在(a,b)這個(gè)格子有c 本歷史作業(yè)。

Output

一行一個(gè)整數(shù),表示最多能收到的歷史作業(yè)的本數(shù)。

Sample Input

2 2 2
0 0 1
1 1 1

Sample Output

2

Data Constraint

30%的數(shù)據(jù),n,m<=30,k<=100。
70%的數(shù)據(jù),n,m<=10^9,k<=10000。
100%的數(shù)據(jù),1<=n,m<=10^9,1<=k<=100000,0<=c<=300,保證每對(a,b)至多出現(xiàn)一次。

Solution

  • 我們考慮DP,設(shè) g[i] 表示走到第 i 個(gè)點(diǎn)能取到的最大值

  • 那么顯然有:g[i]=Max{g[j]}+a[i] ,其中點(diǎn) j 在點(diǎn) i 的左上方(能轉(zhuǎn)移)。

  • 但是這樣做是 O(N2) 的,考慮優(yōu)化。

  • 先將每一個(gè)點(diǎn)離散化,按 y 坐標(biāo)為第一關(guān)鍵字、x 坐標(biāo)為第二關(guān)鍵字從小到大排序。

  • 為了方便處理,我們可以加入一個(gè) (n,m) 節(jié)點(diǎn),最后答案即為此點(diǎn)的 g 值。

  • 那么在求 g[i] 的時(shí)候(設(shè)點(diǎn) i 的橫坐標(biāo)為 x),只需找出 1xg 值最大即可。

  • 因?yàn)辄c(diǎn)是排過序的,可以用一個(gè)樹狀數(shù)組來維護(hù)。

  • 在算出當(dāng)前的 g[i] 后,就將樹狀數(shù)組中的 i 號位用 g[i] 更新。

  • 時(shí)間復(fù)雜度 O(N?log?N)

Code

#include<cstdio> #include<algorithm> #include<cctype> using namespace std; const int N=1e5+5; struct data {int x,y,z; }a[N],b[N]; int tot,num; int f[N],g[N]; bool pd; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline bool cmpx(data x,data y) {return x.x<y.x; } inline bool cmpy(data x,data y) {return x.y<y.y; } inline bool cmp(data x,data y) {return x.y<y.y || x.y==y.y && x.x<y.x; } inline int max(int x,int y) {return x>y?x:y; } inline void change(int x,int val) {while(x<=num) f[x]=max(f[x],val),x+=x&-x; } inline int get(int x) {int mx=0;while(x) mx=max(mx,f[x]),x-=x&-x;return mx; } int main() {int n=read(),m=read(),k=read();for(int i=1;i<=k;i++){a[i].x=read()+1,a[i].y=read()+1,a[i].z=i;if(a[i].x==n && a[i].y==m) pd=true;b[i].z=read();}if(!pd) k++,a[k]=(data){n,m,k};sort(a+1,a+1+k,cmpx);for(int i=1;i<=k;i++){if(a[i].x>a[i-1].x) tot++;b[a[i].z].x=tot;}sort(a+1,a+1+k,cmpy);num=tot,tot=0;for(int i=1;i<=k;i++){if(a[i].y>a[i-1].y) tot++;b[a[i].z].y=tot;}sort(b+1,b+1+k,cmp);for(int i=1;i<=k;i++){g[i]=b[i].z+get(b[i].x);change(b[i].x,g[i]);}printf("%d",g[k]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的JZOJ 3947 . 【省常中JSOI模拟】收历史作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。