求条壶关
查看原帖
求条壶关
1137574
qwqawaer楼主2024/11/18 20:47

写红温了,只知道自己预处理有误,但不知道怎么调

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
struct Node{
	int l,r,id;
}q[N];
int n,m,a[N],bl,l,r,b[N],sum,s,tot;
pair<int,int> h[N];
map<pair<int,int>,int> vis;
/*
*/
bool cmp(const Node &a,const Node &b){
	return (a.l/bl==b.l/bl)?a.r<b.r:a.l<b.l;
}
void add(int x){
	vis[h[a[x]]]++;
	if(vis[h[a[x]]]==1){
		s++;
	}
}
void del(int x){
	vis[h[a[x]]]--;
	if(vis[h[a[x]]]==0){
		s--;
	}
}
signed main(){
	cin>>n>>m;
	bl=pow(n,2.0/3.0);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(b+1,b+n+1,a[i])-b;
		//cout<<a[i]<<endl;
	}
	h[++tot]={a[1],a[2]},h[++tot]={a[n],a[n-1]};
//	h[a[1]].l=a[2],h[a[n]].l=a[n-1];
	for(int i=1;i<=n;i++){
		if(b[a[i]]-b[a[i-1]]<b[a[i+1]]-b[a[i]]){
			h[++tot]={a[i],a[i-1]};
		//	h[a[i]].l=a[i-1];
		}else if(b[a[i]]-b[a[i-1]]==b[a[i+1]]-b[a[i]]){
			h[++tot]={a[i],a[i-1]};
			h[++tot]={a[i],a[i+1]};
//			h[a[i]].l=a[i-1];
//			h[a[i]].r=a[i+1];
		}else {
			h[++tot]={a[i],a[i+1]};
//			h[a[i]].l=a[i+1];
		}
	}
//	for(int i=1;i<=n;i++){
//		cout<<a[i]<<" to "<<h[a[i]]<<endl;
//	}
	for(int i=1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	int cl=1,cr=0;
	for(int i=1;i<=m;i++){
		int l=q[i].l,r=q[i].r;
		while(cl<l)del(cl++);
		while(cl>l)add(--cl);
		while(cr<r)add(++cr);
		while(cr>r)del(cr--);
		//cout<<cl<<" "<<cr<<endl;
		sum+=q[i].id*s;
		//cout<<q[i].id<<" ";
	}
	cout<<sum<<endl;
	return 0;
}
2024/11/18 20:47
加载中...