[USACO 2018 Feb Gold] Tutorial
Link:
A:
$dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解
状态数$O(n^3)$
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=,INF=<<;
int n,dat[MAXN],dp[MAXN][MAXN][MAXN]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&dat[i]);
for(int i=;i<MAXN;i++)
for(int j=;j<MAXN;j++)
for(int k=;k<MAXN;k++)
dp[i][j][k]=INF; if(dat[]!=) dp[][][]=;
else dp[][][]=;
for(int i=;i<n;i++)
for(int j=;j<=i;j++)
for(int k=;k<=i-j;k++)
if(dp[i][j][k]!=INF)
{
dp[i+][j][k+]=min(dp[i+][j][k+],dp[i][j][k]+(dat[i+]!=k+));
dp[i+][j+][]=min(dp[i+][j+][],dp[i][j][k]+(dat[i+]!=));
}
for(int i=;i<=n;i++)
{
int res=INF;
for(int j=;j<=n;j++)
res=min(res,dp[n][i][j]);
printf("%d\n",res);
}
return ;
}
Problem A
B:
对于每一个节点分别计算其上方和下方的答案,其中下方答案明显可以一遍$dfs$
上方答案我一开始是$O(树高)$求的,明显会被卡……
其实可以再做一遍$dfs$,用父节点除去该棵子树的贡献再加上走到父节点的贡献即可
注意特殊处理叶子结点
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
char s[MAXN][];
struct edge{int nxt,to;}e[MAXN<<];
int n,x,head[MAXN],len[MAXN],f[MAXN],num[MAXN],tot;
ll sum[MAXN],cnt[MAXN],tmp,res[MAXN],mn=1ll<<,lf; void add_edge(int x,int y)
{
e[++tot]={head[x],y};head[x]=tot;
e[++tot]={head[y],x};head[y]=tot;
} void dfs1(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
f[e[i].to]=x;dfs1(e[i].to,x);
cnt[x]+=cnt[e[i].to];
sum[x]+=sum[e[i].to]+cnt[e[i].to]*(len[e[i].to]+);
}
} void dfs2(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc||!num[e[i].to]) continue;
res[e[i].to]=sum[e[i].to];
res[e[i].to]+=(res[x]-sum[e[i].to]-cnt[e[i].to]*(len[e[i].to]+));
res[e[i].to]+=*(lf-cnt[e[i].to]);mn=min(mn,res[e[i].to]);
dfs2(e[i].to,x);
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s%d",s[i]+,&num[i]);
len[i]=strlen(s[i]+);
for(int j=;j<=num[i];j++)
scanf("%d",&x),add_edge(x,i);
if(!num[i]) cnt[i]=,len[i]--,lf++;
}
dfs1(,);
res[]=mn=sum[];
dfs2(,); printf("%lld",mn);
return ;
}
Problem B
C:
好像和前面一题差不多?
可以离线从小到大加点用$set$和$multiset$维护当前点集和答案
不过官网上的标程常数更小:反向从大到小加点,用链表维护当前最大空隙
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
multiset<int,greater<int> > mx;
set<int> s;set<int>::iterator it;
int n,m,res[MAXN];P sw[MAXN];
struct Query{int s,d,id;}bt[MAXN];
bool cmp(Query a,Query b){return a.s<b.s;} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&sw[i].X),sw[i].Y=i;
for(int i=;i<=m;i++)
scanf("%d%d",&bt[i].s,&bt[i].d),bt[i].id=i;
sort(sw+,sw+n+);sort(bt+,bt+m+,cmp); int lst=,pre,nxt;
s.insert();s.insert(n);mx.insert(n-);
for(int i=;i<=n;i++)
{
while(sw[lst].X<=bt[i].s&&lst<=n)
{
if(sw[lst].Y!=&&sw[lst].Y!=n)
{
it=s.lower_bound(sw[lst].Y);
nxt=*it;pre=*(--it);
mx.erase(mx.find(nxt-pre));
mx.insert(nxt-sw[lst].Y);mx.insert(sw[lst].Y-pre);
}
s.insert(sw[lst].Y);lst++;
}
res[bt[i].id]=(*mx.begin()<=bt[i].d);
}
for(int i=;i<=m;i++)
printf("%d\n",res[i]);
return ;
}
Problem C
如果将问题转化为在原序列中大量删除的,手写链表即可
[USACO 2018 Feb Gold] Tutorial的更多相关文章
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...
- [USACO 2018 Open Gold] Tutorial
Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution
权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...
- BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution
标题效果:一个N积分m无向图边.它可以是路径k右边缘值变0,确定此时1-n最短路径长度. Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层.代表在这个时候已经过去"自由边缘&q ...
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...
- BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap
题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...
随机推荐
- 用vue快速开发app的脚手架工具
前言 多页面应用于结构较于简单的页面,因为简答的页面使用router又过于麻烦.本脚手架出于这样的场景被开发出来. 使用脚手架搭配Hbuilder也同样可以快速使用vue开发安卓和IOS APP. 本 ...
- CART算法(转)
来源:http://www.cnblogs.com/pinard/p/6053344.html 作者:刘建平Pinard 对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了 ...
- 【Windows使用笔记】使Onedrive同步任意文件夹
因为度盘实在是有点垃圾,经常看的剧之类的或者其他软件资源啥的动不动就被封. 所以跑去某宝买了一个5T的企业子账号,安全性不清楚,重要的隐私数据反正都用移动硬盘备份了.主要就是存一些资源性的文件吧.而且 ...
- GNU Readline 库及编程简介【转】
转自:https://www.cnblogs.com/hazir/p/instruction_to_readline.html 用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以 ...
- Linux内核通知链机制的原理及实现【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/11/11/2396781.html 一.概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其 ...
- 【SCOI2010】维护序列
NOI2017的简化版…… 就是维护的时候要想清楚怎么讨论. #include<bits/stdc++.h> #define lson (o<<1) #define rson ...
- Jquery和JS实现浏览器全屏
var fullscreen=function(){ elem=document.body; if(elem.webkitRequestFullScreen){ elem.webkitRequestF ...
- javascript方法--call()
关于call方法,以前经常看到这个方法,但是也没怎么用心去学习,后来觉得不行,所以知识在一点一点补~ 今天对自己学习call方法做一下总结 其实,学了call方法,会发现call跟apply其实是很像 ...
- 设置Eclipse/MyEclipse中编辑界面点击任何文件后Package Explorer导航自动定位该文件
原文:http://www.myexception.cn/eclipse/425836.html 设置步骤: 导航Package Explorer的右上角有一个黄色双向箭头图标,鼠标移动到上面提示“L ...
- django 上传图片、使用PIL制作缩略图并保存到sea的storage
上传图片解析: SAE的设置指引如下: 处理用户上传文件 在setttings.py中添加以下配置. # 修改上传时文件在内存中可以存放的最大size为10m FILE_UPLOAD_MAX_MEMO ...