Link:

USACO 2018 Feb Gold 传送门

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的更多相关文章

  1. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...

  2. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...

  3. [USACO 2018 Open Gold] Tutorial

    Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...

  4. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  5. [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...

  6. BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution

    权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...

  7. BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution

    标题效果:一个N积分m无向图边.它可以是路径k右边缘值变0,确定此时1-n最短路径长度. Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层.代表在这个时候已经过去"自由边缘&q ...

  8. bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch

    Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...

  9. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

随机推荐

  1. NGINX: 反向代理 Nexus

    Nginx 反向代理 nexus 的服务, 一直卡在 Initialize... 解决方式是添加一个 header X-Forwarded-Proto: proxy_set_header X-Forw ...

  2. 01背包入门 dp

    题目引入: 有n个重量和价值分别为Wi,Vi的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中的价值总和的最大值. 分析: 首先,我们用最普通的方法,针对每个物品是否放入背包进行搜索. ...

  3. ASP.NET AjaxControlToolkit-Framework4.0 配置实用(简单介绍CalendarExtender日期控件)

    1:下载:AjaxControlToolkit Ajax Control Toolkit .NET 4 Ajax Control Toolkit .NET 4.5 Ajax Control Toolk ...

  4. 双关键字LIS

    首先对于双关键字的LIS有一个比较暴力的方法,就是线段树套平衡树,我们把双关键字的LIS抽象成二维坐标系中的点,这样我们对于当前转移的点i(x,y),需要找的就是在(xx,yy)xx<x,yy& ...

  5. python 正则表达式口诀

    正则其实也势利,削尖头来把钱揣: (指开始符号^和结尾符号$)   特殊符号认不了,弄个倒杠来引路: (指\. \*等特殊符号)   倒杠后面跟小w, 数字字母来表示: (\w跟数字字母;\d跟数字) ...

  6. ms17010利用失败解决一则

    没有反弹得到session并且提示如下: [-] 10.0.131.2:445 - Service failed to start, ERROR_CODE: 216 换了一个payload set p ...

  7. centos_7.1.1503_src_2

    farstream02-0.2.3-3.el7.src.rpm 05-Jul-2014 12:59 1.2M   fcoe-utils-1.0.29-9.el7.src.rpm 31-Mar-2015 ...

  8. 【bzoj4552】排序

    二分一个值,然后线段树上模拟. #include<bits/stdc++.h> #define lson (o<<1) #define rson (o<<1|1) ...

  9. hit-testing机制介绍

    1.简介 寻找处理触摸事件的view的过程为hit-testing,找到的能够处理触摸事件的view叫做hit-test view. 2.机制介绍 假设下图为我们的手机屏幕,当我们假设点击了view ...

  10. 去掉a标签的虚线框,避免出现奇怪的选中区域

    a{blr:expression(this.onFocus=this.blur())}/*去掉a标签的虚线框,避免出现奇怪的选中区域*/