HPU组队赛J:Ball King(线段树)
时间限制 1 Second 内存限制 512 Mb
题目描述
HPU601球王争霸赛即将举行,ACMER纷纷参加.
现在有n个人报名参赛,每个人都有一个实力值 ai,实力值较大者获胜.
为保证比赛公平,我们定义比赛规则:
第一轮:[1, 2]pk,然后[3, 4]pk...最后[2i − 1, 2i]pk.
第二轮:[1, 2]W inner同[3, 4]W inner进行pk,然后[5, 6]W inner同[7, 8]W inner...
······
第m轮:最后一个W inner.
现在有q次询问,每次询问(u, v),第u轮第v个胜出者的编号?
输入
第一行一个正整数T,代表有T组测试数据. (1 ≤ T ≤ 10)
每组数据第一行输入正整数n, q,接下来n个正整数ai,表示实力值.(1 ≤ n, ai ≤ 2^16)(1 ≤ q ≤ 10)
接下来q行每行两个整数(u, v),询问第u轮第v个胜出者的编号.(0 ≤ u ≤ 16),(1 ≤ v ≤ 2^16)
输入保证每位选手的实力值ai都不相同,且询问合法
输入样例
1
2 2
2 1
0 2
1 1
输出样例
2
1
思路
线段树查询区间内的最大值,第n轮的第v个胜出者所在的区间为,因为每个人的实力值都不相同,所以可以用map标记每个人的实力值所对应的位置,然后套线段树模板就可以了
(数据比较水,比赛的时候因为没有线段树板子,行神好像是用暴力过去了,我忘了代码长啥样了,所以只有超级长的线段树的代码,行神的暴力代码好像只有五十行左右)
AC代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ull unsigned long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
const double E=exp(1);
const int maxn=3e5+10;
const int mod=1e9+7;
using namespace std;
int a[maxn];
int father[maxn];
int MAX;
struct wzy
{
int left,right;
int value;
}node[maxn<<2];
void build(int i,int left,int right)
{
node[i].left=left;
node[i].right=right;
node[i].value=0;
if(left==right)
{
father[left]=i;
return;
}
build(i<<1,left,(right+left)/2);
build((i<<1)+1,(right+left)/2+1,right);
}
void update(int ri)
{
if(ri==1)
return ;
int fi=ri/2;
int l=node[fi<<1].value;
int r=node[(fi<<1)+1].value;
node[fi].value=max(l,r);
update(ri/2);
}
void query(int i,int l,int r)
{
if(node[i].left==l&&node[i].right==r)
{
MAX=max(MAX,node[i].value);
return ;
}
i=i<<1;
if(l<=node[i].right)
{
if(r<=node[i].right)
query(i,l,r);
else
query(i,l,node[i].right);
}
i+=1;
if(r>=node[i].left)
{
if(l>=node[i].left)
query(i,l,r);
else
query(i,node[i].left,r);
}
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int t;
int n,q;
cin>>t;
while(t--)
{
map<int,int>mp;
cin>>n>>q;
MAX=0;//别忘清零......
build(1,1,n);
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]=i;
node[father[i]].value=a[i];
update(father[i]);
}
int x,y;
while(q--)
{
MAX=0;
cin>>x>>y;
int r=(1<<x)*y;
int l=r-(1<<x)+1;
query(1,l,r);
cout<<mp[MAX]<<endl;
}
}
return 0;
}
HPU组队赛J:Ball King(线段树)的更多相关文章
- hdoj 1556 Color the ball【线段树区间更新】
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1199 Color the Ball(离散化线段树)
Color the Ball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和
题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...
- hdu 1556 Color the ball (技巧 || 线段树)
Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Color the ball(线段树)
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- hdu1556 Color the ball 简单线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 简单的线段树的应用 直接贴代码了: 代码: #include<iostream> # ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- 牛客网 中南林业科技大学第十一届程序设计大赛J题 二分+线段树
https://www.nowcoder.com/acm/contest/124#question 题意 找第一个不小于K的数的下标,然后对它前一个数加一 解析 我们可以维护一个最大值数组 1 ...
随机推荐
- python 判断变量是否存在 防止报错
Python判断变量是否存在 方法一:使用try: ... except NameError: .... try: var except NameError: var_exists = False e ...
- MySQL(一) 初识MySQL
数据库基础 数据库是由一批数据构成的有序的集合,这些数据被存放在结构化的数据表里.数据表之间相互联系,反映了客观事物间的本质联系.数据库系统提供对数据的安全控制和完整性控制. 什么是数据库 数据库的发 ...
- centos6.5 安装php-5.6.31
1 从PHP官网下载所需要的PHP版本 下载地址: http://php.net/get/php-5.6.31.tar.gz/from/a/mirror 把下载好的文件上传到服务器 2 安装PHP ...
- day05 可变不可变类型
#可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型#不可变类型:值变了,id也跟着变,证明是生成了新的值而不是在改变原值,原值是不可变 # x=10# print( ...
- do while
do while结构的基本原理和while结构是基本相同的,但是它保证循环体至少被执行一次.因为它是先执行代码,后判断条件,如果条件为真,继续循环.
- EEPROM读写学习笔记与I2C总线(转)
reference:https://www.cnblogs.com/uiojhi/p/7565232.html 无论任何电子产品都会涉及到数据的产生与数据的保存,这个数据可能并不是用来长久保存,只是在 ...
- 阶段01Java基础day10面向对象05
10.01_面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 B:包的概述 C:包的作用 10.02_面向对象(包的定义及注意事项) A:定义包的格 ...
- rnn-nlp-单词预测
import reader import numpy as np import tensorflow as tf # 数据参数 DATA_PATH = 'simple-examples/data/' ...
- 软件开发模式,DevOps
参考文献:http://www.cnblogs.com/jetzhang/p/6068773.html 历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出 ...
- 实力封装:Unity打包AssetBundle(二)
→前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static As ...