2015 ACM Arabella Collegiate Programming Contest
题目链接:https://vjudge.net/contest/154238#overview。
ABCDE都是水题。
F题,一开始分类讨论,结果似乎写挫了,WA了一发。果断换并查集上,A了。
G题,状态压缩DP,不难写,但是时限有点紧,读入也比较恶心。。值得注意的是计算一个数二进制下有几个1可以用__builtin_popcount(mask);判断a和b在二进制表示下a是不是b的子集可以用(a&b)==a;另外字符串s想移除最后一位可以s.resize(s.size()-1)或者s.erase(s.end()-1)。
H题,tarjan题,思路不难。无向图缩点以后找一下树的直径,再遍历一下即可。但是被两个傻逼错误卡了好久。。好弱啊。。顺便注意下,无向图的缩点需要在tarjan的时候加一个参数fa,或者用head数组实现邻接表。后者因为反向边和原边的编号是相邻的,可以直接用vis数组来使得反向边不访问,这个方法的好处是可以处理重边,而第一个方法不行。具体的代码实现我之前的模板里有。。贴一下这题的代码好了:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stack>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
const int N = + ; int n,m,dfs_clock,dfn[N],low[N];
int belong[N],scc_cnt,id[N];
stack<int> S;
struct edge
{
int v,w,nxt;
}G[N*];
int head[N],head2[N],etot;
vector<int> bcc[N];
void addEdge(int u,int v,int w,int* head)
{
G[etot] = (edge){v,w,head[u]};
head[u] = etot++;
} int pos = ;
void init()
{
etot = ;
memset(head,-,sizeof head);
memset(head2,-,sizeof head2);
dfs_clock = ;
memset(dfn,,sizeof(dfn));
memset(belong,,sizeof(belong));
scc_cnt = ;
memset(id,-,sizeof(id));
} void tarjan(int u,int fa)
{
dfn[u]=low[u]=++dfs_clock;
S.push(u);
for(int i=head[u];i!=-;i=G[i].nxt)
{
edge e = G[i];
int v = e.v;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(dfn[v] < dfn[u] && v != fa)
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
scc_cnt++;
bcc[scc_cnt].clear();
for(;;)
{
int x = S.top();S.pop();
belong[x] = scc_cnt;
bcc[scc_cnt].push_back(x);
if(id[scc_cnt] == - || id[scc_cnt] > x) id[scc_cnt] = x;
if(x==u) break;
}
} } ll d[N],d1[N],d2[N];
void dfs(int u,int fa,ll* dis)
{
for(int i=head2[u];i!=-;i=G[i].nxt)
{
edge e = G[i];
int v = e.v, w = e.w;
if(v == fa) continue;
dis[v] = dis[u] + w;
dfs(v,u,dis);
}
} void solve()
{
for(int i=;i<=n;i++)
{
if(!dfn[i]) tarjan(i,-);
} for(int i=;i<=n;i++)
{
int u = belong[i];
for(int j=head[i];j!=-;j=G[j].nxt)
{
edge e = G[j];
int v = belong[e.v], w = e.w;
if(u != v)
{
addEdge(u,v,w,head2);
}
}
} int x = belong[];
d[x] = ;
dfs(x,-,d);
int y = x;
for(int i=;i<=scc_cnt;i++)
{
if(d[i] > d[y])
{
y = i;
}
}
d1[y] = ;
dfs(y,-,d1);
x = y;
for(int i=;i<=scc_cnt;i++)
{
if(d1[i] > d1[x])
{
x = i;
}
}
d2[x] = ;
dfs(x,-,d2);
int ans_id = min(id[x],id[y]);
ll len = d1[belong[ans_id]] + d2[belong[ans_id]];
for(int i=;i<=scc_cnt;i++)
{
ll temp = max(d1[i], d2[i]);
if(temp < len)
{
ans_id = id[i];
len = temp;
}
else if(temp == len && id[i] < ans_id) ans_id = id[i];
}
printf("%d %I64d\n",ans_id,len);
} int main()
{
int T;
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
init();
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w,head);
addEdge(v,u,w,head);
}
solve();
}
}
H题
2015 ACM Arabella Collegiate Programming Contest的更多相关文章
- gym100676 [小熊骑士限定]2015 ACM Arabella Collegiate Programming Contest
Kuma Rider久违的第二场训练,这场很水,又在vj的榜单上看到第一场的大哥了,2小时ak,大哥牛啤! A.水 #include<cstdio> #include<iostrea ...
- 边双连通缩点+树dp 2015 ACM Arabella Collegiate Programming Contest的Gym - 100676H
http://codeforces.com/gym/100676/attachments 题目大意: 有n个城市,有m条路,每条路都有边长,如果某几个城市的路能组成一个环,那么在环中的这些城市就有传送 ...
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
A(By talker): 题意分析:以a(int) op b(int)形式给出两个整数和操作符, 求两个整数是否存在操作符所给定的关系 ,有则输出true,无则输出false: 思路:由于无时间复杂 ...
- 18春季训练01-3/11 2015 ACM Amman Collegiate Programming Contest
Solved A Gym 100712A Who Is The Winner Solved B Gym 100712B Rock-Paper-Scissors Solved C Gym 100712C ...
- ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集
题目链接:http://codeforces.com/gym/100676/attachments 题意: 给一个字符串,有一些约束条件,两个位置要相同,有一些是问号,求最后有多少种方案回文? 分析: ...
- ACM Arabella Collegiate Programming Contest 2015 H. Capital City 边连通分量
题目链接:http://codeforces.com/gym/100676/attachments 题意: 有 n 个点,m 条边,图中,边强连通分量之间可以直达,即距离为 0 ,找一个点当做首都,其 ...
- 2017 ACM Arabella Collegiate Programming Contest(solved 11/13)
省选考前单挑做点ACM练练细节还是很不错的嘛- 福利:http://codeforces.com/gym/101350 先来放上惨不忍睹的virtual participate成绩(中间跑去食堂吃饭于 ...
- 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)
F. Palindrome Problem Description A string is palindrome if it can be read the same way in either di ...
- 2015 ACM Syrian Collegiate Programming Contest
A. My Friend of Misery 计算出答案的上下界即可. 时间复杂度$O(n)$. #include<bits/stdc++.h> using namespace std; ...
随机推荐
- JSP JSONArray使用遇坑!添加以下6个jar包
1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar commons ...
- 关闭google默认打开翻译提醒
关闭google默认打开翻译提醒 在header中添加以下代码: <meta name="google" content="notranslate" /& ...
- Could not retrieve transaction read-only status from server问题排查
今天发现save task的时候经常后台会报这个错,而且有的时候还会卡住等20几分钟才执行完. 2019-11-12 15:08:29.410 http-nio-9080-exec-6 ERROR o ...
- 【python+ddt】DDT模块的使用
ddt模块包含了一个类的装饰器ddt和两个方法的装饰器: data:包含多个你想要传给测试用例的参数: file_data:会从json或yaml中加载数据: unpanck:通常data中包含的每一 ...
- Computer Vision_33_SIFT:Evaluation of Interest Point Detectors——2000
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- Flutter——AspectRatio组件
AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度是由宽度和比率决定的,类似于 Bo ...
- 理解 shared_ptr实现copy-on-write(COW)
看muduo库某个生产者消费者的地方,利用shared_ptr有效减少了锁的范围及无用的拷贝,下面来看一看 // reader 消费者, shared_ptr<map<string,int ...
- 0010Springboot整合thymeleaf
1.pom.xml中添加thymeleaf的起步依赖 2.编写html文件并放在classpath:/templates/路径下 3.编写controller并返回字符串,会到classpath:/t ...
- Spring-整合MyBatis-声明式事务
12.整合Mybatis 步骤: 导入相关jar包 junit mybatis mysql数据库 spring相关 aop织入 mybatis-spring[new] 编写配置文件 测试 12.1.会 ...
- 关于反编译pyc的一点技巧
现在最流行的是用 https://github.com/rocky/python-uncompyle6 但是有些python小版本不一样,比如2.7.6的某版本,开头的magic number在这个项 ...