当前位置: 首页 > news >正文

题解:qoj8800 Triinformathlon

脑筋急转弯,看你多久能转出来。

题意:给出若干个三元组 \((x,y,z)\),分别代表第 \(i\) 个人在三个项目上的排名,排名越小越厉害。称一个人能打败另一个人当且仅当前者在至少两个项目上比后者厉害。现在 \(q\) 次询问,每次询问第 \(x\) 个人是否能直接或者间接地比 \(y\) 厉害。\(n\le 5\times 10^5\)

做法:

首先可以看的出来是个竞赛图,这是一个很好的性质,缩完点后是一条链,

先讲一个正经点的做法,如果我们知道每个点的出度,那么就可以直接按度数从小往大排,然后度数前缀和刚好是 \(\binom{i}{2}\) 的就是划分一个强连通分量出来,查询很容易解决。

考虑怎么求度数,就直接枚举 \((x,y),(y,z),(z,x)\) 比别人牛的个数,然后再减去 \((x,y,z)\) 都比别人牛的个数即可,复杂度 \(O(n\log^2n)\)

然后讲一个脑筋急转弯的做法,我写的是这个做法。考虑竞赛图本质是个啥,其实是描述 \(n\) 个元素的全序关系,那么我们可以直接排个序定出来他们大致的关系,除了有一部分有可能往后能干掉一些人,我们直接枚举 \((x,y),(y,z),(z,x)\) 这三种情况都能往后最远走到哪个点就可以算出连通分量,直接二维偏序即可,复杂度 \(O(n\log n)\)

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;
int n;
struct node {int x, y, z, id, res, rd;inline friend bool operator<(node x, node y) {return ((x.x > y.x) + (x.y > y.y) + (x.z > y.z)) <= 1;}
} x[maxn], y[maxn];
inline bool cmpx(node x, node y) {return x.x < y.x;
}
inline bool cmpid(node x, node y) {return x.id < y.id;
}
int q, p[maxn];
void get_sort(int l, int r) {if(l == r)return ;int mid = l + r >> 1;get_sort(l, mid), get_sort(mid + 1, r);int p1 = l, p2 = mid + 1;for (int i = l; i <= r; i++) {if(p1 <= mid && (p2 > r || x[p1] < x[p2]))y[i] = x[p1++];elsey[i] = x[p2++];}for (int i = l; i <= r; i++)x[i] = y[i];
}
#define lowbit(x) (x & (-x))
struct Tree_array {int tr[maxn];inline void add(int x, int val) {while(x <= n)tr[x] = max(tr[x], val), x += lowbit(x);}inline int query(int x) {int ans = 0;while(x)ans = max(ans, tr[x]), x -= lowbit(x);return ans;}void clear() {for (int i = 1; i <= n; i++)tr[i] = 0;}
} tree;
void get_val() {sort(x + 1, x + n + 1, cmpx);tree.clear();for (int i = 1; i <= n; i++) {tree.add(x[i].y, x[i].id);x[i].res = max(x[i].res, tree.query(x[i].y));}
}
int read() {int sum = 0; char c = getchar();while(!isdigit(c))c = getchar();while(isdigit(c))sum = sum * 10 + c - '0', c = getchar();return sum;
}
int main() {n = read();for (int i = 1; i <= n; i++)x[i].x = read(), x[i].rd = i, x[i].x = n + 1 - x[i].x;for (int i = 1; i <= n; i++)x[i].y = read(), x[i].y = n + 1 - x[i].y;for (int i = 1; i <= n; i++)x[i].z = read(), x[i].z = n + 1 - x[i].z;get_sort(1, n);for (int i = 1; i <= n; i++)x[i].id = i, x[i].res = i;get_val();for (int i = 1; i <= n; i++) {int a = x[i].x, b = x[i].y, c = x[i].z;x[i].x = b, x[i].y = c, x[i].z = a;}get_val();for (int i = 1; i <= n; i++) {int a = x[i].x, b = x[i].y, c = x[i].z;x[i].x = b, x[i].y = c, x[i].z = a;}get_val();int cnt = 1, mx = 1;sort(x + 1, x + n + 1, cmpid);for (int i = 1; i <= n; i++) {//	cout << x[i].x << " " << x[i].y << " " << x[i].z << " " << cnt << " " << x[i].rd << endl;p[x[i].rd] = cnt;mx = max(mx, x[i].res);if(mx == i)cnt++;}q = read();while(q--) {int x = read(), y = read();if(p[x] >= p[y])putchar('T'), putchar('A'), putchar('K');elseputchar('N'), putchar('I'), putchar('E');putchar('\n');}return 0;
}
http://www.jsqmd.com/news/412180/

相关文章:

  • 外包干了9天,技术退步明显。。。。。
  • AI进化史诗:从逻辑机器到硅基大脑,爆了!速收藏揭秘通用智能体诞生秘诀!
  • 震惊!单Agent+Skills竟可取代多Agent系统?深度解析论文,附实验结果,建议收藏!
  • P12801/CF1173L [NERC 2022] Lisas Sequences
  • 14:00面试,15:00就出来了,问的问题过于变态了。。。
  • LangGraph实战:让AI按部就班,老板放心收藏!告别AI乱批款,实现严谨SOP自动审批!
  • 2026年AI Agent必看!技能(Skills)与MCP协同+多智能体系统工程实践(收藏版)
  • 2026.2.25
  • HZTG348 [Violet 6]蒲公英
  • P15445 「IXOI R1」永远在一起!
  • 初学Vim中如何输入指数
  • 孤燕 西安
  • 上海净水器厂家怎么选?专业科普+靠谱供应商推荐 - 小坤哥
  • 搞精益生产,流程管理到底有啥用?
  • 线段树优化DP
  • .NET 11 预览版 1 中的新兴架构演进:RISC-V 与 LoongArch 支持的深度技术解析与生态展望
  • 从月薪12K到19K*14薪!收藏这份程序员转行大模型学习指南,小白也能逆袭!
  • 收藏!AI时代,你的决策速度够快吗?爆款Demo背后的产品管理瓶颈
  • AI 翻书指南:一文读懂检索增强生成(RAG)从入门到实战
  • LangChain的DeepAgents框架:让复杂智能体开发像搭积木一样简单,收藏必备!
  • 告别“画图扯皮”!AI时代产品经理的转型指南:掌握这招,轻松收藏!
  • 太空光伏电池的紫外辐射试验与远紫外试验
  • vllm: kv cache
  • 250_尚硅谷_统计不同类型的字符个数
  • java16进制计算
  • 绍兴净水器代理商怎么选?专业科普+靠谱供应商推荐 - 小坤哥
  • 舆情监测八大功能全盘点:如何精准赋能全场景?
  • 三维偏序
  • SS中的CSRF,passwordEncoder,authenticationProvider,authenticationManager,securityFilterChain几个概念及调用时机
  • mac安装redis_笔记