题目来源: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】谁是冠军的更多相关文章

  1. C语言之基本算法12—谁是冠军

    /* ================================================================== 题目:甲乙丙丁四人猜A,B,C,D,E,F6个人谁是冠军,甲 ...

  2. HDU 2094产生冠军(set思维题)

    Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能 ...

  3. 不熟,不会,未a的题列表

    不熟: jzoj5968. 电竞选手(不知道公式如何得来) jzoj4877. [NOIP2016提高A组集训第10场11.8]力场护盾 (对向量不熟悉,不知道为什么结果要取反) jzoj4867. ...

  4. jQuery的DOM操作之捕获和设置

    .html()--获取或设置目标元素内的全部内容,包括html的标签及属性在内: .text()--仅获取或设置目标元素内的文本内容. .val()--获取输入框的值: .attr()--获取或设置目 ...

  5. python机器学习(四)分类算法-决策树

      一.决策树的原理 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法 . 二.决策树的现实案例 相亲   相亲决策树 ...

  6. 产生冠军 hdoj_2094 巧用set

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  8. 【BZOJ-2768】冠军调查 最小割

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 971  Solved: 661[Submit][Status ...

  9. java 练手 谁是最好的Coder

    Problem A 谁是最好的Coder 时间限制:1000 ms  |  内存限制:65535 KB   描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所 ...

随机推荐

  1. struct timeval和gettimeofday

    struct timeval和gettimeofday() struct timeval结构体在time.h中的定义为: struct timeval { time_t tv_sec; /* Seco ...

  2. 数据结构(5) 第五天 快速排序、归并排序、堆排序、高级数据结构介绍:平衡二叉树、红黑树、B/B+树

    01 上次课程回顾 希尔排序 又叫减少增量排序 increasement = increasement / 3 + 1 02 快速排序思想 思想: 分治法 + 挖坑填数 分治法: 大问题分解成各个小问 ...

  3. json字符串通俗的介绍

    json 的本质就是字符串,按key:value这种键值对的格式定义的字符串 json就是传递javascript对象的语法,json只有两种结构,对象和数组,这两种结构嵌套和组合,来表示各种各样的数 ...

  4. php多维数组的指定单个字段排序

    多维数组如何根据指定键值?比如现在有数组结构如下: ,,,,,'subject' => 'math'), 1 => array('name' => '3班','avgScore'=& ...

  5. POJ2406A- Power Strings

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  6. Spring知识梳理

    Spring框架介绍 Spring是一个贯穿各层为javaEE提供一站式解决方案的框架,Spring中主要有容器模块,AOP模块,ORM和DAO模块,Web模块等等,具体有以下功能特征. IOC(或者 ...

  7. 酒店管理系统(功能结构图、E-R图、用例图)

    功能结构图 用例图 状态图 流程图 数据字典 er图

  8. PHP开发实战权威指南-读书总结

    从今年开始,断断续续学习PHP已经有4个月了.最初,认真学习PHP几天,就弄WordPress搭建了一个个人博客,这也符合技术人的实践理念. 最近,重温PHP开发实战权威指南,做点总结,整理下自己学习 ...

  9. VirtualBox安装kali linux过程及安装后无法全屏问题解决方法(2)

    ? 1   安装说完了,现在来看看怎么全屏吧,虚拟机无法全屏跟咸鱼有什么区别... 首先打开vbox,选择设备(Device)选项里面最下面安装增强工具那个选项(insert guest additi ...

  10. ie6 bug 收集

    1.IE6中奇数宽高的BUG IE6下查看,变成了right:1px的效果了: IE6还有奇数宽高的bug,解决方案就是将外部相对定位的div宽度改成偶数.高度也是一样的查看源码: CSS代码: #o ...