Link:

USACO 2017 Dec Gold 传送门

A:

为了保证复杂度明显是从终结点往回退

结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$就行了

由于保证每个点只进队列一次、被搜索到一次,因此复杂度为$O(n*log(n))$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=2e5+;
queue<int> q;
multiset<P>::iterator it;
multiset<P> sa,sb;
int n,d,dist[MAXN],a[MAXN],b[MAXN]; int main()
{
scanf("%d%d",&n,&d);
for(int i=;i<=*n;i++)
scanf("%d%d",&a[i],&b[i]),a[i]=-a[i],b[i]=-b[i],dist[i]=-;
for(int i=;i<=n;i++)
{
if(b[i]==) q.push(i),dist[i]=;
else sa.insert(P(b[i],i));
if(a[n+i]==) q.push(n+i),dist[n+i]=;
else sb.insert(P(a[n+i],n+i));
} while(!q.empty())
{
int t=q.front();q.pop();
if(t<=n)
{
while(true)
{
it=sb.lower_bound(P(a[t],));
if(it==sb.end()||(*it).X-a[t]>d) break;
dist[(*it).Y]=dist[t]+;
q.push((*it).Y);sb.erase(it);
}
}
else
{
while(true)
{
it=sa.lower_bound(P(b[t],));
if(it==sa.end()||(*it).X-b[t]>d) break;
dist[(*it).Y]=dist[t]+;
q.push((*it).Y);sa.erase(it);
}
}
}
for(int i=;i<=n;i++)
printf("%d\n",dist[i]);
return ;
}

Problem A

B:

将无根树转化为有根树方便计数

明显树形$dp$,转移$dp[i][j]=\prod_{k\in son} dp[k][(j+1)mod3]+dp[k][(j+2)mod3]$

#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+,MOD=1e9+;
struct edge{int nxt,to;}e[MAXN<<];
int n,k,x,y,head[MAXN],tot;ll dp[MAXN][]; void add_edge(int x,int y)
{e[++tot].nxt=head[x];e[tot].to=y;head[x]=tot;}
void dfs(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dfs(e[i].to,x);
for(int j=;j<;j++)
(dp[x][j]*=dp[e[i].to][(j+)%]+dp[e[i].to][(j+)%])%=MOD;
}
} int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add_edge(x,y),add_edge(y,x);
for(int i=;i<=n;i++)
dp[i][]=dp[i][]=dp[i][]=;
for(int i=;i<=k;i++)
scanf("%d%d",&x,&y),y--,dp[x][(y+)%]=dp[x][(y+)%]=; dfs(,);
printf("%lld",(dp[][]+dp[][]+dp[][])%MOD);
return ;
}

Problem B

C:

明显一个序列的和到达$m$后再进行扩展不会使答案更优

于是想到用$two$ $pointers$找到所有刚刚达到$m$的区间,并用$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;ll sum,m;
int n,f[MAXN],s[MAXN],res=<<; int main()
{
scanf("%d%lld",&n,&m);
for(int i=;i<=n;i++)
scanf("%d%d",&f[i],&s[i]); int lst=;
for(int i=;i<=n;i++)
{
while(sum<m&&lst<=n)
sum+=f[++lst],mx.insert(s[lst]);
if(lst>n) break;
res=min(res,*mx.begin());
//multiset.erase(val)会删掉所有相同元素!
//因此要用multiset.erase(it)来删除
sum-=f[i];mx.erase(mx.find(s[i]));
}
printf("%d",res);
return ;
}

Problem C

注意:

1、可能有重复值因此要用$multiset$而非$set$

2、$multiset.erase(val)$会删掉所有相同元素,因此要用$multiset.erase(it)$来删除

3、使用$two$ $pointers$时注意末尾只删除不增加的情况

[USACO 2017 Dec Gold] Tutorial的更多相关文章

  1. [USACO 2017 Open Gold] Tutorial

    Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...

  2. [USACO 2017 Feb Gold] Tutorial

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

  3. [USACO 2017 Jan Gold] Tutorial

    Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...

  4. [USACO 2016 Dec Gold] Tutorial

    Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...

  5. NC24083 [USACO 2017 Dec P]Greedy Gift Takers

    NC24083 [USACO 2017 Dec P]Greedy Gift Takers 题目 题目描述 Farmer John's nemesis, Farmer Nhoj, has N cows ...

  6. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  7. [USACO 2018 Jan Gold] Tutorial

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

  8. [USACO] 2017 DEC Bronze&Silver

    link:http://www.usaco.org/index.php?page=dec17results Problem A(Bronze) 这是一道非常简单的判断重叠面积的题目,但第一次提交仍会出 ...

  9. Usaco 2010 Dec Gold Exercise(奶牛健美操)

    /*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/ #include<cstdio> #include<queue> #include<cst ...

随机推荐

  1. 【LA】5135 Mining Your Own Business

    [算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...

  2. Linux 中使用 dd 测试磁盘性能

    翻译自 : Linux I/O Performance Tests using dd 基本说明 dd 可以用来做简单的低级别复制文件. 这样做, 一般都是可一直直接访问设备文件. 需要说明的是, 错误 ...

  3. 所有和Java中代理有关的知识点都在这了。

    对于每一个Java开发来说,代理这个词或多或少都会听说过.你可能听到过的有代理模式.动态代理.反向代理等.那么,到底什么是代理,这么多代理又有什么区别呢.本文就来简要分析一下. 代理技术,其实不只是J ...

  4. hdu 1253 胜利大逃亡(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡. #include <iostream> #i ...

  5. linux加载指定目录的so文件

    linux加载指定目录的so文件 http://blog.csdn.net/win_lin/article/details/8286125 download urlhttp://download.ch ...

  6. 【ZJOI2016】大森林

    这题理论上可以用ETT,但是用LCT建虚点可以解决这个问题. 对于最晚的操作1建立一个虚点,然后把操作0挂上去. #include<bits/stdc++.h> ; using names ...

  7. HDU 5136 Yue Fei's Battle

    题目链接:HDU-5136 网上的一篇题解非常好,所以就直接转载了.转自oilover的博客 代码: #include<cstring> #include<cstdio> #i ...

  8. bzoj 1191 超级英雄Hero

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题解: 裸匈牙利,注意如果出现找不到增广路的情况就直接break #include& ...

  9. [hadoop][会装]hadoop ha模式安装

    1.简介 2.X版本后namenode支持了HA特性,使得整个文件系统的可用性更加增强. 2.安装前提 zookeeper集群,zookeeper的安装参考[hadoop][会装]zookeeper安 ...

  10. python manage.py 命令

    在用命令django‐admin.py startproject <工程目录>建立一个django工程文件时,会生成一个manage.py文件,那么这个manage.py到底可以干嘛呢? ...