蒟蒻想试试莫队,为什么tle呢?按理说分块复杂度再来个map能过去
  • 板块P1816 忠诚
  • 楼主Golden_azy
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/7/23 16:59
  • 上次更新2023/11/3 08:04:10
查看原帖
蒟蒻想试试莫队,为什么tle呢?按理说分块复杂度再来个map能过去
563631
Golden_azy楼主2023/7/23 16:59
#include<bits/stdc++.h>
#define rg register
#define il inline
typedef long long ll;
using namespace std;
ll mod = 1e9+7;
inline ll read() {
	ll ans = 0;
	char last = ' ', ch = getchar();
	while (ch < '0' || ch > '9') last = ch, ch = getchar();
	while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar();
	if (last == '-') return -ans;
	return ans;
}
il ll ksm(ll b,ll k){
	ll res=1;
	while(k){
		if(k&1) res=1ll*res*b%mod;
		b=1ll*b*b%mod;k>>=1;
	}
	return res;
}
int a[100010];
struct node{
	int l;
	int r;
	int id;
	int pos;
}q[100010];
inline bool cmp(node &a,node &b){
	if(a.pos!=b.pos)return a.pos<b.pos;
	else{
		if(a.pos%2){
			return a.r<b.r;
		}
		else return a.r>b.r;
	}
}
int len;
map<int,int>mp;
int cnt[200020];
int ans[200020];
il void add(int x){
//	cout<<"add"<<x<<endl;
	mp[a[x]]++;
}
il void del(int x){
//	cout<<"del"<<x<<endl;
	mp[a[x]]--;
	if(mp[a[x]]==0)mp.erase(a[x]);
}
int main(){
	int n,m;
	n=read();
	m=read();
	for(register int i=1;i<=n;i++){
		a[i]=read();
	}
	len=sqrt(n)+1;
	for(register int i=1;i<=m;i++){
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
		q[i].pos=q[i].l/len;
	}
	sort(q+1,q+n+1,cmp);
	register int l=1;
	register int r=0;
	for(register int i=1;i<=m;i++){
//		cout<<q[i].l<<"===="<<q[i].r<<endl;
		while(q[i].l<l)add(--l);
		while(q[i].r>r)add(++r);
		while(q[i].l>l)del(l++);
		while(q[i].r<r)del(r--);
		for(register auto x:mp){
			ans[q[i].id]=x.first;
//			cout<<x.first<<endl;
			break;
		}
	}
	for(register int i=1;i<=m;i++){
		printf("%d ",ans[i]);
	}
}

2023/7/23 16:59
加载中...