[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 ...
随机推荐
- [bzoj1070] 修车
这周学习了费用流,就写了几题.其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……). 题目大意:有m个技术人员n辆车,一个技术人员只能同时 ...
- Python标准库笔记(1) — string模块
String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(wi ...
- 为什么Windows7打开项目的方式是灰的不能修改
http://jingyan.baidu.com/article/d3b74d64a964691f77e60900.html 进入组策略编辑器,即运行gpedit.msc,进入“用户配置”-“管理模板 ...
- Yii 1.1.17 六、开启路由与使用缓存
一.开启路由 1.在配置文件main.php的components中 定义如下: // 定义路由 'urlManager'=>array( // URL模式为PATHINFO 'urlForma ...
- Linux(Unix)密码策略问题导致root密码不能修改
Linux(Unix)密码策略问题导致root密码不能修改 发布时间: 2016-01-19 浏览次数: 1034 下载次数: 5 用户修改了密码配置文件,导致root账户修改密码时报如下错误: ...
- c json实战引擎四 , 最后❤跳跃
引言 - 以前那些系列 长活短说, 写的最终 scjson 纯c跨平台引擎, 希望在合适场景中替代老的csjon引擎, 速度更快, 更轻巧. 下面也是算一个系列吧. 从cjson 中得到灵感, 外加 ...
- 利用eclipse调试ofbiz之debug使用
1.项目右键-配置debug 2.new一个debug调试 3.配置运行类org.ofbiz.base.start.Start 4.设置内存大小:arguments-VM arguments -Xms ...
- POJ 1456 Supermarket(贪心+并查集)
题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...
- sql server 2008 R2连接失败 错误:18456
这种问题的解决方法: 第一步:以windows验证模式进入数据库管理器. 第二步:在对新资源管理器中右击实例名称选择属性,弹出服务器属性对话框,我们在左侧栏选择[安全性]选项卡,选中”SQL Serv ...
- hdu 1853(拆点判环+费用流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...