comet OJ #8 D 菜菜种菜

传送门:https://cometoj.com/contest/58/problem/D

其实是个水题,不过我当场没有想起来先求一个总的,再用另一个树状数组维护另一个,减去多余的这种套路

我们预处理对于每一个点 a[i].id  ,他在 [ a[i].ll , a[i].rr ]区间之内不会有可以直接到的点,那么我们按照a[i].ll排序

再对所有的询问的区间按照左端点排序。

对于每一个询问que[i], 他的答案其实是所有满足  que[i].l<=a[i].id<=que[i].r  ,  a[i].l<=que[i].l, a[i].r >= que[i].r的这些菜地的a[i].w之和

维护两个树状数组,b1表示a[i].r为下标的a[i].w的前缀和,b2表示a[i].id为下标的a[i].r的前缀和

那么我们从左到右枚举询问,再设个a数组的,如果a[idx+1].l<=que[i].l 就加入,并更新b1,b2,记录一个decpos[i],表示a[i].id=i的有哪些下标,那么如果a[i].id

那么首先用b1算出那些 a[i].id>=que[i].l (前提已经保证),且a[i].rr>=que[i].r的 a[i].w之和,但是由于a[i].id需要<= que[i].r ,且哪些a[i].id>que[i].r 的,a[i].r>que[i].r,所以用b2算出a[i].id>que[i].r的多余的a[i].w和,从之前的总和中减去就是答案。

#include
#define maxl 1000010
using namespace std;

int n,m,q;
long long b1[maxl],b2[maxl],ans[maxl];
struct node
{
	int ll,rr;
	int w,id;
	bool operator < (const node &b)const
	{
		return id decpos[maxl];
struct qu
{
	int l,r,id;
}que[maxl];

inline bool nodecmp(const node &x,const node &y)
{
	if(x.ll==y.ll)
		return x.idu)
			a[u].rr=min(a[u].rr,v-1);
		if(v

 

你可能感兴趣的:(离线,树状数组)