只有最后两个点WA了,找不出错,求助
查看原帖
只有最后两个点WA了,找不出错,求助
215590
Ckger楼主2024/7/20 16:29

有没有大佬看看,或者提供一下错误原因的可能性?实在是找不出了。

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int maxn = 500010, maxv = 100010;

inline int read()
{
	int x = 0; char c = getchar();
	while (!isdigit(c)) c = getchar();
	while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
	return x;
}

int n, m;
int a[maxn], bl[maxn];
int len;

struct tr
{
	int ss[maxn];
	#define lowbit(x) (x & -x)
	void add(int x, int k) {
		while (x <= maxv)
			ss[x] += k, x += lowbit(x);
	}
	inline int ask(int x) 
	{
		int ans = 0;
		for (; x; ans += ss[x], x -= lowbit(x));
		return ans;
	}
	void clear() {
		for (int i = 0; i <= maxv; ++i) ss[i]=0;
	}
}T1, T2, T3;

struct ques
{
	int ql, qr;
	int id;
	
	bool operator < (const ques &a) {
		return (bl[ql] == bl[a.ql]) ? qr < a.qr : ql < a.ql;
	}
}q[maxn];

int t[maxn], pref[maxn];

const int sq = sqrt(maxv);
int tot;

inline void init()
{
	n = read(), m = read();
	T3.clear();
	for (int i = 1; i <= n; ++i) a[i] = read(), T3.add(i, a[i]);
	for (int i = 1; i <= m; ++i)
		q[i].ql = read(), q[i].qr = read(), q[i].id = i;
	len = sqrt(n);
	for (int i = 1; i <= n; ++i) bl[i] = i / len + 1;
	sort(q + 1, q + 1 + m);
	T1.clear();
	T2.clear();
	int sum = 0;
	for (int i = 1; i <= n; ++i)
	{
		pref[i] = pref[i - 1] + (T1.ask(a[i] - 1)) * a[i] + sum - T2.ask(a[i]);
		T1.add(a[i], 1);
		T2.add(a[i], a[i]);
		sum += a[i];
	}
//	for (int i = 2; i <= n; ++i) pref[i] -= pref[1];
//	pref[1] = 0;
//	for (int i = 1; i <= n; ++i) cout<<pref[i]<<" ";
//	cout<<endl;
}

struct node
{
	int l, r, opt;
	int id;
	node(int OPT, int L, int R, int ID) { opt = OPT, l = L, r = R, id = ID; }
};

int ans[maxn], rk[maxn];
vector<node> ch[maxn];
int ct[maxn], sol[maxn];

inline void solve()
{
	int fr = 1, ed = 0;
	for (int i = 1; i <= m; ++i)
	{
		int l = q[i].ql, r = q[i].qr, res = 0;
//		cout<<"rk = "<<i<<" l = "<<l<<" r = "<<r<<endl;
		rk[q[i].id] = i;
		if (ed > r) res -= pref[ed] - pref[r], ++ct[fr - 1], ch[fr - 1].push_back(node( 1, r + 1, ed, q[i].id)), ed = r;
		if (ed < r) res += pref[r] - pref[ed], ++ct[fr - 1], ch[fr - 1].push_back(node(-1, ed + 1, r, q[i].id)), ed = r;
		if (fr > l) res -= pref[fr - 1] - pref[l - 1], ++ct[r], ch[r].push_back(node( 1, l, fr - 1, q[i].id)), fr = l;
		if (fr < l) res += pref[l - 1] - pref[fr - 1], ++ct[r], ch[r].push_back(node(-1, fr, l - 1, q[i].id)), fr = l;
		sol[i] = res;
	}
//	cout<<"after solve, sol:\n";
//	for (int i = 1; i <= m; ++i)
//		cout<<sol[i]<<" ";
//	cout<<endl;
}

struct block
{
	int blt[sq + 10], t[maxn], uid[maxn];
	int L[maxn], R[maxn];
	
	inline void initial()
	{
		for (int i = 1; i <= sq; ++i) blt[i] = 0;
		for (int i = 1; i <= maxv; ++i)
			uid[i] = i / sq + 1, t[i] = 0;
		tot = maxv / sq + 1;
		for (int i = 1; i < tot; ++i) L[i] = R[i - 1] + 1, R[i] = sq * i - 1;
		L[tot] = R[tot - 1] + 1, R[tot] = maxv;
	}
	
	inline void ins1(int x, int y)
	{
		int cnt = tot + 1;
		for (int i = tot; i >= 1; --i)
		{
			if (L[i] > x) blt[i] += y, cnt = i;
			else break;
		}
		for (int i = R[cnt - 1]; i > x; --i) t[i] += y;
	}
	
	inline void ins2(int x, int y)
	{
		int cnt = 0;
		for (int i = 1; i <= tot; ++i)
		{
			if (R[i] < x) blt[i] += y, cnt = i;
			else break;
		}
		for (int i = L[cnt + 1]; i < x; ++i) t[i] += y;
	}
	
	inline int qry(int x) {
		return blt[uid[x]] + t[x];
	}
}b, c;

inline void work()
{
	b.initial(), c.initial();
	for (int i = 1; i <= n; ++i)
	{
		b.ins1(a[i], 1);
		c.ins2(a[i], a[i]);
		for (int j = 0; j < ct[i]; ++j)
		{
			node tmp = ch[i][j];
			for (int w = tmp.l; w <= tmp.r; ++w)
			{
				int res = ( (b.qry(a[w])) * a[w] + c.qry(a[w]) );
				sol[rk[tmp.id]] += tmp.opt * res;
//				cout<<"res = "<<res<<endl;
//				cout<<"w = "<<w<<" opt = "<<tmp.opt<<endl;
//				cout<<"id = "<<rk[tmp.id]<<endl<<b.qry(a[w])<<endl;
			}
		}
	}
}

inline void print()
{
	int res = 0;
//	cout<<"final, sol:\n";
//	for (int i = 1; i <= m; ++i)
//		cout<<sol[i]<<" ";
//	cout<<endl;
	for (int i = 1; i <= m; ++i)
	{
		res += sol[i];
		ans[q[i].id] = res + T3.ask(q[i].qr) - T3.ask(q[i].ql - 1);
	}
	for (int i = 1; i <= m; ++i)
		cout<<ans[i]<<endl;
}

signed main()
{
	freopen("wish2.in", "r", stdin);
	init();
	solve();
	work();
	print();
	return 0;
}

/*
21
5

51
49
11
7
2

5 2
1 2 4 3 5
1 3
2 3


*/
2024/7/20 16:29
加载中...