边双无法确定

缩完边双就是一棵树

树上差分随意弄一下吧...

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
namespace remoon {
#define re register
#define de double
#define le long double
#define ri register int
#define ll long long
#define sh short
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define tpr template <typename ra>
#define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)
#define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --)
extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
}
int wr[], rw;
#define pc(iw) putchar(iw)
tpr inline void write(ra o, char c = '\n') {
if(!o) pc('');
if(o < ) o = -o, pc('-');
while(o) wr[++ rw] = o % , o /= ;
while(rw) pc(wr[rw --] + '');
pc(c);
}
tpr inline void cmin(ra &a, ra b) { if(a > b) a = b; }
tpr inline void cmax(ra &a, ra b) { if(a < b) a = b; }
tpr inline bool ckmin(ra &a, ra b) { return (a > b) ? a = b, : ; }
tpr inline bool ckmax(ra &a, ra b) { return (a < b) ? a = b, : ; }
}
using namespace std;
using namespace remoon; #define sid 500050
int n, m, cnp = , tim, top, bcc;
int id[sid], jg[sid], U[sid], V[sid], dfn[sid], low[sid], st[sid];
int nxt[sid], node[sid], cap[sid], bel[sid]; inline void addedge(int u, int v, int w = ) {
id[cnp + ] = id[cnp + ] = w;
nxt[++ cnp] = cap[u]; cap[u] = cnp; node[cnp] = v;
nxt[++ cnp] = cap[v]; cap[v] = cnp; node[cnp] = u;
} #define cur node[i]
inline void tarjan(int o, int fa) {
st[++ top] = o;
dfn[o] = low[o] = ++ tim;
for(int i = cap[o]; i; i = nxt[i])
if(!dfn[cur]) {
tarjan(cur, i), cmin(low[o], low[cur]);
if(low[cur] <= dfn[o]) continue;
int p; ++ bcc;
while(p != cur) bel[p = st[top --]] = bcc;
}
else if((i ^ ) != fa) cmin(low[o], dfn[cur]);
} int eg[sid], vis[sid], up[sid], down[sid];
int son[sid], sz[sid], dep[sid], anc[sid], fa[sid]; inline void dfs(int o) {
sz[o] = ;
for(int i = cap[o]; i; i = nxt[i])
if(cur != fa[o]) {
eg[id[i]] = cur;
fa[cur] = o; dep[cur] = dep[o] + ;
dfs(cur); sz[o] += sz[cur];
if(sz[son[o]] < sz[cur]) son[o] = cur;
}
} inline void dfs(int o, int ac) {
anc[o] = ac;
if(!son[o]) return;
dfs(son[o], ac);
for(int i = cap[o]; i; i = nxt[i])
if(cur != fa[o] && cur != son[o]) dfs(cur, cur);
} inline int lca(int u, int v) {
int pu = anc[u], pv = anc[v];
while(pu != pv) {
if(dep[pu] < dep[pv]) swap(pu, pv), swap(u, v);
u = fa[pu]; pu = anc[u];
}
return (dep[u] < dep[v]) ? u : v;
} inline void cot(int o) {
vis[o] = ;
for(int i = cap[o]; i; i = nxt[i])
if(cur != fa[o])
cot(cur), up[o] += up[cur], down[o] += down[cur];
} int main() { n = read(); m = read();
rep(i, , m) {
U[i] = read(); V[i] = read();
addedge(U[i], V[i]);
}
rep(i, , n) if(!dfn[i]) {
tarjan(i, ); ++ bcc;
while(top) bel[st[top --]] = bcc;
} cnp = ;
memset(cap, , sizeof(cap));
rep(i, , m) {
int u = U[i], v = V[i];
if(bel[u] == bel[v]) jg[i] = ;
else addedge(bel[u], bel[v], i);
} rep(i, , bcc)
if(!dep[i]) dfs(i), dfs(i, i); int q = read();
rep(i, , q) {
int x = read(), y = read();
if(bel[x] == bel[y]) continue;
else {
int lc = lca(bel[x], bel[y]);
up[bel[x]] ++; up[lc] --;
down[bel[y]] ++; down[lc] --;
}
} rep(i, , bcc) if(!vis[i]) cot(i);
rep(i, , m) {
int u = bel[U[i]], v = bel[V[i]];
if(jg[i] == ) printf("%c", 'B');
else {
if(dep[u] < dep[v]) {
if(up[eg[i]]) printf("%c", 'L');
else if(down[eg[i]]) printf("%c", 'R');
else printf("%c", 'B');
}
else {
if(up[eg[i]]) printf("%c", 'R');
else if(down[eg[i]]) printf("%c", 'L');
else printf("%c", 'B');
}
}
}
return ;
}

