代码是正解,为什么全是TLE?
查看原帖
代码是正解,为什么全是TLE?
126972
Kevinx楼主2024/11/12 16:30

TLE

#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool st;
const int N = 6e5 + 5; 
ll n, m, tr[N<<2], ans = 0, cnt = 0;
struct node{
	ll val, pos;
}a[N];
struct py{
	ll l , r, id;
}q[N], b[N];
bool cmp1(py a, py b){return a.r < b.r;}
bool cmp(node x, node y){return x.val < y.val;}
ll lowbit(ll x){return x&(-x);}
void add(ll x, ll k) {for(int i = x; i <= n; i += lowbit(i)) tr[i]+=k; return;}
ll query(ll x) {ll ans = 0; for(int i = x; i > 0; i -= lowbit(i)) ans+=tr[i]; return ans;}
ll add_(ll l, ll r) {if(l > r) swap(l, r); b[++cnt] = (py){l, r, 0};}

bool ed;
int main() {
	scanf("%lld%lld", &n, &m);
	if(n == 1) {
		puts("0");
		return 0;
	} 
	for(int i = 1; i <= n; i++) {
		scanf("%lld", &a[i].val);
		a[i].pos = i;
	}
	sort(a+1, a+n+1, cmp);
	for(int i = 1; i <= n; i++) {
		if(i == 1) add_(a[i].pos, a[i+1].pos);
		if(i == n) add_(a[i].pos, a[i-1].pos);
		if(1 < i && i < n) {
			if(abs(a[i].val-a[i+1].val) <  abs(a[i].val-a[i-1].val)) add_(a[i].pos, a[i+1].pos);
			if(abs(a[i].val-a[i+1].val) == abs(a[i].val-a[i-1].val)) add_(a[i].pos, a[i+1].pos), add_(a[i].pos, a[i-1].pos);
			if(abs(a[i].val-a[i+1].val) >  abs(a[i].val-a[i-1].val)) add_(a[i].pos, a[i-1].pos);
		}
	}
	
	for(int i = 1; i <= m; i++) {
		ll l, r;
		scanf("%lld%lld", &l, &r);
		if(l > r) swap(l, r);
		q[i] = (py){l, r, i};
		
	}
	sort(b+1, b+cnt+1, cmp1);
	sort(q+1, q+m+1, cmp1);
	ll j = 1;
	for(int i = 1; i<= m; i++) {
		while(j <= cnt && b[j].r <= q[i].r && cnt!=0) add(b[j].l, 1), j++;
		ll l = q[i].l, r = q[i].r;
		ll sum = query(r)-query(l-1);
		ans += sum*q[i].id;
//		cout << sum << endl;
	}
	printf("%lld", ans);
	return 0;
}
/*
6 2
2 1 3 8 9 4
2 5
3 4
*/
2024/11/12 16:30
加载中...