[USACO 2017 Dec Gold] Tutorial
Link:
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的更多相关文章
- [USACO 2017 Open Gold] Tutorial
Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...
- [USACO 2017 Jan Gold] Tutorial
Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...
- [USACO 2016 Dec Gold] Tutorial
Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...
- 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 ...
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
- [USACO] 2017 DEC Bronze&Silver
link:http://www.usaco.org/index.php?page=dec17results Problem A(Bronze) 这是一道非常简单的判断重叠面积的题目,但第一次提交仍会出 ...
- Usaco 2010 Dec Gold Exercise(奶牛健美操)
/*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/ #include<cstdio> #include<queue> #include<cst ...
随机推荐
- node.js 开发命令行工具 发布npm包
新建一个文件夹“nodecmd”: 在nodecmd下新建文件夹bin: 在bin文件夹下新建JavaScript文件hello.js #!/usr/bin/env node console.log( ...
- SVG(可缩放矢量图形)
SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式.SVG是W3C("World Wide W ...
- windows7_常用操作终端操作
查看环境变量:set 添加环境变量:set aa = 88 删除环境变量:set aa = 查看ip配置:ipconfig 查看全局环境变量配置:path 查看当前目录文件:dir 进入E盘:E: 进 ...
- Java面向对象的三个特征与含义
封装 1.英文为 encapsulation,实现信息隐藏: 2.把同一类事物的特性归纳到一个类中(属性和行为),隐藏对象的内部实现: 继承 1.英文为 inheritance: 2.继承的过程,是从 ...
- 自动化测试===Httprunner测试框架介绍
项目地址: https://github.com/HttpRunner/HttpRunner 中文手册: http://cn.httprunner.org/ 首先是环境搭建: pip install ...
- Ubuntu终端里面显示路径名称太长,怎么设置变短【转】
转自:http://blog.csdn.net/id19870510/article/details/8276914 $: sudo vi ~/.bashrc 这个文件记录了用户终端配置 找到 if ...
- Python数据处理实战
一.运行环境 1.python版本 2.7.13 博客代码均是这个版本2.系统环境:win7 64位系统 二.需求 对杂乱文本数据进行处理 部分数据截图如下,第一个字段是原字段,后面3个是清洗出的字段 ...
- react项目中遇到的一些问题
推荐使用facebook官方构建工具create-react-app来创建React基础工程.(然而我还是手动构建) (路由)官方旧版本和V4的比较.https://github.com/ReactT ...
- FineReport——登录不到决策系统
在不断的测试过程中,可能会造成缓存数据的累积,所以在登录过程中可能会出现登录不到决策系统,而是跳转到某一模板页面 解决方法就是清理缓存或者换一个浏览器测试.
- FineReport——JS二次开发(工具栏按钮事件及说明)
首先获取到这个模板对象: document.getElementById('reportFrame').contentWindow.contentPane.方法名称(); 方法以及说明: