A line tree exercise

meaning of the title



solution

First of all, we consider a solution of O (N2) O (N2) O (N2) O (N2). First, we consider to find out the number of rectangles without any stars. This can consider the monotone stack method. Specifically, for each lower right corner, the graph formed by its upper left corner is the shape of a step. Then we enumerate each row, and then calculate the latest time of stars appearing in each position, and use monotone stack to maintain the first backward position When the star appears later than the current time, add the sequence of isochromatic data to some intervals
Then consider a faster way: change monotone stack to line tree, and maintain the same problem. When I first wrote, I wanted to maintain monotone stack directly from a line tree, but the definition was very problematic, resulting in its non monotony. So at last, I used a line tree to maintain interval min, and another line tree to maintain the current line
Finally, subtract the illegal ones from the total

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=7e4+5;
inline char get_char(){//Super fast read
    static char buf[1000001],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    int num=0;
    char c;
    while(isspace(c=get_char()));
    while(num=num*10+c-48,isdigit(c=get_char()));
    return num;
}
int n,m,q;
vector<int> a[maxn];
struct node{
	long long sum,tag,tag3;
}t[maxn<<2];
int tr[maxn<<2],tr2[maxn];
#define ls rt<<1
#define rs rt<<1|1
inline void add(int rt,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		t[rt].sum=t[rt].sum+((l-x+1)+(r-x+1))*(r-l+1)/2;
		t[rt].tag++;t[rt].tag3-=x;
		return ;
	}
	if(t[rt].tag){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+((l*t[rt].tag+t[rt].tag)+(mid*t[rt].tag+t[rt].tag))*(mid-l+1)/2;
		t[ls].tag+=t[rt].tag;
		t[rs].sum=t[rs].sum+(((mid+1)*t[rt].tag+t[rt].tag)+(r*t[rt].tag+t[rt].tag))*(r-mid)/2;
		t[rs].tag+=t[rt].tag;
		t[rt].tag=0;
	}
	if(t[rt].tag3){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+t[rt].tag3*(mid-l+1);t[ls].tag3+=t[rt].tag3;
		t[rs].sum=t[rs].sum+t[rt].tag3*(r-mid);t[rs].tag3+=t[rt].tag3;
		t[rt].tag3=0;
	}
	int mid=(l+r)>>1;
	if(x<=mid)add(ls,l,mid,x,y);
	if(y>mid)add(rs,mid+1,r,x,y);
	t[rt].sum=t[ls].sum+t[rs].sum;
}
inline long long query(int rt,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return t[rt].sum;
	}
	if(t[rt].tag){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+((l*t[rt].tag+t[rt].tag)+(mid*t[rt].tag+t[rt].tag))*(mid-l+1)/2;
		t[ls].tag+=t[rt].tag;
		t[rs].sum=t[rs].sum+(((mid+1)*t[rt].tag+t[rt].tag)+(r*t[rt].tag+t[rt].tag))*(r-mid)/2;
		t[rs].tag+=t[rt].tag;
		t[rt].tag=0;
	}
	if(t[rt].tag3){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+t[rt].tag3*(mid-l+1);t[ls].tag3+=t[rt].tag3;
		t[rs].sum=t[rs].sum+t[rt].tag3*(r-mid);t[rs].tag3+=t[rt].tag3;
		t[rt].tag3=0;
	}
	int mid=(l+r)>>1;
	long long ans=0;
	if(x<=mid)ans=ans+query(ls,l,mid,x,y);
	if(y>mid)ans=ans+query(rs,mid+1,r,x,y);
	return ans;
}
inline void modify(int rt,int l,int r,int x,int y,long long val){
	if(x<=l&&r<=y){
		t[rt].sum=t[rt].sum+val*(r-l+1);
		t[rt].tag3+=val;
		return ;
	}
	if(t[rt].tag){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+((l*t[rt].tag+t[rt].tag)+(mid*t[rt].tag+t[rt].tag))*(mid-l+1)/2;
		t[ls].tag+=t[rt].tag;
		t[rs].sum=t[rs].sum+(((mid+1)*t[rt].tag+t[rt].tag)+(r*t[rt].tag+t[rt].tag))*(r-mid)/2;
		t[rs].tag+=t[rt].tag;
		t[rt].tag=0;
	}
	if(t[rt].tag3){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+t[rt].tag3*(mid-l+1);t[ls].tag3+=t[rt].tag3;
		t[rs].sum=t[rs].sum+t[rt].tag3*(r-mid);t[rs].tag3+=t[rt].tag3;
		t[rt].tag3=0;
	}
	int mid=(l+r)>>1;
	if(x<=mid)modify(ls,l,mid,x,y,val);
	if(y>mid) modify(rs,mid+1,r,x,y,val);
	t[rt].sum=t[ls].sum+t[rs].sum;
}
void build(int rt,int l,int r){
	if(l==r){
		tr[rt]=l;
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);build(rs,mid+1,r);
	if(tr2[tr[ls]]>tr2[tr[rs]])tr[rt]=tr[ls];
	else tr[rt]=tr[rs];
}
inline int quert(int rt,int l,int r,int ql,int qr,int x){
	if(tr2[tr[rt]]<=x){return -1;}
	if(l==r){
		return l;
	}
	int mid=(l+r)>>1;
	int tmp=-1;
	if(tr2[tr[ls]]>x&&ql<=mid)tmp=quert(ls,l,mid,ql,qr,x);
	if(tmp!=-1)return tmp;
	if(tr2[tr[rs]]>x&&qr>=mid+1)tmp=quert(rs,mid+1,r,ql,qr,x);
	return tmp;
}
inline void modi(int rt,int l,int r,int x){
	if(l==r){
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)modi(ls,l,mid,x);
	else modi(rs,mid+1,r,x);
	if(tr2[tr[ls]]>tr2[tr[rs]])tr[rt]=tr[ls];
	else tr[rt]=tr[rs];
}
void change(int rt,int l,int r,int x){
	if(l==r){
		t[rt].sum=0;
		t[rt].tag=t[rt].tag3=0;
		return ;
	}
	if(t[rt].tag){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+((l*t[rt].tag+t[rt].tag)+(mid*t[rt].tag+t[rt].tag))*(mid-l+1)/2;
		t[ls].tag+=t[rt].tag;
		t[rs].sum=t[rs].sum+(((mid+1)*t[rt].tag+t[rt].tag)+(r*t[rt].tag+t[rt].tag))*(r-mid)/2;
		t[rs].tag+=t[rt].tag;
		t[rt].tag=0;
	}
	if(t[rt].tag3){
		int mid=(l+r)>>1;
		t[ls].sum=t[ls].sum+t[rt].tag3*(mid-l+1);t[ls].tag3+=t[rt].tag3;
		t[rs].sum=t[rs].sum+t[rt].tag3*(r-mid);t[rs].tag3+=t[rt].tag3;
		t[rt].tag3=0;
	}
	int mid=(l+r)>>1;
	if(x<=mid)change(ls,l,mid,x);
	else change(rs,mid+1,r,x);
	t[rt].sum=t[ls].sum+t[rs].sum;
}
signed main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	n=read(),m=read();q=read();
	for(int i=1;i<=q;i++){
		int x=read(),y=read();
		a[x].push_back(y);
	}
	for(int i=1;i<=n;i++){a[i].push_back(m+1);a[i].push_back(0);sort(a[i].begin(),a[i].end());}
	long long ans=0;tr2[m+1]=1e9;
	build(1,1,m+1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<a[i].size();j++){
			int pos=a[i][j-1]+1;
			while(pos<a[i][j]){
				int lst=quert(1,1,m+1,pos+1,m+1,tr2[pos]),ht=tr2[pos];
				int tmp=query(1,1,m,pos,pos);
				if(tmp-(pos-a[i][j-1])*(i-ht-1)){
					modify(1,1,m,pos,min(lst-1,a[i][j]-1),-(tmp-(pos-a[i][j-1])*(i-ht-1)));}
				pos=lst;
			}
			if(a[i][j-1]+1<=a[i][j]-1){
				add(1,1,m,a[i][j-1]+1,a[i][j]-1);
			}
		}
		for(int j=1;j<a[i].size()-1;j++){int pos=a[i][j];
			tr2[pos]=i;change(1,1,m,pos);
			modi(1,1,m+1,pos);
		}
		ans=ans+t[1].sum;
	}
	long long tot1=n*(n+1)/2,tot2=m*(m+1)/2;
	printf("%lld\n",tot1*tot2-ans);
	return 0;
}

72 original articles published, praised 1, visited 1329
Private letter follow

Posted by fenway on Fri, 17 Jan 2020 07:17:04 -0800