T飞,求助
查看原帖
T飞,求助
601236
_WHITE_NIGHT_楼主2023/9/4 10:38

rtrt ,线段树T飞

求助

#include<bits/stdc++.h>
using namespace std;

namespace FastIO
{	
	inline int input()
	{
		int num = 0,f = 1;
		char ch = getchar();
		while(ch < '0' || ch > '9')
		{
			if(ch == '-') f = -1;
			ch = getchar();
		}
		while(ch >= '0' && ch <= '9')
		{
			num = (num << 1) + (num << 3) + (ch ^ 48);
			ch = getchar();
		}
		return num * f;
	}
	
	inline void printNum(int num)
	{
		if(num >= 10) printNum(num / 10);
		putchar(num % 10 + 48);
	}
	
	inline void print(int num,char ch = '\n')
	{
		if(num < 0) putchar('-'),num = -num;
		printNum(num);
		putchar(' ');
		putchar(ch);
	}
}
using FastIO::input;
using FastIO::print;

const int N = 2e5 + 5;
int n,m;
string ipt[N];
map <string,string> mp;

string change(string str)
{
	if(mp.find(str) != mp.end()) return mp[str];
	string tmp = str;
	for(int i = 0;i < str.length();i++)
		if(str[i] >= 'A' && str[i] <= 'Z') str[i] = (str[i] - 'A' + 'a');
	return mp[tmp] = str;
}

string max(string a,string b)
{
	string as = change(a),bs = change(b);
	return as > bs ? a : b;
}

struct SegmentTree
{
    struct node
    {
        int l,r;
        string val;
        #define l(pos) tree[pos].l
        #define r(pos) tree[pos].r
        #define val(pos) tree[pos].val
    }tree[N << 2];

    #define mid(pos) (tree[pos].l + tree[pos].r >> 1)
    #define midn (l + r >> 1)
    void build(int l,int r,int pos)
    {
        l(pos) = l,r(pos) = r;
        if(l == r) {val(pos) = ipt[l];return;}
        build(l,midn,pos*2);
        build(midn+1,r,pos*2+1);
        val(pos) = max(val(pos*2),val(pos*2+1));
    }


    string query(int l,int r,int pos)
    {
        if(l(pos) >= l && r >= r(pos)) return val(pos);
        string ans;
        if(l <= mid(pos)) ans = max(ans,query(l,r,pos*2));
        if(r > mid(pos)) ans = max(ans,query(l,r,pos*2+1));
        return ans;
    }

    #undef l
    #undef r
    #undef tag
    #undef val
    #undef mid
    #undef midn
};

SegmentTree ST;

int main()
{
//	freopen("P1531_1.in","r",stdin);
//	freopen("P1531.out","w",stdout);
    n = input(),m = input();
    for(int i = 1;i <= n;i++)
        cin >> ipt[i];
    
    ST.build(1,n,1);
    for(int i = 1;i <= m;i++)
    {
    	int a = input(),b = input();
        cout << ST.query(a,b,1) << endl;
    }
}
2023/9/4 10:38
加载中...