为什么我的cdq比别人慢了一倍。。
查看原帖
为什么我的cdq比别人慢了一倍。。
102709
zjy1412楼主2020/10/22 11:16

明明看起来没什么差别。

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define R register
//#define int long long
#define ld double
#define debug printf("zjy ")
#define lp (p<<1)
#define rp (p<<1|1)
inline int read(){
	int a=0,b=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')b=-1;c=getchar();}
	while(isdigit(c)){a=a*10+c-'0';c=getchar();}
	return a*b;
}
void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x<=9){putchar(x+'0');return;}
	write(x/10);putchar(x%10+'0');
}
void writesp(int x){
	write(x);putchar(' ');
}
void writeln(int x){
	write(x);putchar('\n');
}
const int N=1e6+50,inf=2e9;
struct node{
	int op,x,y,id;
}t[N],temp[N],b[N];
int n,m,len,tot,ans[N];
namespace bit{
	int mx[N];
	int lowbit(int x){
		return x&-x;
	}
	void add(int x,int z){
		for(;x<=len;x+=lowbit(x))mx[x]=max(mx[x],z);
	}
	int query(int x){
		int val=0;
		for(;x;x-=lowbit(x))val=max(val,mx[x]);
		return val?val:-inf;
	}
	void clear(int x){
		for(;x<=len;x+=lowbit(x))mx[x]=0;
	}
}
void cdq(int l,int r){
	if(l==r)return;
	int mid=(l+r)>>1;
	cdq(l,mid);cdq(mid+1,r);
	int x=l,y=mid+1;tot=0;
	while(x<=mid&&y<=r){
		if(b[x].x<=b[y].x){
			if(b[x].op==1){
				bit::add(b[x].y,b[x].x+b[x].y);
			}
			temp[++tot]=b[x];
			x++;
		}
		else{
			if(b[y].op==2){
				ans[b[y].id]=min(ans[b[y].id],b[y].x+b[y].y-bit::query(b[y].y));
	 	}
			temp[++tot]=b[y];
			y++;
		}
	}
	while(y<=r){
		if(b[y].op==2){
			ans[b[y].id]=min(ans[b[y].id],b[y].x+b[y].y-bit::query(b[y].y));
		}
		temp[++tot]=b[y];
		y++;
	}
	for(R int i=l;i<x;i++)if(b[i].op==1)bit::clear(b[i].y);
	while(x<=mid){
		temp[++tot]=b[x];
		x++;
	}
	for(R int i=r;i>=l;i--)b[i]=temp[tot--];
}
void solve(bool rx,bool ry){
	for(R int i=1;i<=n+m;i++){
		b[i]=t[i];
		if(rx)b[i].x=len-b[i].x;
		if(ry)b[i].y=len-b[i].y;
	}
	cdq(1,n+m);
}
signed main(){
	n=read();m=read();
	for(R int i=1;i<=n;i++){
		t[i].op=1;
		t[i].x=read()+1;t[i].y=read()+1;
		len=max(len,max(t[i].x,t[i].y));
	}
	for(R int i=n+1;i<=n+m;i++){
		t[i].op=read();
		t[i].x=read()+1;t[i].y=read()+1;
		t[i].id=i;
		ans[i]=inf;
		len=max(len,max(t[i].x,t[i].y));
	}
	len++;
	solve(0,0);solve(0,1);solve(1,0);solve(1,1);
	for(R int i=n+1;i<=n+m;i++)if(t[i].op==2)writeln(ans[i]);
	return 0;
}
2020/10/22 11:16
加载中...