显然这道题用离线算法即可,那自然就想到莫队啦。
然后二话不说开始写莫队代码,结果写到del
函数的时候突然脑子一抽,想不到怎么在del
的同时维护区间最大值了......
写了一半的恶臭莫队代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAXN (50005)
using namespace std;
int n,m,sq;
string a[MAXN];
string now="";
int f[MAXN];
struct node{
int l,r,id;
}q[MAXN];
bool cmp(node a,node b){
return (f[a.l]^f[b.l])?f[a.l]<f[b.l]:((f[a.l]&1)?a.r<b.r:a.r>b.r);
}
void add(int pos){
if(a[pos]>now){
now=a[pos];
}
}
void del(int pos){
//并没有想好怎么写
}
inline int read(){
int x=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
w=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch-'0');
ch=getchar();
}
return x*w;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
n=read(),m=read();
sq=sqrt(n);
for(int i=1;i<=n;i++){
f[i]=(i-1)/sq+1;
cin>>a[i];
}
for(int i=1;i<=m;i++){
q[i].l=read(),q[i].r=read();
q[i].id=i;
}
sort(q+1,q+n+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
while(l<q[i].l)del(l++);
while(l>q[i].l)add(--l);
while(r<q[i].r)add(++r);
while(r>q[i].r)del(r--);
//后面全咕了
}
return 0;
}