2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)
题目链接 : http://codeforces.com/gym/100781/attachments
A-Adjoin the Network
题意大概是有多棵树(也可能是一颗),现在要把它们合并成一颗树,且保证最终这棵树的最远点对最小,求最后的这棵树的最长链(最远点对)的长度。
练习赛时想的是我们在每棵树上跑出最长链,并找到中间点,然后以所有"最长链"中的最长链的中间点为根节点,其他"最长链"的中间点直接与这个根节点相连即可构造出最远点对最小的大树。然而并不知道怎么找到最长链的中间点,跑最长链也有点不熟。
其实这题只要有上面构造的思路,然后求出所有最长链的长度即可。因为最后这棵最远点对最小的大树其最长链的只可能有三种情况(对应三种推出方式):
1. 最长链的长度
2. 最长链的"一半"长度 + 次长链的"一半"长度 + 1
3. 次长链的"一半"长度 + 季长链的"一半"长度 + 1
ps : 以上的"一半"是偶取半,奇取半+1 这个画下图就能明白
然后我们只需要跑出每棵小树的"最长链"长度排序计算即可。
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back((x)); const int INF=0x3f3f3f3f;
vector< int > G[+];
bool vis[+];
int d[+][];
vector< int > lian;
int longest; void dfs1(int me, int fa){
vis[me]=true;
for(auto son:G[me]){
if(son==fa) continue;
dfs1(son,me);
if(d[son][]+>=d[me][]){
d[me][]=d[me][];
d[me][]=d[son][]+;
}
}
} void dfs2(int me ,int fa){
if(fa!=-){
if(d[me][]+==d[fa][]) d[me][]=max(d[me][]+d[me][],d[me][]++d[fa][]);
else d[me][]=max(d[me][]+d[me][],d[me][]++d[fa][]);
}
else{
d[me][]=d[me][]+d[me][];
}
for(auto son: G[me]){
if(son==fa) continue;
dfs2(son,me);
}
longest=max(longest,d[me][]);
} bool cmp(int a,int b){
return a>b;
} int getR(int L){
if(L%) return L/+;
return L/;
} int main(){
int N,M;
scanf("%d%d",&N,&M);
for(int i=;i<N;++i) {
G[i].clear();
vis[i]=false;
}
lian.clear();
for(int i=;i<M;++i){
int u,v;
scanf("%d%d",&u,&v);
G[u].pb(v);
G[v].pb(u);
}
for(int i=;i<N;++i){
if(vis[i]==false){
longest=-;
dfs1(i,-);
//printf("%d : %d\n",i,d[i][0]+d[i][1]);
dfs2(i,-);
lian.pb(longest);
}
}
sort(lian.begin(),lian.end(),cmp);
int ans=-;
if(lian.size()>) ans=max(ans,lian[]);
if(lian.size()>) ans=max(ans,getR(lian[])+getR(lian[])+);
if(lian.size()>) ans=max(ans,getR(lian[])+getR(lian[])+);
printf("%d\n",ans);
return ;
}
开始的时候只用一次dfs跑,这只能跑出根节点的最长链,还要第二次dfs。 简单说明: d[i][0]为i点固定方法最深度 ,d[i][1]为次深度,d[i][2]为经过i点的最长链长度。
(求最远点对的方法以前学过,这题应该很快写出来才是,惭愧惭愧。
E-Entertainment Box
最开始学贪心的例子是给出一系列课程(知道开始与结束时间),需要尽可能安排上更多的课程,解决方案是贪心结束时间早的。
而这道题相当于给了N个时间段,K个轨道可以跑时间段,要求能上最多的课程数。(题目是录节目,我说成上课,其实一个意思)
想法还是贪心结束时间靠前的,用一个数据结构模拟K个轨道跑课程。
错误代码:
#include<bits/stdc++.h>
using namespace std;
#define fst first
#define scd second typedef long long ll;
typedef pair<ll , ll > pii;
queue< pii > Q;
pii pro[+];
int _id[+]; bool cmp(int i,int j){
if(pro[i].scd!=pro[j].scd)return pro[i].scd<pro[j].scd;
return pro[i].fst<pro[i].fst;
} int main(){
int N,K;
while(~scanf("%d%d",&N,&K)){
//printf("N K :%d %d\n",N,K);
for(int i=;i<=N;++i){
ll xx,yy;
scanf("%lld%lld",&xx,&yy);
_id[i]=i;
pro[i]=make_pair(xx,yy);
}
sort(_id+,_id++N,cmp);
while(!Q.empty()) Q.pop();
//for(int i=1;i<=N;++i) printf("record %d : %lld %lld\n",i,pro[_id[i]].fst,pro[_id[i]].scd);
int cnt=;
for(int i=;i<=K;++i) Q.push(make_pair(-1ll,0ll));
//printf("N K :%d %d\n",N,K);
for(int i=;i<=N;++i){
pii can=pro[_id[i]];
while((!Q.empty())&&can.fst>=Q.front().scd) Q.pop();
if(Q.size()<K){
Q.push(can);
//printf("record %d : %lld %lld\n",i,pro[_id[i]].fst,pro[_id[i]].scd);
cnt++;
}
}
printf("%d\n",cnt);
}
return ;
}
插入新课程时队列会弹出所有已经早于新课程开始时间就结束的课程,然而这是不行的。
如
5 3
1 2
1 3
1 5
4 6
1 7
这是队友出的Hack数据,如果(4 6) 入队 ,(1 2) 和(1 3)都会被弹出,然后 (1, 7) 反而可以被多计一次了。
正确更换课程应该最多更换一个早于新课程开始时间就结束的且最近的课程。这时候我们需要用 multiset 。(之前队列不行也可以理解为我们已经贪结束时间了,不能随便按自然时间流逝弹出所有早于新课程开始时间就结束的课程)
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define fst first
#define scd second
typedef pair<int ,int > pii;
multiset <int > mtst; bool cmp(pii a, pii b){
if(a.scd!=b.scd) return a.scd<b.scd;
return a.fst<b.fst;
} pii P[+]; int main(){
int N,K;
scanf("%d%d",&N,&K);
for(int i=;i<N;++i){
scanf("%d%d",&P[i].fst,&P[i].scd);
//printf("%d : %d %d\n",i,P[i].fst,P[i].scd);
}
sort(P,P+N,cmp);
//for(int i=0;i<N;++i) printf("%d : %d %d\n",i,P[i].fst,P[i].scd);
for(int i=;i<K;++i){
mtst.insert();
}
multiset< int > :: iterator p;
int cnt=;
for(int i=;i<N;++i){
int l=P[i].fst,r=P[i].scd;
p=mtst.upper_bound(l);
if(p==mtst.begin()) continue;
p--;
mtst.erase(p);
mtst.insert(r);
//printf("r : %d\n",r);
cnt++;
}
printf("%d\n",cnt);
return ;
}
2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)的更多相关文章
- (寒假GYM开黑)2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)
layout: post title: 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) author: &qu ...
- Codeforces Gym101572 B.Best Relay Team (2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017))
2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) 今日份的训练,题目难度4颗星,心态被打崩了,会的算法太少了,知 ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举
2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举 ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp
2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp [P ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) Solution
A - Airport Coffee 留坑. B - Best Relay Team 枚举首棒 #include <bits/stdc++.h> using namespace std; ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
A. Airport Coffee 设$f_i$表示考虑前$i$个咖啡厅,且在$i$处买咖啡的最小时间,通过单调队列优化转移. 时间复杂度$O(n)$. #include<cstdio> ...
- Codeforces Gym101572 G.Galactic Collegiate Programming Contest (2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017))
Problem G Galactic Collegiate Programming Contest 这个题题意读了一会,就是几个队参加比赛,根据实时的信息,问你1号队的实时排名(题数和罚时相同的时候并 ...
- 模拟赛小结:2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
比赛链接:传送门 本场我们队过的题感觉算法都挺简单的,不知道为啥做的时候感觉没有很顺利. 封榜后7题,罚时1015.第一次模拟赛金,虽然是北欧的区域赛,但还是有点开心的. Problem B Best ...
- ACM ICPC, JUST Collegiate Programming Contest (2018) Solution
A:Zero Array 题意:两种操作, 1 p v 将第p个位置的值改成v 2 查询最少的操作数使得所有数都变为0 操作为可以从原序列中选一个非0的数使得所有非0的数减去它,并且所有数不能 ...
随机推荐
- jar包不能乱放【浪费了下午很多时间】
不能放在类路径下(也即是src文件夹下),然后再buildpath 必须放在web-inf文件夹下 这样才能tomcat找打jar文件
- PLC 通讯
几个之前整理的高级语言与PLC通讯的资源下载链接:三菱:http://blog.sina.com.cn/s/blog_16d7d3ecb0102x6wj.html倍福:http://bbs.elecf ...
- 服务容错和Hystrix
一.雪崩效应 在微服务架构中,通常有多个服务层调用,如果某个服务不可用,造成调用的服务也不可用,造成整个系统不可用的情况,叫做雪崩效应 二.Hystrix 放雪崩利器Hystrix,基于Netflix ...
- Oauth2.0客户端服务端示例
https://blog.csdn.net/qq_28165595/article/details/80459185 前言前面的理解OAuth2.0认证与客户端授权码模式详解,我们大致了解了Oauth ...
- centos7如何查看网络状态?
参考https://www.jb51.net/os/RedHat/520187.html 查看网络状态: lsof -Pnl +M -i4 显示ipv4服务及监听端情况 netstat -anp 所有 ...
- Webservices部署在IIS6.0上的一个小问题
部署方式还是跟网站的部署方式一样,可是通过localhost访问一直提示400(bad request)错误. 可以在iis上预览到.在vs上引用的时候怎么都预览不到. 换个思路,把localhost ...
- Deployment Descriptor Web.xml
Deployment Descriptor部署描述符: - 部署描述符是要部署到Web容器或EJB容器的Web应用程序或EJB应用程序的配置文件. - 部署描述符应包含EJB应用程序中所有企业bean ...
- shell脚本(二)
shell脚本(二)——变量 一.定义:用来存放各种数据,编程语言组成部分 变量的命名规则: 变量名由数字 字母下划线组成 必须以字母或者下划线开头 不能使用shell里面的关键词 ...
- Spring Boot探究之旅--启动分析
刚接触SpringBoot,感觉挺方便的,不用配置那么多乱七八糟的配置,很方便!酒饱思淫欲,得陇望蜀一下,看看SpringBoot到底怎么做到这么方便的. 首先呢,先来看个SpringBoot的hel ...
- leetcode7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...