• 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;
    }
  • 相关阅读:
    批量数据导入数据库方法
    Remoting简单实践
    js面向对象继承
    Linq实现t-Sql的各种连接
    数据库树状结构的关系表的删除方案
    记录一次SQL查询语句
    mvc请求过程总结
    T-sql表表达式
    各个浏览器的兼容问题及样式兼容处理(不定期补充)
    vue.js 键盘enter事件的使用
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324373.html
Copyright © 2020-2023  润新知