[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 ...
随机推荐
- javascript 事件知识集锦
1.事件委托极其应用 转载的链接: http://www.webhek.com/event-delegate/#comments 2. 解析javascript事件机制 转载链接: http: ...
- MSF爆破MSSQL
show options: msf auxiliary(scanner/mssql/mssql_login) > show options Module options (auxiliary/s ...
- python自动开发之第二十二天
知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 一. Session 基于Cookie做用户验证时:敏感信息不 ...
- python基础===多进程
进程线程的区别在进程,线程,协程的区别 linux或者unix有fork()函数,但是不支持win系统. multiprocessing multiprocessing模块是跨平台版本的多进程模块.支 ...
- Git 常用命令速查表(图文+表格)【转】
转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...
- Redis -- 过期时间 和 缓存 例子
1.设置 key的生存时间,过期自动删除 exprire key seconds 设置过期时间 秒数 ttl key 查询剩余时间 如果 设置了过期时间.对key进行 set 操作,会清除 ...
- 【python】dict的拷贝问题
部分来源:http://blog.sina.com.cn/s/blog_5c6760940100bmg5.html ①直接赋值 ---- 结果是不同名的引用 对新字典的修改完全作用在了原来的字典上,只 ...
- hdu 1829(继续扩展并查集)
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Longest Valid Parentheses——仍然需要认真看看(动态规划)
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- 【hdoj_1085】Holding Bin-Laden Captive![母函数]
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1085 可以这样理解题意:给出1元,2元和5元的三种硬币若干,每种硬币数量给出,现在可以从所有的硬币中,选出 ...