题目来源: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. linux系统时间与网络时间不同步

    在解决问题之前,我们首先来了解下面几个知识点: 1. date命令: #date 显示系统时间 2.hwclock命令   (即hardwareclock系统硬件时间) #hwclock 显示硬件时间 ...

  2. Nginx+keepalived双机热备(默认路径安装)- 基础篇

    负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行.关于负载均衡介绍,可以参考:linux负载 ...

  3. Python爬虫1-----urllib模块

    1.加载urllib模块的request from urllib import request 2.相关函数: (1)urlopen函数:读取网页 webpage=request.urlopen(ur ...

  4. P1265 公路修建 (prim)

    题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一"行路难"的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮 ...

  5. maven的依赖冲突时的原则

    1.如图: 假设上图中的项目B引入了一个junit.jar架包是3.0的版本 项目D引入了一个junit.jar架包是4.0的版本,那么项目X引用的将会是4.0的版本 2.pom.xml排到最前面的架 ...

  6. VS2015 C#取消最大化按钮,设置鼠标不可调整窗体大小

    取消最大化按钮设置  设置窗体不可被鼠标调整大小

  7. WEB服务器(Tomcat)

    在小型的应用系统或有特殊需要的系统中,也可以使用一个免费的Web服务器: Tomcat,该服务器支持全部的JSP以及Servlet 规范, 下载 Tom 查看计算机上被占用端口号的情况: 使用Fpor ...

  8. NEFU 109

    n最大为2000000000(不知为什么OJ上是1000),若为判断2000000000是素数,则必有一个素数在sqrt(n)内,求出这个范围 的所有素数,其比最大数据小的n'的sqrt(n')也在这 ...

  9. 一点一点学架构(四)—Spring.NET错误Cannot Resolve Type……

    背景 在搭建完项目框架之后,当我利用单元測试来測一条线时.出现了下面错误: Cannot resolve type[--]for object with name 'ButtonBll' define ...

  10. linux虚拟机网络设置(本机使用wiff,自己的网)

      一.linux虚拟机网络设置(https://jingyan.baidu.com/album/4e5b3e1957979d91901e24f1.html?picindex=16) 选中虚拟机,点击 ...