求助线段树。不开O2最后一个点就T
查看原帖
求助线段树。不开O2最后一个点就T
409773
LiYomi楼主2023/2/2 18:27
//acmer mengxc. Think seriously
#include <bits/stdc++.h>
//Debug
#define Debug(x) std::cout<<x<<" ";
#define db(x) cout<<#x<<" : "<<x<<endl;
#define db2(x,y) cout<<#x<<" : "<<x<<" "<<#y<<" : "<<y<<endl;
#define db3(x,y,z) cout<<#x<<" : "<<x<<" "<<#y<<" : "<<y<<" "<<#z<<" : "<<z<<endl;
#define db4(x,y,z,k) cout<<#x<<" : "<<x<<" "<<#y<<" : "<<y<<" "<<#z<<" : "<<z<<" "<<#k<<" : "<<k<<endl;
#define db5(x,y,z,g,j) cout<<#x<<" : "<<x<<" "<<#y<<" : "<<y<<" "<<#z<<" : "<<z<<" "<<#g<<" : "<<g<<" "<<#j<<" : "<<j<<endl;
#define db6(x,y,z,g,j,f) cout<<#x<<" : "<<x<<" "<<#y<<" : "<<y<<" "<<#z<<" : "<<z<<" "<<#g<<" : "<<g<<" "<<#j<<" : "<<j<<" "<<#f<<" : "<<f<<endl;
template<typename T>inline void debug(T& x){Debug(x);}
template<typename T,typename... Args>inline void debug(T& x,Args&... args){int cnt=1;debug(x);debug(args...);putchar('\n');}
//SGT
#define ls rt<<1
#define rs rt<<1|1
#define lss rt<<1,l,mid,ql,qr
#define rss rt<<1|1,mid+1,r,ql,qr
//PII
#define fi first
#define se second
//DS
typedef long long LL;
typedef std::pair<int, int> pii;
typedef unsigned long long ULL;
//IO Stream
//#define int long long
#define hh cout<<endl;
using namespace std;
template<typename T>inline void rd(T& x){int f=0,c=getchar();x=0;while(!isdigit(c))f|=c=='-',c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();if(f)x=-x;}
template<typename T,typename... Args>inline void rd(T& x,Args&... args){rd(x);rd(args...);}
template<typename T>inline void wt(T x,int e=0){if(e==2)putchar(' ');if(x<0){putchar('-');x=~(x-1);}int s[30],top=0;while(x){s[++top]=x%10;x/=10;}if(!top)s[++top]=0;while(top)putchar(s[top--]+'0');if(e==1)putchar('\n');if(e==3)putchar(' ');}
inline void solve();signed main(){int T=1;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
for(int i=1;i<=T;i++) solve();return 0;}
/*C:\Users\DELL\Documents\AutoHotkey\up_down_right_left.ahk*/
const int N=3e5+5;
const int mod=1e9+7;
const int INF=0x7fffffff;
const LL LINF=0x7fffffffffffffff;
int n,m;
int x[N],v[N];
int zd[N<<2],tot;
struct nq
{
	int opt,l,r,a,b,c;
}Q[N];
namespace sgt
{
	LL t[N<<3],tm[N<<3];
	void pushup(int rt)
	{
		t[rt]=t[ls]+t[rs];
		tm[rt]=tm[ls]+tm[rs];
	}
	void update(int rt,int l,int r,int pos,int c)
	{
		if(l==r)
		{
			t[rt]+=c;
			tm[rt]+=1LL*c*zd[pos];
			return;
		}
		int mid=l+r>>1;
		if(pos<=mid) update(ls,l,mid,pos,c);
		else update(rs,mid+1,r,pos,c);
		pushup(rt);
	}
	void query(int rt,int l,int r,int ql,int qr,LL& q1,LL& q2)
	{
		if(ql<=l&&r<=qr)
		{
			q1+=t[rt];
			q2+=tm[rt];
			return;
		}
		int mid=l+r>>1;
		if(ql<=mid) query(lss,q1,q2);
		if(qr>mid) query(rss,q1,q2);
	}
};
int mm;
void godiscre()
{
	sort(zd+1,zd+1+tot);
	mm=unique(zd+1,zd+1+tot)-zd-1;
	for(int i=1;i<=n;i++) x[i]=lower_bound(zd+1,zd+1+mm,x[i])-zd;
	for(int i=1;i<=m;i++)
	{
		if(Q[i].opt==1) 
		{
			Q[i].l=lower_bound(zd+1,zd+1+mm,Q[i].l)-zd;
			Q[i].r=lower_bound(zd+1,zd+1+mm,Q[i].r)-zd;
		}
		else if(Q[i].opt==2)
		{
			Q[i].b=lower_bound(zd+1,zd+1+mm,Q[i].b)-zd;
		}
	}
}

LL c_check;
bool check(int l,int mid)
{
	LL st=0,stm=0;
	sgt::query(1,1,mm,l,mid,st,stm);
	if(st>=c_check) return true;
	return false;
}

bool check2(int l,int mid)
{
	LL st=0,stm=0;
	sgt::query(1,1,mm,l,mid,st,stm);
	if(st>c_check) return true;
	return false;
}


LL cal(int l,int r,int pos)
{
	LL res=0;
	LL st=0,stm=0;
	sgt::query(1,1,mm,l,pos-1,st,stm);
	res+=zd[pos]*st;
	res-=stm;
	st=0,stm=0;
	sgt::query(1,1,mm,pos+1,r,st,stm);
	res+=stm;
	res-=zd[pos]*st;
	return res;
}

void solve()
{
	//io and discre
	rd(n,m);
	for(int i=1;i<=n;i++) rd(x[i]),zd[++tot]=x[i];
	for(int i=1;i<=n;i++) rd(v[i]);
	for(int i=1;i<=m;i++)
	{
		int opt,l,r,a,b,c;
		rd(opt);
		if(opt==1) rd(l,r),Q[i].opt=1,Q[i].l=l,Q[i].r=r,zd[++tot]=l,zd[++tot]=r;
		if(opt==2) rd(a,b,c),Q[i].opt=2,Q[i].a=a,Q[i].b=b,Q[i].c=c,zd[++tot]=b;
	}
	godiscre();
	//sgt
	for(int i=1;i<=n;i++) sgt::update(1,1,mm,x[i],v[i]);
	//x[i] v[i]
	for(int i=1;i<=m;i++)
	{
		int opt=Q[i].opt,l=Q[i].l,r=Q[i].r,a=Q[i].a,b=Q[i].b,c=Q[i].c;
		if(opt==1)
		{
			LL sumt=0,sumtm=0;
			sgt::query(1,1,mm,l,r,sumt,sumtm);
			// binary search
			c_check=sumt/2;
			int lp=l,rp=r;
			while(lp<=rp)
			{
				int mid=lp+rp>>1;
				if(check(l,mid)) rp=mid-1;
				else lp=mid+1;
			}
			int as1=rp+1;
			
			c_check=sumt/2;
			lp=l,rp=r;
			while(lp<=rp)
			{
				int mid=lp+rp>>1;
				if(check2(l,mid)) rp=mid-1;
				else lp=mid+1;
			}
			int as2=rp+1;
			LL ans1=cal(l,r,as1);
			LL ans2=cal(l,r,as2);
			wt(min(ans1,ans2),1);
		}
		else
		{
			sgt::update(1,1,mm,x[a],-v[a]);
			sgt::update(1,1,mm,b,c);
			x[a]=b,v[a]=c;
		}
	}
}

2023/2/2 18:27
加载中...