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. Reachability from the Capital(Codeforces Round #490 (Div. 3)+tarjan有向图缩点)

    题目链接:http://codeforces.com/contest/999/problem/E 题目: 题意:给你n个城市,m条单向边,问你需要加多少条边才能使得从首都s出发能到达任意一个城市. 思 ...

  2. A题 hdu 1235 统计同成绩学生人数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1235 统计同成绩学生人数 Time Limit: 2000/1000 MS (Java/Others) ...

  3. perl HTML::LinkExtor模块(2)

    use LWP::Simple; use HTML::LinkExtor; $html_code = get("https://tieba.baidu.com/p/4929234512&qu ...

  4. MySQL:Can't create test file XXX.lowe-test

    问题说明 今天部署MySQL,在使用mysql_install_db,初始化数据库时报如下错误 180622 11:36:38 mysqld_safe Starting mysqld daemon w ...

  5. 【LOJ6201】【bzoj4939】【YNOI2016】掉进兔子洞

    一道比较简单的莫队…… 用bitset维护三个区间的交元素. #include<bits/stdc++.h> ; ; #define UI unsigned int #define rep ...

  6. VS2017MVC+EF+MySQL环境搭建

    记录一次环境搭建的过程以及出现的问题和解决方法. 编译器Visual Studio 2017Enterprise Edition 1.新建一个MVC应用程序2.在新建的MVC程序中选择Models - ...

  7. linux sftp and unix ftp

    sftp 1.功能作用 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性. 2.位置 /usr/bin/sftp 3.格式用法 sftp [-1246C ...

  8. 理解rest架构

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  9. APP运营

    产品相关术语 APP:application的简写,即应用. 开发商:也叫CP,即ContentProvider内容提供商. 发行商(运营商):代理CP开发出来的产品. 联运:CP和渠道联合运营产品. ...

  10. java中的数组与集合相互转换

    1.数组转换成集合 数组转换为集合,用Arrays.asList方法. public static void main(String[] args) { String[] arr = {"a ...