数据结构(脑洞题,BIT):COGS 2394. 比赛
比赛
时间限制:1 s
内存限制:256 MB
【题目描述】
n(n≤100000)个人编号为0到n-1,每人都有一个能力值,大小在0到n-1之间,各不相同,他们之间有c场比赛,每场比赛指定一个区间
[l,r],当前第l个到第r个中能力值最大的获胜,其他的都被淘汰,不再出现在候选之列,现在你是n个人中的一个,也要参加这比赛,但你可以选择已经排
好的n-1人之间的n个位置中的一个进行插入,使得自己赢的场数最多,输出最小的位置。
【输入格式】
第一行三个数n c k,k是你的能力值。
接下来n-1行表示前n-1个人的能力值。
最后c行表示比赛,保证比赛合法。
【输出格式】
一行即答案。
【样例输入】
5 3 3
1
0
2
4
1 3
0 1
0 1
【样例输出】
1
这道题,发现对于一个比赛,求出其实际上对应的人分别是哪些,假想每个人自己一个人比赛一次,再考虑对于比赛建树,一个A节点是另一个节点B的子节点仅当A的最强者参加了比赛B,维护胜利者的能力值。假设要参加某场比赛,那么发现这场比赛中最后一个人被挤出去了,所以对于树中节点不统计最后那个人的信息,但在整合子树时考虑。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
int bit[maxn],N,fa[maxn];
int a[maxn],Max[maxn];
int ID[maxn],dp[maxn];
int L[maxn],R[maxn];
int n,c,k; void Add(int x,int d){
while(x<=N){
bit[x]+=d;
x+=x&(-x);
}
} int Pos(int k){
int p=;
for(int i=N;i;i>>=)
if(bit[p+(i>>)]<k)
k-=bit[p+=i>>];
return p+;
} int main(){
freopen("competition.in","r",stdin);
freopen("competition.out","w",stdout);
scanf("%d%d%d",&n,&c,&k);
for(N=;N<=n;N<<=);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
Add(i,);ID[i]=i;
L[i]=R[i]=i;
}Add(n+,);
for(int i=,l,r;i<=c;i++){
scanf("%d%d",&l,&r);l++,r++;
L[n+i]=Pos(l);R[n+i]=Pos(r+)-;
for(int j=l;j<=r;j++){
int x=ID[Pos(j)];fa[x]=n+i;
Max[n+i]=max(Max[n+i],Max[x]);
if(j!=r)Max[n+i]=max(Max[n+i],a[R[x]]);
}
ID[L[n+i]]=n+i;
for(int j=r;j>l;j--)
Add(Pos(j),-);
} for(int i=c;i>=;i--)
dp[n+i]=Max[n+i]<k?dp[fa[n+i]]+:; int M=,p=;
for(int i=;i<=n;i++)
if(dp[fa[i]]>M)
M=dp[fa[i]],p=i;
printf("%d\n",p-);
return ;
}
数据结构(脑洞题,BIT):COGS 2394. 比赛的更多相关文章
- 图论(KM算法,脑洞题):HNOI 2014 画框(frame)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABPoAAANFCAIAAABtIwXVAAAgAElEQVR4nOydeVxTV/r/n9ertaJEC4
- Python小白的数学建模课-A1.2021年数维杯C题(运动会优化比赛模式探索)探讨
Python小白的数学建模课 A1-2021年数维杯C题(运动会优化比赛模式探索)探讨. 运动会优化比赛模式问题,是公平分配问题 『Python小白的数学建模课 @ Youcans』带你从数模小白成为 ...
- 数据结构(主席树):COGS 2211. 谈笑风生
2211. 谈笑风生 ★★★★ 输入文件:laugh.in 输出文件:laugh.out 简单对比时间限制:3 s 内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下 ...
- Poj3484-Showstopper(二分脑洞题)
Description Data-mining huge data sets can be a painful and long lasting process if we are not aware ...
- [LOJ 6270]数据结构板子题
Description 有n个区间,第i个区间是[li,ri],它的长度是ri−li. 有q个询问,每个询问给定L,R,K,询问被[L,R]包含的且长度不小于K的区间数量. 你想,像这种板子题,你随手 ...
- 2019/4/22 拓扑排序的高效写法. 模板题HDU1285:确定比赛名次
传送门 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现 ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
- LOJ #6270. 数据结构板子题 (离线+树状数组)
题意 有 \(n\) 个区间,第 \(i\) 个区间是 \([l_i,r_i]\) ,它的长度是 \(r_i-l_i\) . 有 \(q\) 个询问,每个询问给定 \(L,R,K\) ,询问被 \([ ...
- UVA 5986 - Wizarding Duel 超级脑洞题
给出n个人,每个人两两比赛一场,一共有C(n,2)场比赛,现在给出一个榜,问其是否合法.不合法的话,就改成合法,输出最小需要改的变化. 分数一定是C(n,2)的了, 不和法的情况,比如0,0,2,是不 ...
随机推荐
- 树形dp练习
/*poj 1463 最小点覆盖 匈牙利*/ #include<iostream> #include<cstdio> #include<cstring> #defi ...
- 如何通过WiFi来进行Android的真机模拟
我们知道,在使用模拟机模拟的时候会出现较多的问题,所以如果有一部Android手机的话进行真机模拟是极好的. 准备工作: 第一种方法:使用数据线,具体操作百度.略(非WIFI操作的真机模拟) 第二方法 ...
- Oracle分区表学习
(1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应 ...
- basicAnimation移动图形
目的:采用CABasicAnimation 点击屏幕上的点来是实现图像的位置移动 并且位置能够不反弹 难点:1 通过动画的KeyPath找到layer的属性 2 通过NSValue将点包装成对象 ...
- Syntax error on token "package", assert expected------踩坑记录
今天写程序碰到个坑,eclipse编辑,jdk1.7,clean编译项目后报错Syntax error on token "package", assert expected 反复 ...
- Java循环性能随笔
for iterator做迭代循环性能最好 然后是foreach 然后是提前声明好变量的for循环 最后是每次都要计算集合size的for package test; import j ...
- SetTimer 和 OnTimer 的使用
最近在公司做一个MFC项目,因为是MFC新手,所以在这里记录一些最近用到和学到的东西留着以后查阅. 今天遇到的一个问题是要在窗口刚刚初始化完成时自动检测一个配置文件是否存在(实际上就是检测是不是首次登 ...
- Prototype 模式
Prototype 模式提供了一个通过已存在对象进行新对象创建的接口(Clone) ,Clone()实现和具体的实现语言相关,在 C++中我们将通过拷贝构造函数实现之. /////////////// ...
- 在O(1)时间删除链表结点
//给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 1 struct ListNode //结点结构 { int m_nValue; ListNode* m_pNext; ...
- C#DataTable操作
] 在DataSet中添加DataTable DataSet.Tables.Add(DataTable) 实例: DataSet ds=new DataSet(); DataTable table=n ...