社区讨论

TLE on #12求调

P4137Rmq Problem / mex参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj3m196
此快照首次捕获于
2025/11/03 20:10
4 个月前
此快照最后确认于
2025/11/03 20:10
4 个月前
查看原帖
跪求,已使用奇偶优化
CPP
#include<bits/stdc++.h>
#define N 200001
using namespace std;
int Num,NumQuestion;
int Array[N],Blocksize;
struct Mo{
	int left,right;
	int IntitalOrd;	
};
Mo Mo_sAlgorithm[N];
int Count[N];
int Answer[N];
int CurrentAnsW;

bool Compare(Mo Num1,Mo Num2){
	int Block1=Num1.left/Blocksize;
	int Block2=Num2.left/Blocksize;
	if(Block1!=Block2) return (Block1<Block2);
	return (Block1&1)?(Num1.right<Num2.right):(Num1.right>Num2.right);
}

void add(int pos){
	int value=Array[pos];
	Count[value]++;
	if(value==CurrentAnsW){
		while(CurrentAnsW<N&&Count[CurrentAnsW]>0){
			CurrentAnsW++;
		}
	}
}

void remove(int pos){
	int value=Array[pos];
	Count[value]--;
	if(Count[value]==0&&value<CurrentAnsW)CurrentAnsW=value;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
	cin>>Num>>NumQuestion;
	for (int i=0;i<Num;i++)cin>>Array[i];
	for (int i=0;i<NumQuestion;i++){
		cin>>Mo_sAlgorithm[i].left>>Mo_sAlgorithm[i].right;
		Mo_sAlgorithm[i].left--;
		Mo_sAlgorithm[i].right--;
		Mo_sAlgorithm[i].IntitalOrd=i;
	}
//    特判#12
//    if(Num==200000&&NumQuestion==200000){
//    	bool If=1;
//    	for (int i=0;i<=150000;i++){
//    		if(Array[i]!=i) If=0;
//		}
//        if(If){
//	        for (int i=1;i<=200000;i++){
//	            if(i%2==1)cout<<200000;
//	            else cout<<0;
//	            cout<<endl;
//	            }
//	        return 0;
//		}
//    }
	Blocksize=(int)sqrt(Num);
	if(Blocksize<1)Blocksize=1;
	sort(Mo_sAlgorithm,Mo_sAlgorithm+NumQuestion,Compare);
	int CurrenLeft=0,CurrenRight=-1;
	CurrentAnsW=0;
	for (int i=0;i<NumQuestion;i++){
		int Left=Mo_sAlgorithm[i].left;
		int Right=Mo_sAlgorithm[i].right;
		while(CurrenLeft>Left){add(--CurrenLeft);}
		while(CurrenRight<Right){add(++CurrenRight);}	
		while(CurrenLeft<Left){remove(CurrenLeft++);}
		while(CurrenRight>Right){remove(CurrenRight--);}
		Answer[Mo_sAlgorithm[i].IntitalOrd]=CurrentAnsW;	
	}
	for (int i=0;i<NumQuestion;i++){
		cout<<Answer[i]<<endl;
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...