题目/题解戳这里

这道题题目保证a,b,ca,b,ca,b,c各是一个排列…mdzz考场上想到正解但是没看到是排列,相等的情况想了半天…然后写了暴力60分走人…

由于两两间关系一定,那么就是一个竞赛图(完全图让每一条边都有向).显然就是tarjan.然后发现有很多边其实可以不存在,比如a>b>ca>b>ca>b>c,在竞赛图中就存在3条边a→b,b→c,a→ca\to b,b\to c,a\to ca→b,b→c,a→c.其实最后这一条边已经没有必要连了.那么就可以用主席树优化建边(类似BZOJ 3218 A+B problem(主席树优化网络流建图)).

CODE

选手自带常数巨大…(本地测开了O2O_2O2​还要跑2s+2s+2s+)

#include <cctype>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
inline void read(int &num) {
char ch; int flg = 1; while(!isdigit(ch=getchar()))if(ch == '-')flg = -flg;
for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar()); num*=flg;
}
const int MAXN = 100005;
const int N = 100005 * 20 * 3;
int X, Y, n, m, pos[MAXN];
struct node{ int v[3], id; }p[MAXN];
int in[N], scc[N], dfn[N], stk[N], indx, tmr, scccnt;
vector<int>e[N], g[N];
inline void adde(int u, int v) { if(u&&v)e[u].push_back(v); }
inline void addg(int u, int v) { if(u&&v)g[u].push_back(v), ++in[v]; }
int tarjan(int u) {
int lowu = dfn[u] = ++tmr;
stk[++indx] = u;
for(int v, i = 0, siz = e[u].size(); i < siz; ++i)
if(!dfn[v=e[u][i]]) lowu = min(lowu, tarjan(v));
else if(!scc[v]) lowu = min(lowu, dfn[v]);
if(lowu == dfn[u]) { ++scccnt;
do scc[stk[indx]] = scccnt;
while(stk[indx--] != u);
}
return lowu;
}
int ls[N], rs[N];
void ins(int &i, int l, int r, int x, int id) {
++m; ls[m] = ls[i], rs[m] = rs[i]; adde(m, i); i = m;
if(l == r) adde(i, id);
else {
int mid = (l + r) >> 1;
if(x <= mid) ins(ls[i], l, mid, x, id), adde(i, ls[i]);
else ins(rs[i], mid+1, r, x, id), adde(i, rs[i]);
}
}
void link(int i, int l, int r, int x, int id) {
if(!i) return;
if(r <= x) adde(id, i);
else {
int mid = (l + r) >> 1;
link(ls[i], l, mid, x, id);
if(x > mid) link(rs[i], mid+1, r, x, id);
}
}
inline void work() {
for(int i = 1; i <= n; ++i) pos[p[i].v[X]] = i;
int root = 0;
for(int i = 1; i <= n; ++i)
ins(root, 1, n, p[pos[i]].v[Y], pos[i]), link(root, 1, n, p[pos[i]].v[Y], pos[i]);
}
bool flag[N]; int ans;
void topo(int u) {
if(ans) return;
if(flag[u]) { ans = u; return; }
for(int i = 0, siz = g[u].size(); i < siz; ++i)
if(--in[g[u][i]] == 0) topo(g[u][i]);
}
int main () {
freopen("san.in", "r", stdin);
freopen("san.out", "w", stdout);
read(n); m = n;
for(int i = 1; i <= n; ++i)
for(int j = 0; j < 3; ++j)
read(p[i].v[j]);
X = 0, Y = 1; work();
X = 0, Y = 2; work();
X = 1, Y = 2; work();
for(int i = 1; i <= m; ++i)
if(!dfn[i]) tarjan(i);
for(int i = 1; i <= m; ++i)
for(int j = 0, siz = e[i].size(); j < siz; ++j)
if(scc[i] != scc[e[i][j]]) addg(scc[i], scc[e[i][j]]);
for(int i = 1; i <= n; ++i) flag[scc[i]] = 1;
for(int i = 1; i <= scccnt; ++i)
if(!in[i]) topo(i);
for(int i = 1; i <= n; ++i) puts(scc[i] == ans ? "1" : "0");
return 0;
}

Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)的更多相关文章

  1. 模拟赛T2 线段树优化建图+tarjan+拓扑排序

    然而这只是 70pts 的部分分,考场上没想到满分怎么做(现在也不会) code: #include <cstdio> #include <string> #include & ...

  2. 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)

    题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...

  3. 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树

    很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...

  4. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  5. 计蒜客T2202 数三角形(提高组2017模拟赛(三)day2T3) LZOJ3878攻略

    今天模拟赛考了一道计蒜客NOIP2017模拟赛(三)day2T3的数三角形,原题链接 https://nanti.jisuanke.com/t/T2202 ,LZOJ3878攻略.场上想了很久都没转化 ...

  6. [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)

    (2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...

  7. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  8. PYC#1欢乐赛第三题题解

    这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...

  9. 第八届河南省赛C.最少换乘(最短路建图)

    C.最少换乘 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 94  Solved: 25 [Submit][Status][Web Board] De ...

随机推荐

  1. Sentence Screen Fitting

    Given a rows x cols screen and a sentence represented by a list of words, find how many times the gi ...

  2. [转帖] ./demoCA/newcerts: No such file or directory openssl 生成证书时问题的解决.

    接上面一篇blog 发现openssl 生成server.crt 时有问题. 找了一个网站处理了一下: http://blog.sina.com.cn/s/blog_49f8dc400100tznt. ...

  3. Synchronize和ReentrantLock区别

    转自:https://blog.csdn.net/m0_37700275/article/details/83151850 目录介绍1.Synchronize和ReentrantLock区别 1.1 ...

  4. curl post请求封装

    /* POST /servlet/ICBCCMPAPIReqServlet?userID=jyi.y.1001&PackageID=201807311347539185&SendTim ...

  5. python中全局global和局部nonlocal命名空间

    python中全局global和局部nonlocal命名空间 局部名称空间对全局名称空间的变量可以引用,但是无法改变. count = 1 def func1(): count = 2 print(c ...

  6. LeetCode 141 ——环形链表(JAVA)

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...

  7. paramiko-ssh-秘钥认证实例

    import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa.txt') #创建ssh对象 ssh =para ...

  8. tensorflow零起点快速入门(5) --强化学习摘录截图

    tf.random_normal_initializer tf的GraphKeys用法 tf.reduce_mean tf.squared_difference 非tf中的zip,python的zip ...

  9. 转SSL/TLS协议

    TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的通信协议.它的前身是SSL协议(安全套接层协议,Secure Sockets Layer).这两个协议 ...

  10. PLSQL Developer 12 汉化包下载

    下载地址: https://www.allroundautomations.com/plsqldevlang/120/index.html