loj2480 [CEOI2017]One-Way Streets 边双+树上差分的更多相关文章

  1. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  2. @loj - 2480@ 「CEOI2017」One-Way Streets

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一张 n 个点 m 条边的无向图,现在想要把这张图定向. 有 ...

  3. BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树

    题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...

  4. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  5. BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分

    Solution Tarjan 点双缩点, 加上树上差分计算. 注意特判... 我特判挂了好久呜呜呜 Code #include<cstdio> #include<cstring&g ...

  6. Codechef Sad Pairs——圆方树+虚树+树上差分

    SADPAIRS 删点不连通,点双,圆方树 非割点:没有影响 割点:子树DP一下 有不同颜色,所以建立虚树 在圆方树上dfs时候 如果当前点是割点 1.统计当前颜色虚树上的不连通点对,树形DP即可 2 ...

  7. 【思维题 集合hash 树上差分】11.5撸树

    要注重问题的转化和一些结论的推断 题目描述 要致富,先撸树. 一棵树的形状可以简化为一张 $N$ 个点 $M$ 条边的图,由于装备条件限制,你只有撸两次,也就是删去两条边,当这张图不联通时,就意味着树 ...

  8. BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]

    圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...

  9. BZOJ 3331 (Tarjan缩点+树上差分)

    题面 传送门 分析 用Tarjan求出割点,对点-双连通分量(v-DCC)进行缩点,图会变成一棵树 注意v-DCC的缩点和e-DCC不同,因为一个割点可能属于多个v-DCC 设图中共有p个割点和t个v ...

随机推荐

  1. 【BZOJ】3963: [WF2011]MachineWorks

    [题意]给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器.给定初始钱数c和总天数T,求最大收益.n<=10^5 ...

  2. NYOJ 221 Tree (二叉树)

    题目链接 描述 Little Valentine liked playing with binary trees very much. Her favorite game was constructi ...

  3. 29、filter、map、reduce的作用?

    通俗的说..都是用在一堆数据(比如一个列表)上.. map是用同样方法把所有数据都改成别的..字面意思是映射..比如把列表的每个数都换成其平方.. reduce是用某种方法依次把所有数据丢进去最后得到 ...

  4. frameset测试

    frame不能放在body标签内.指定name属性,为这一个框架指定名字,在html的a的target属性可以设为target="right"在该框架显示跳转的页面.(常用于后台管 ...

  5. Java并发编程(二)

    1.Lock接口                                                        在Lock接口出现之前,Java程序是靠synchronized关键字实 ...

  6. 很多人都没用过的轻量级Oracle数据库数据导出工具SQLLDR2——性能超赞

    SQLLDR2 介绍 每周发表一篇数据库或大数据相关的帖子,敬请关注 1. 工具介绍 Sqluldr2(SQL * UnLoader 第二版)是灵活与强大的 Oracle 文本导出程序,已被大众使 用 ...

  7. Tutorial 6: ViewSets & Routers

    转载自:http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/ Tutorial 6: ViewSets & ...

  8. python模块之itertools

    在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的容器,包含有多个对象.通过调用循环器的next()方法 (__next__()方法,在Python 3.x中),循环器 ...

  9. CGIC函数说明

    CGIC函数说明 参考cgic函数说明_Embedded Resources Library Online (C)郝博士 cgiFormResultType cgiFormString( char * ...

  10. 数据库连接池(c3p0与druid)

    1.数据库连接池概念 其实就是一个容器(集合),存放数据库连接的容器.当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归 ...