求助P11368
  • 板块灌水区
  • 楼主Eterna
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/1 13:02
  • 上次更新2024/12/1 16:04:45
查看原帖
求助P11368
1348260
Eterna楼主2024/12/1 13:02

O(qlogn)O(q \log n) 但是被常数砸死了。

极限数据下大概跑到了时限的两倍。

求正确做法或卡常。

#include<bits/stdc++.h>
#define int long long
#define N 1000005
#define gc pa == pb && (pb = (pa = buf) + fread(buf, 1, 100000, stdin), pa == pb) ? EOF : *pa++
#define rd read()
static char buf[100000], * pa(buf), * pb(buf);
using namespace std;
inline int read()
{
	unsigned register int x=0,s=gc;
	while(s<'0'||s>'9')s=gc;
	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=gc;
	return x;
}
int n,m;
int mx[N<<2];
int len[N<<2],sumv[N<<2],s0[N<<2];
int rs[N<<2],tag1[N<<2],tag2[N<<2];
int ad(int u,int l,int r,int x)
{
   	if(l==r)return max(x,mx[u]);
   	int mid=l+r>>1;
   	if(x>mx[u<<1])return x*(mid-l+1)+ad(u<<1|1,mid+1,r,x);
   	else return ad(u<<1,l,mid,x)+rs[u];
}
inline void pushup1(int u,int l,int r)
{
   	int mid=l+r>>1;
   	mx[u]=max(mx[u<<1],mx[u<<1|1]),rs[u]=ad(u<<1|1,mid+1,r,mx[u<<1]),s0[u]=s0[u<<1]+rs[u];
}
inline void addv(int v,int id,int x){tag1[id]+=x,sumv[id]+=v*x;}
inline void addm(int id,int x){tag2[id]+=x,sumv[id]+=rs[id>>1]*x;}
inline void pushup2(int v,int id){sumv[id]=sumv[id<<1]+sumv[id<<1|1]+tag1[id]*v+tag2[id]*rs[id>>1];}
void add(int id,int l,int r,int x,int w)
{
   	if(l==r)
   	{   	
	   addv(r-l+1,id,w*max(x,mx[id]));
	   return;
	}
   	int mid=l+r>>1;
   	if(x>mx[id<<1])
   	{
      	addv(mid-l+1,id<<1,x*w);
      	add(id<<1|1,mid+1,r,x,w);
   	}
   	else
   	{
      	add(id<<1,l,mid,x,w);
      	addm(id<<1|1,w);
   	}
   	pushup2(r-l+1,id);
}
inline void pushdown(int id,int l,int r)
{
   int x=tag1[id],y=tag2[id];
   tag1[id]=tag2[id]=0;
   int mid=l+r>>1;
   addv(mid-l+1,id<<1,x),addv(r-mid,id<<1|1,x);
   if(id&1)add(id,l,r,mx[id-1],y);
}
void change(int id,int l,int r,int p,int x)
{
   	if(l==r)
   	{
	   mx[id]=x;
	   return;
   	}
   	int mid=l+r>>1;
   	pushdown(id,l,r);
   	if(p<=mid)
   	{
      	if(mid+1<r)pushdown(id<<1|1,mid+1,r);
     	change(id<<1,l,mid,p,x);
   	}
   	else change(id<<1|1,mid+1,r,p,x);
   	pushup1(id,l,r);
}
int qry(int id,int l,int r,int L,int R)
{
	if(r<L||l>R)return 0;
   	if(L<=l&&r<=R)return sumv[id];
	pushdown(id,l,r);
   	int mid=l+r>>1;
   	return qry(id<<1,l,mid,L,R)+qry(id<<1|1,mid+1,r,L,R);
}
signed main()
{
	n=rd,m=rd;
	cout.tie(0);
	while(m--)
   	{
   		int x=rd,y=rd;
      	change(1,1,n,x,y);
		add(1,1,n,0,1);
      	cout<<qry(1,1,n,1,x)<<'\n';
   	}
   return 0;
}
2024/12/1 13:02
加载中...