传送门:https://www.hackerrank.com/contests/world-codesprint-11/challenges/hackerland

【题解】

因为加点每次加1个点1条边,所以不会存在一定要经过后加的那些点才能到达的情况。

直接把最后的图建出来,tarjan缩强联通分量+拓扑排序处理连通性。

拿个bitset维护拓扑排序过程即可。复杂度O(n^2/32)

# include <queue>
# include <bitset>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + ;
const int mod = 1e9+; # define RG register
# define ST static int n, m, head[M], nxt[M], to[M], tot=, c; struct Graph {
int head[M], nxt[M], to[M], tot;
inline void set() {tot = ;}
inline void add(int u, int v) {
++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v;
}
}G1, G; struct pa {
int op, a, b;
}q[M]; int DFN = , dfn[M], low[M], bel[M], scc = ;
int st[M], stn=;
bool ins[M];
inline void tarjan(int x) {
dfn[x] = low[x] = ++DFN;
st[++stn] = x;
ins[x] = ;
for (int i=G1.head[x]; i; i=G1.nxt[i]) {
if(!dfn[G1.to[i]]) {
tarjan(G1.to[i]);
low[x] = min(low[x], low[G1.to[i]]);
} else if(ins[G1.to[i]]) low[x] = min(low[x], dfn[G1.to[i]]);
}
if(low[x] == dfn[x]) {
int t = ; ++scc;
while(t != x) {
t = st[stn];
--stn; ins[t] = ;
bel[t] = scc;
}
}
} bitset<> bs[];
int out[M], ans[M], an=;
queue<int> qu; int main() {
G1.set(), G.set();
cin >> n >> m; c = n;
for (int i=, u, v; i<=m; ++i) {
scanf("%d%d", &u, &v);
G1.add(u, v);
}
cin >> m;
for (int i=; i<=m; ++i) {
scanf("%d%d%d", &q[i].op, &q[i].a, &q[i].b);
if(q[i].op==) {
++c;
if(q[i].b) G1.add(c, q[i].a);
else G1.add(q[i].a, c);
}
}
for (int i=; i<=c; ++i) if(!dfn[i]) tarjan(i); // for (int i=1; i<=c; ++i) printf("%d\n", bel[i]); for (int i=; i<=c; ++i) {
bs[bel[i]][bel[i]] = ;
for (int j=G1.head[i]; j; j=G1.nxt[j])
if(bel[i] != bel[G1.to[j]]) {
bs[bel[i]][bel[G1.to[j]]] = ;
// printf("%d %d\n", bel[i], bel[G1.to[j]]);
out[bel[i]] ++;
G.add(bel[G1.to[j]], bel[i]);
}
}
for (int i=; i<=scc; ++i)
if(!out[i]) qu.push(i);
while(!qu.empty()) {
int top = qu.front(); qu.pop();
for (int i=G.head[top]; i; i=G.nxt[i]) {
--out[G.to[i]];
bs[G.to[i]] |= bs[top];
if(out[G.to[i]] == ) qu.push(G.to[i]);
}
}
// for (int i=1; i<=n; ++i, cout << endl)
// for (int j=1; j<=n; ++j) cout << bs[i][j] << ' '; for (int i=m; i; --i)
if(q[i].op == ) ans[++an] = bs[bel[q[i].a]][bel[q[i].b]]; for (int i=an; i; --i) puts(ans[i] ? "Yes" : "No"); return ;
}

Hackerrank [World CodeSprint 11] City Construction的更多相关文章

  1. Official Program for CVPR 2015

    From:  http://www.pamitc.org/cvpr15/program.php Official Program for CVPR 2015 Monday, June 8 8:30am ...

  2. Web 入门之 XML

      160916   1. 什么是XML?   XML 是 EXtensible Markup Language 的缩写,称为可扩展标记语言,所谓可扩展指用户可根据XML规则自定义标记.例子1-1 = ...

  3. Android 三级联动选择城市+后台服务加载数据库

    技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...

  4. 新浪微博SDK开发(1):总述

    花了几天时间,消耗了九牛六虎之力,新浪微博大部分API已经封装,但有部分API实在太难封装. 说起这封装,我必须严重地.从人品和技术层面鄙视一下新浪的程序员,实在太菜了.估计菜鸟都被大企业吸收了,菜到 ...

  5. 世界城市 XML

    下载地址:http://www.qlcoder.com/uploads/dd01140921/147988679320159.xml <Location> <CountryRegio ...

  6. R语言 recommenderlab 包

    recommend li_volleyball 2016年3月20日 library(recommenderlab) ## Warning: package 'recommenderlab' was ...

  7. R语言 推荐算法 recommenderlab包

    recommend li_volleyball 2016年3月20日 library(recommenderlab) library(ggplot2) # data(MovieLense) dim(M ...

  8. ajax读取XML文本(如读取城市)

    //加载城市 function loadArea_pep() { $.ajax({ url: "/xmlFile/crty.xml", success: function (res ...

  9. OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token

    在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等 ...

随机推荐

  1. 手把手教你写css3通用动画

    之前接了几个微信里的项目,类似电子邀请函,什么分析报告这样的项目, 对css3动画要求十分高,每个页面客户几乎都有天马行空的想法,或者说设计师有这样的想法.众所周知css3里的keyframe写好了就 ...

  2. 微信营销 推广 会议签到 活动签到 复用微信3D动画签到系统

    适用场合 本软件适合各行各业,尤其世界500强上市公司,推广产品,聚集微信粉丝和人气.如大型展销会,新产品发布,主题活动推广,年会晚会等.各种商业和演出场合. 软件有试用版可供下载试用. 特色功能 顾 ...

  3. eclipse 关闭validating

    1.起因 validating XXX  总是非常的浪费时间,有时候还会造成程序卡死 2.解决 windows - Perferences - Validation build 全部去掉

  4. python 基础篇 06 编码 以及小知识点补充

    本节主要内容: 1. is和==的区别2. 编码的问题 ⼀. is和==的区别1. id()通过id()我们可以查看到⼀个变量表⽰的值在内存中的地址 注  ----<<<在pytho ...

  5. MyEclipse主题设置

    1. 打开网页: http://eclipsecolorthemes.org/ 选择自己喜欢的主题,并下载(下载epf文件) 我下载的是 Vibrant Ink 2. 下载完成后,打开myeclips ...

  6. POJ 3858 Hurry Plotter(DP)

    Description A plotter is a vector graphics printing device that connects to a computer to print grap ...

  7. C# Lambda表达式使用累加器例子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lamb ...

  8. To Chromium之浏览器外框UI

    先不去管那些webkit,V8 engine, Parser, security,IPC... 先来看看Chromium的外框UI是那些code负责的,如果自己可以定制化一下,应该蛮好玩的. TBD. ...

  9. WCF身份验证一:消息安全模式之<Certificate>身份验证

    消息安全模式的证书身份验证方式,基于WSHttpBinding绑定协议的实现过程.主要内容:基本概念,然后是制作证书.服务端配置.客户端配置.总结.这里应该和Transport传输安全模式之证书身份验 ...

  10. Java 对象及其内存控制

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...