90pts 动态开点线段树+扫描线
查看原帖
90pts 动态开点线段树+扫描线
289296
zymooll楼主2023/6/13 20:50

rt WA on #3

// Author:zymooll

#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define int long long
using namespace std;
int read(){
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';
		c=getchar();
	}
	return s*w;
}
void print(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>=10)print(x/10);
	putchar(x%10+'0');
	return;
}
const int PMax=1e9;
const int NMax=4e4;
int n;
struct Node{
	int n,l,r,lz;
}t[64*NMax];
int ncnt=1;
void lzdown(int p,int L,int R,int mid){
	if(!t[p].lz)return;
	if(!t[p].l)t[p].l=++ncnt;
	if(!t[p].r)t[p].r=++ncnt;
	if(t[t[p].l].lz&&t[t[p].r].lz)return;
	t[p].lz--;
	t[t[p].l].lz++;
	t[t[p].r].lz++;
	t[t[p].l].n=mid-L+1;
	t[t[p].r].n=R-(mid+1)+1;
	return;
}
int modify1(int p,int L,int R,int l,int r){
	if(!p)p=++ncnt;
	if(l<=L&&R<=r){
		t[p].lz++;
		t[p].n=R-L+1;
		return p;
	}
	int mid=(L+R)/2;
	lzdown(p,L,R,mid);
	if(l<=mid)t[p].l=modify1(t[p].l,L,mid,l,r);
	if(r>mid)t[p].r=modify1(t[p].r,mid+1,R,l,r);
	t[p].n=t[t[p].l].n+t[t[p].r].n;
	return p;
}
void modify2(int p,int L,int R,int l,int r){
	if(!p)return;
	if(l<=L&&R<=r&&t[p].lz){
		t[p].lz--;
		if(!t[p].lz)t[p].n=t[t[p].l].n+t[t[p].r].n;
		return;
	}
	int mid=(L+R)/2;
	lzdown(p,L,R,mid);
	if(l<=mid)modify2(t[p].l,L,mid,l,r);
	if(r>mid)modify2(t[p].r,mid+1,R,l,r);
	t[p].n=t[t[p].l].n+t[t[p].r].n;
	// cerr<<p<<" "<<L<<" "<<R<<" "<<l<<" "<<r<<" "<<t[p].n<<endl;
}
struct Edge{
	int h,l,r;
	friend bool operator < (Edge aa,Edge bb){
		return aa.h<bb.h;
	}
};
vector<Edge>edge;
int ans;
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read();
	edge.push_back((Edge){0,114514,114514});
	for(int i=1;i<=n;i++){
		int l=read(),r=read(),h=read();
		edge.push_back((Edge){h,l,r-1});
	}
	sort(edge.begin(),edge.end());
	for(int i=1;i<=n;i++){
		modify1(1,1,PMax,edge[i].l,edge[i].r);
	}
	for(int i=1;i<=n;i++){
		// cerr<<i<<" "<<ans<<" "<<t[1].n<<" "<<edge[i].h<<endl;
		ans+=t[1].n*(edge[i].h-edge[i-1].h);
		modify2(1,1,PMax,edge[i].l,edge[i].r);
	}
	print(ans);
	return 0;
}

附测试点:

Sample3 Input:

10
18 27 8
14 35 11
13 18 9
31 34 15
13 40 13
6 10 17
12 40 11
1 3 1
27 30 1
40 43 9

Sample3 Output:

465

MyCode Output:

456

感谢!

2023/6/13 20:50
加载中...