luogu P2412 【查单词】

这题我首先想到把字符串离散化成区间 [1,n][1,n] 的整数,然后放进线段树里做区间最值就好了。

  • 唯一一个我被坑的点,就是我把字典序理解错了,是忽略大小写再排序(如果有解释错误麻烦dalao更正),结果就cmp函数就直接排序了,导致交了几遍才过。

所以,读题很关键!!!

有不会线段树的同学可以去自学一下QAQ。

Code:

#include
#include
#include
#include
using namespace std;
inline int read(){
    register int x=0,v=1,ch=getchar();
    while(!isdigit(ch)){if(ch=='-')v=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();}
    return x*v;
}
const int MAX=50005;
int n,m,op[MAX];
struct Node{
    string s;
    int p,t;//分别表示原来的位置和字典序排名
}a[MAX];

//两个cmp过程,第一个是获取字典序的排名,第二个是将序列还原

inline bool cmp(Node x,Node y){return x.sb?a:b;
}

//以下至58行是线段树的过程

inline void pushup(int x){
    tree[x]=Max(tree[x<<1],tree[x<<1|1]);
}
void build(int x,int l,int r){
    if(l==r){
        tree[x]=a[l].t;
        return ;
    }
    register int mid=l+r>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
int query(int x,int l,int r,int s,int t){
    if(s<=l&&r<=t)return tree[x];
    register int mid=l+r>>1,res=-0x7fffffff;
    if(s<=mid)res=Max(res,query(x<<1,l,mid,s,t));
    if(mid>a[i].s;
        c[i]=a[i].s;
        a[i].p=i;   
    }
    for(register int i=1;i<=n;++i){//字典序大小转换
        for(register int j=0;j 
 

  

你可能感兴趣的:(luogu P2412 【查单词】)