[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=;
int n,T,dat[MAXN][MAXN];
ll d[MAXN][MAXN][];
struct node{int x,y,d,w;}; int dx[]={,,,-};
int dy[]={,-,,};
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=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&dat[i][j]); memset(d,0x3f,sizeof(d));
d[][][]=;
q.push(node{,,,});
while(!q.empty())
{
node t=q.top();q.pop();
if(d[t.x][t.y][t.d]<t.w) continue;
for(int i=;i<;i++)
{
int fx=t.x+dx[i],fy=t.y+dy[i],cur=(t.d+)%;
if(fx<||fy<||fx>n||fy>n) continue;
ll cost=t.w+T+(cur==?dat[fx][fy]:);
if(d[fx][fy][cur]>cost)
d[fx][fy][cur]=cost,q.push(node{fx,fy,cur,cost});
}
} printf("%lld",min(d[n][n][],min(d[n][n][],d[n][n][])));
return ;
}
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+;
int n,a[MAXN],b[MAXN],dp[MAXN][MAXN]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]); for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(abs(a[i]-b[j])<=)
dp[i][j]=max(dp[i][j],dp[i-][j-]+);
dp[i][j]=max(dp[i][j],max(dp[i-][j],dp[i][j-]));
}
printf("%d",dp[n][n]);
return ;
}
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+;
int n,x,bit[MAXN];
ll res=;P dat[MAXN]; void Update(int x)
{while(x<=*n) bit[x]++,x+=x&(-x);}
ll Query(int x)
{ll ret=;while(x) ret+=bit[x],x-=x&(-x);return ret;} int main()
{
scanf("%d",&n);
for(int i=;i<=*n;i++)
{
scanf("%d",&x);
if(!dat[x].X) dat[x].X=i;
else dat[x].Y=i;
}
sort(dat+,dat+n+); for(int i=;i<=n;i++)
res+=Query(dat[i].Y)-Query(dat[i].X-),Update(dat[i].Y);
printf("%lld",res);
return ;
}
Problem C
[USACO 2017 Feb Gold] Tutorial的更多相关文章
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- USACO 2017 FEB Gold visitfj 最短路
题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...
- [USACO 2017 Open Gold] Tutorial
Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...
- [USACO 2017 Jan Gold] Tutorial
Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
- [ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)
\(\\\) \(Description\) 给定长度为\(2N\)的序列,\(1\text ~N\)各出现过\(2\)次,\(i\)第一次出现位置记为\(a_i\),第二次记为\(b_i\),求满足 ...
- USACO 2017 FEB Platinum nocross DP
题目大意 上下有两个长度为n.位置对应的序列A.B,其中数的范围均为1~n.若abs(A[i]-B[j]) <= 4,则A[i]与B[j]间可以连一条边.现要求在边与边不相交的情况下的最大的连边 ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
随机推荐
- 【NOIP】提高组2012 借教室
[算法]线段树||二分+前缀和 [题解]线段树记录区间加值和区间最大值. #include<cstdio> #include<algorithm> using namespac ...
- 崩坏3mmd中的渲染技术研究
http://youxiputao.com/articles/11839 主要是参考该篇文章做一个微小的复盘. 漫反射与高光 文章中的漫反射与高光并不是类似于普通的 resultCol = Diffu ...
- [Leetcode Week13]Palindrome Partitioning
Palindrome Partitioning 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/palindrome-partitioning/desc ...
- System and method to prioritize large memory page allocation in virtualized systems
The prioritization of large memory page mapping is a function of the access bits in the L1 page tabl ...
- python基础===列表类型的所有方法
链表类型有很多方法,这里是链表类型的所有方法: append(x) 把一个元素添加到链表的结尾,相当于a[len(a):] = [x] extend(L) 通过添加指定链表的所有元素来扩充链表,相当于 ...
- STL不同容器的使用方法
以下内容摘自:http://blog.csdn.net/u014465639/article/details/70241850 1.vector(需要导入头文件#include <vector& ...
- Redis 基础使用(1)
redis 数据库的使用场景介绍 redis 是 NoSQL 数据库中的一种,特别适合解决一些使用传统关系数据库难以解决的问题,redis 作为内存数据库,如果在不合适的场合,对内存的消耗是很大的,甚 ...
- [ Python ] 基本数据类型及属性(下篇)
1. 基本数据类型 (1) list 列表 (2) tuple 元组 (3) dict 字典 (4) set 集合 2. list 列表方法 Python 内置的一种数据类型, ...
- Qt笔记——多线程
这个例子是,点击开始按钮,数字累加,点击停止按钮,数字不动. 1,新建一个类,里面是子线程的内容 #ifndef MYTHREAD_H #define MYTHREAD_H #include < ...
- QQ分享 QQ空间分享 API链接:
QZone: "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITL ...