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. python学习笔记(四)之分支和循环

    python中比较操作符有: > >= < <= == != 这些操作符返回True或False 1 >>> 1 < 3 2 True 3 >&g ...

  2. Drainage Ditches(POJ1273+网络流+Dinic+EK)

    题目链接:poj.org/problem?id=1273 题目: 题意:求最大流. 思路:测板子题,分别用Dinic和EK实现(我的板子跑得时间均为0ms). Dinic代码实现如下: #includ ...

  3. 檢查 cpu 的全部 gpio 狀態及設定

    $ adb root # cat /sys/kernel/debug/gpio

  4. Windows 10又现新Bug,24核心竟卡成蜗牛

    Windows 10又现新Bug,24核心竟卡成蜗牛 https://news.cnblogs.com/n/573996/

  5. c#中char、string转换为十六进制byte的浅析

    问题引出: string转换为byte(十六进制) static void Main(string[] args) { "; byte[] b = Encoding.Default.GetB ...

  6. SEO优化:WordPress站点地图(html和xml)插件Baidu Sitemap Generator

    前阵子分享了<如何实现纯代码制作网站地图的html和xml版本>,不过不是每个人都喜欢用纯代码来折腾博客的.今天,boke112就给大家分享一款国人柳城制作的包含html和xml两个版本的 ...

  7. Delphi使程序的窗口出现在最前面并激活

    procedure setAppFront(); //使程序的窗口出现在最前面并激活 var pt, OldPt, NewPt: TPoint; begin //判断Application是否最小化, ...

  8. 邂逅Sass和Compass之Sass篇

    对于一个从后台转到前端的web开发者来说,最大的麻烦就是写CSS,了解CSS的人都知道,它可以开发网页样式,但是没法用它编程,感觉耦合性相当的高,如果想要方便以后维护,只能逐句修改甚至重写相当一部分的 ...

  9. AC日记——小B的询问 洛谷 P2709

    小B的询问 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 50005 #define ll ...

  10. Java 类、属性、方法修饰符 public、private、protected、default

    Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...