【XSY2892】【GDSOI2018】谁是冠军
题目来源:noi2018模拟测试赛(二十三)T3 san
为什么noi模拟赛里会做到省选原题啊……
题意:
Description
有n个人,简单起见把他们编号为1到n,每个人有三项指标分别是攻击力,防御力和血量。现在要进行n-1场比赛,每次在剩下的人里面随机地选出两个人进行比赛,当一个人有大于等于两项指标严格大于另一个人时,这个人获得胜利。每次比赛,胜者留下,败者淘汰。
现在请你求出所有可能成为冠军(留到最后)的人。
Input
第1行有一个整数n,表示人数为n。
接下来n行,每行有三个整数$a_i,b_i,c_i$分别表示编号为i的人的攻击力,防御力和血量。
数据保证对于任意两个人的同一项指标值不会相同。
Output
按编号从小到大输出有可能成为冠军的人的编号,每行输出一个数。
Hint
对于$60\%$的数据$1\leq n\leq 5000$
对于$100\%$的数据$1\leq n\leq 100000$
题解:
首先60分很简单,暴力建图,即如果x能胜y就从x到y建有向边,最后从每个点出发看能否遍历整个图就好了;
也可以tarjan缩点之后直接找入度为0的联通块,块内的点就是答案;
但这样做依然是$O(n^2)$的,复杂度瓶颈在于边数是$O(n^2)$的,因此很容易想到线段树优化建图;
由于他的要求是至少两维小于,所以可以两两拆开来做三遍;
那么先把第一维排序,第二维离散化后开一颗权值线段树,新加入一个点i就将它连向权值在$[1,i的第二维权值-1]$内的区间;
这样子做一个点最多只会连向$O(logn)$个区间,所以能过;
注意修改具有时效性,所以要边加边连,具体见代码。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
typedef double db;
struct edge{
int v,next;
}a[];
struct uni{
int a,b,c,id;
}p[];
struct node{
int ls,rs,v;
}t[];
int n,tot=,tid=,bcc=,tim=,cnt,rt,dfn[],low[],blg[],head[];
int ans[],anss=;
stack<int>s;
bool cmp(uni a,uni b){
return a.a<b.a;
}
bool _cmp(uni a,uni b){
return a.b<b.b;
}
void add(int u,int v){
//printf("Added %d %d\n",u,v);
a[++tot].v=v;
a[tot].next=head[u];
head[u]=tot;
}
void build(int &u,int l,int r){
u=++cnt;
t[u].v=;
if(l==r)return;
int mid=(l+r)/;
build(t[u].ls,l,mid);
build(t[u].rs,mid+,r);
}
void updata(int u,int l,int r,int p,int x){
if(l==r){
t[u].v=x;
return;
}
int mid=(l+r)/;
if(p<=mid)updata(t[u].ls,l,mid,p,x);
else updata(t[u].rs,mid+,r,p,x);
if(t[t[u].ls].v&&t[t[u].rs].v){
t[u].v=++tid;
add(tid,t[t[u].ls].v);
add(tid,t[t[u].rs].v);
}else t[u].v=t[t[u].ls].v+t[t[u].rs].v;
}
void query(int u,int l,int r,int L,int R,int id){
if(!t[u].v)return;
if(l==L&&r==R){
add(id,t[u].v);
return;
}
int mid=(l+r)/;
if(L<=mid)query(t[u].ls,l,mid,L,min(mid,R),id);
if(mid<R)query(t[u].rs,mid+,r,max(mid+,L),R,id);
}
void link(){
sort(p+,p+n+,cmp);
cnt=;
build(rt,,n);
//puts("----12----");
for(int i=;i<=n;i++){
query(rt,,n,,p[i].b-,p[i].id);
updata(rt,,n,p[i].b,p[i].id);
}
cnt=;
build(rt,,n);
//puts("----13----");
for(int i=;i<=n;i++){
query(rt,,n,,p[i].c-,p[i].id);
updata(rt,,n,p[i].c,p[i].id);
}
sort(p+,p+n+,_cmp);
cnt=;
build(rt,,n);
//puts("----23----");
for(int i=;i<=n;i++){
query(rt,,n,,p[i].c-,p[i].id);
updata(rt,,n,p[i].c,p[i].id);
}
}
void tarjan(int u){
dfn[u]=low[u]=++tim;
s.push(u);
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!blg[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
blg[u]=++bcc;
int nw=s.top();
while(nw!=u){
nw=s.top();
blg[nw]=bcc;
s.pop();
}
}
}
int main(){
memset(head,-,sizeof(head));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
p[i].id=i;
}
tid=n;
link();
for(int i=;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=;i<=n;i++){
if(blg[i]==bcc)ans[++anss]=i;
}
for(int i=;i<=anss;i++){
printf("%d\n",ans[i]);
}
return ;
}
【XSY2892】【GDSOI2018】谁是冠军的更多相关文章
- C语言之基本算法12—谁是冠军
/* ================================================================== 题目:甲乙丙丁四人猜A,B,C,D,E,F6个人谁是冠军,甲 ...
- HDU 2094产生冠军(set思维题)
Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能 ...
- 不熟,不会,未a的题列表
不熟: jzoj5968. 电竞选手(不知道公式如何得来) jzoj4877. [NOIP2016提高A组集训第10场11.8]力场护盾 (对向量不熟悉,不知道为什么结果要取反) jzoj4867. ...
- jQuery的DOM操作之捕获和设置
.html()--获取或设置目标元素内的全部内容,包括html的标签及属性在内: .text()--仅获取或设置目标元素内的文本内容. .val()--获取输入框的值: .attr()--获取或设置目 ...
- python机器学习(四)分类算法-决策树
一.决策树的原理 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法 . 二.决策树的现实案例 相亲 相亲决策树 ...
- 产生冠军 hdoj_2094 巧用set
产生冠军 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录
第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...
- 【BZOJ-2768】冠军调查 最小割
2768: [JLOI2010]冠军调查 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 971 Solved: 661[Submit][Status ...
- java 练手 谁是最好的Coder
Problem A 谁是最好的Coder 时间限制:1000 ms | 内存限制:65535 KB 描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所 ...
随机推荐
- [2018.8.12]模拟赛B组
T1 打表出奇迹,发现结论为\(E(a_n)=n+1\)即可. #include <iostream> #include <cstdio> #include <cctyp ...
- mplayer configure选项中文注释
mplayer configure选项中文注释(MPlayer-1.0rc2) http://blogold.chinaunix.net/u3/104581/showart_2322466.html ...
- Nginx 安装配置证书,设置HTTPS站点
详细配置如下: server { listen 80; server_name shwww.net www.shwww.net; return 301 https://www.shwww.net$re ...
- jQuery scrollFix滚动定位插件
[插件功能] 当用户向上或向下滚动页面到一定位置时,目标元素开始固定定位(position:fixed),当回滚到原位置时目标元素恢复到原状态,可以定制触发滚动相对屏幕位置和触发滚动方向,兼容IE6 ...
- 【codeforces 727D】T-shirts Distribution
[题目链接]:http://codeforces.com/problemset/problem/727/D [题意] 给你6种尺寸的衣服; 他们的尺码依次为S, M, L, XL, XXL, XXXL ...
- 2015 Multi-University Training Contest 6 hdu 5357 Easy Sequence
Easy Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 0111MySQL优化的奇技淫巧之STRAIGHT_JOIN
转自博客http://huoding.com/2013/06/04/261 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* F ...
- C#中的Socket
];//用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//本机预使用 ...
- 香蕉派 Banana pi BPI-M2 四核开源单板计算机.
Banana PI BPI-M2 是一款四核高性能单板计算机,Banana PI BPI-M2是一款比树莓派更强悍的四核Android4.4产品. Banana PI BPI-M2兼容性强大,能 ...
- OJ刷题---手机尾号评分
题目要求: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dis ...