Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)
这道题题目保证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)的更多相关文章
- 模拟赛T2 线段树优化建图+tarjan+拓扑排序
然而这只是 70pts 的部分分,考场上没想到满分怎么做(现在也不会) code: #include <cstdio> #include <string> #include & ...
- 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...
- 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树
很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- 计蒜客T2202 数三角形(提高组2017模拟赛(三)day2T3) LZOJ3878攻略
今天模拟赛考了一道计蒜客NOIP2017模拟赛(三)day2T3的数三角形,原题链接 https://nanti.jisuanke.com/t/T2202 ,LZOJ3878攻略.场上想了很久都没转化 ...
- [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)
(2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
- PYC#1欢乐赛第三题题解
这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...
- 第八届河南省赛C.最少换乘(最短路建图)
C.最少换乘 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 94 Solved: 25 [Submit][Status][Web Board] De ...
随机推荐
- 微信图片上传 wx.Imagechoose
拍照或从手机相册中选图接口 wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩 ...
- sqlyog注释的快捷键-先收藏
在学习使用sqlyog的时候,想要多行注释SQL语句,就去网上找了相关的快捷键,与大家分享,网上有很多! Ctrl+M 创建一个新的连接Ctrl+N 使用当前设置新建连接Ctrl+F4 断开当前连接 ...
- SQLite进阶-9.别名
我们可以暂时给表或者列重命名为另一个名字,称为别名,重命名只是临时运行时改变,不会改变数据库中的实际的名字. -- 语法 SELECT column_name AS column_alias_name ...
- 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...
- pb SendMessage
PB发送和接收消息send SendMessage 1.用PB自带的SEND函数发送消息 传字符:Send(Handle(w_main),1600,0,'dfdfd') 传LONG:Send(Hand ...
- Digester库
在之前所学习关于启动简单的Tomcat部分实现的代码中,我们使用一个启动类Bootstrap类 来实例化连接器.servlet容器.wrapper实例.和其他组件,然后调用各个对象的set方法将他们关 ...
- java——包装类数据缓存 ==号详解
Java对部分经常使用的数据采用缓存技术,即第一次使用该数据则创建该数据对象并对其进行缓存, 当再次使用等值对象时直接从缓存中获取,从而提高了程序执行性能.(只对常用数据进行缓存) Java中只是对部 ...
- 二叉查找树 平衡二叉查找树 红黑树 b树 b+树 链表 跳表 链表
https://www.cnblogs.com/mojxtang/p/10122587.html二叉树的新增遍历查找
- linux系统编程相关
基本的概念:程序,进程,并发,单道程序设计,多道程序设计,时钟中断. 存储介质:寄存器(操作系统的位数是针对寄存器而言的,32位识字节,64位就是8字节).缓存cache.内存,硬盘,网络. cpu的 ...
- CSS中为什么有的元素能够设置高度,而有的元素却不能设置高度与宽度?
可以使用{display:block}将内联元素变为块级元素,同时使用{display:inline}将块级元素变为内联元素. {display:inline-block}又是怎么回事,根据张鑫旭老师 ...