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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[USACO 2017 Feb Gold] Tutorial

發布時間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [USACO 2017 Feb Gold] Tutorial 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Link:

傳送門

A:

分層圖最短路(其實就是最短路轉移時多記錄一維的數據

#include <bits/stdc++.h>using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN=105; int n,T,dat[MAXN][MAXN]; ll d[MAXN][MAXN][3]; struct node{int x,y,d,w;};int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; priority_queue<node> q; bool operator < (node a,node b){return a.w>b.w;}int main() {scanf("%d%d",&n,&T);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&dat[i][j]);memset(d,0x3f,sizeof(d));d[1][1][0]=0;q.push(node{1,1,0,0});while(!q.empty()){node t=q.top();q.pop();if(d[t.x][t.y][t.d]<t.w) continue;for(int i=0;i<4;i++){int fx=t.x+dx[i],fy=t.y+dy[i],cur=(t.d+1)%3;if(fx<1||fy<1||fx>n||fy>n) continue;ll cost=t.w+T+(cur==0?dat[fx][fy]:0);if(d[fx][fy][cur]>cost)d[fx][fy][cur]=cost,q.push(node{fx,fy,cur,cost});}}printf("%lld",min(d[n][n][0],min(d[n][n][1],d[n][n][2])));return 0; } Problem A

?

B:

本來很基礎的$dp$還糾結了一會狀態的選擇……

其實就是最長公共子序列:$dp[i][j]=dp[i-1][j-1]+1/max(dp[i-1][j],dp[i][j-1])$

#include <bits/stdc++.h>using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN=1e3+10; int n,a[MAXN],b[MAXN],dp[MAXN][MAXN];int main() {scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(abs(a[i]-b[j])<=4)dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);dp[i][j]=max(dp[i][j],max(dp[i-1][j],dp[i][j-1]));}printf("%d",dp[n][n]);return 0; } Problem B

如果從$dp[i][j]$向后轉移答案依然是對的,但可能理解起來有些奇怪……

雖然$dp[i][j]$直接向$dp[i+1][j]/dp[i][j+1]$轉移可能不是最優解,但一定能保證最優解存在

其實就是將上述直接取$max$的過程拆成兩次更新

?

C:

此類偏序問題基本上都涉及到排序

可以發現將$l_i$排序后對于第$i$區間產生的關系數就是在該區間內$r_j$

#include <bits/stdc++.h>using namespace std; #define X first #define Y second #define pb push_back typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN=2e5+10; int n,x,bit[MAXN]; ll res=0;P dat[MAXN];void Update(int x) {while(x<=2*n) bit[x]++,x+=x&(-x);} ll Query(int x) {ll ret=0;while(x) ret+=bit[x],x-=x&(-x);return ret;}int main() {scanf("%d",&n);for(int i=1;i<=2*n;i++){scanf("%d",&x);if(!dat[x].X) dat[x].X=i;else dat[x].Y=i;}sort(dat+1,dat+n+1);for(int i=1;i<=n;i++)res+=Query(dat[i].Y)-Query(dat[i].X-1),Update(dat[i].Y);printf("%lld",res);return 0; } Problem C

?

轉載于:https://www.cnblogs.com/newera/p/9637747.html

總結

以上是生活随笔為你收集整理的[USACO 2017 Feb Gold] Tutorial的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。