树状数组 WA 第二个点 90分求助
查看原帖
树状数组 WA 第二个点 90分求助
826774
Little_Fox_Fairy楼主2024/7/9 07:40

WA 了第二个点。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#define int long long
#define endl putchar('\n')
#define pii pair<int,int>
using namespace std;
const int N=3e5+10;
struct node {int v,id;}e[N];
struct edge {int l,r,id;}s[N];
struct Tree_Array
{
	int n,t[N];
	int lowbit(int x)
	{
		return x&(-x);
	}
	void update(int x,int k)
	{
		for (;x<=n;x+=lowbit(x))
			t[x]+=k;
		return ;
	}
	int query(int x)
	{
		int tot=0;
		for (;x;x-=lowbit(x))
			tot+=t[x];
		return tot;
	}
}tr;
char eof_flag;inline char read(int*s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}

int n,m;
int num,sum[N],ans;
vector<pii> good;
inline bool operator <(const edge &x,const edge &y) {return x.l<y.l;}
inline bool operator <(const node &x,const node &y) {return x.v<y.v;}
inline void add(int x,int y)
{
	if (x>y) swap(x,y);
	good.push_back({x,y});
	return ;
}
signed main()
{
	read(&n),read(&m);
	tr.n=n;
	for (register int i=1;i<=n;i++) read(&e[i].v),e[i].id=i;
	sort(e+1,e+n+1);
	add(e[1].id,e[2].id),add(e[n].id,e[n-1].id);
	for (int i=2;i<=n-1;i++)
	{
		if (abs(e[i].v-e[i-1].v)==abs(e[i].v-e[i+1].v))
		{
			add(e[i].id,e[i-1].id);
			add(e[i].id,e[i+1].id);
		}
		if (abs(e[i].v-e[i-1].v)<abs(e[i].v-e[i+1].v)) add(e[i].id,e[i-1].id);
		if (abs(e[i].v-e[i-1].v)>abs(e[i].v-e[i+1].v)) add(e[i].id,e[i+1].id);
	}
	sort(good.begin(),good.end());
	num=good.size()-1;
	for (int i=1;i<=m;i++) read(&s[i].l),read(&s[i].r),s[i].id=i;
	sort(s+1,s+m+1);
	for (int i=m;i>=1;i--)
	{
		while (good[num].first>=s[i].l)
		{
			tr.update(good[num].second,1);
			num--;
		}
		sum[s[i].id]=tr.query(s[i].r);
	}
	for (int i=1;i<=m;i++) ans+=sum[i]*i;
	write(ans),endl;
	return 0;
}
2024/7/9 07:40
加载中...