用莫队做的,求助QwQ
  • 板块P2412 查单词
  • 楼主云浅知处はなび
  • 当前回复15
  • 已保存回复15
  • 发布时间2020/6/13 12:57
  • 上次更新2023/11/7 00:45:27
查看原帖
用莫队做的,求助QwQ
307453
云浅知处はなび楼主2020/6/13 12:57

显然这道题用离线算法即可,那自然就想到莫队啦。

然后二话不说开始写莫队代码,结果写到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;
}
2020/6/13 12:57
加载中...