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个胜出者所在的区间为[2^{n}*v-2^{n}+1,2^{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;
}

 

posted @ 2018-08-28 21:32  友人-A  阅读(111)  评论(0编辑  收藏  举报