pts==82
查看原帖
pts==82
142549
hbhz_zcy楼主2022/7/30 20:59

WA两个点,很奇怪,拍不出来。
https://www.luogu.com.cn/record/81851413

//g++ c2.cpp -g -o c2 -std=c++14 -O0 -Wall
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=3e5+10,maxh=2e6+10,_maxh=1e6+5;
int N,M,f[maxh],ans[maxn<<1];
struct node{int x,y,v,id;}a[maxn<<1],_a[maxn<<1],a0[maxn<<1];
int qd(){
	int rt=0;char c=getchar();
	while(c<'0'||c>'9')  c=getchar();
	while('0'<=c&&c<='9')  rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
	return rt;
}
bool cmpx(const node &x,const node &y){return x.x<y.x;}
bool cmpi(const node &x,const node &y){return x.id<y.id;}
#define lowbit(t) ((t)&-(t))
void change(int t,int v){for(;t<maxh;t+=lowbit(t))  f[t]=max(f[t],v);}
void rchange(int t){for(;t<maxh&&f[t];t+=lowbit(t))  f[t]=0;}
int ask(int t){int rt=0;for(;t;t-=lowbit(t))  rt=max(rt,f[t]);return rt;}
void cdq(int l,int r){
//	printf("%d,%d\n",l,r);
	if(l>=r)  return;
	int m=(l+r)>>1;
	cdq(l,m),cdq(m+1,r);
//	sort(a+l,a+m+1,cmpx),sort(a+m+1,a+r+1,cmpx);
	for(int t1=l,t2=m+1;t2<=r;t2++){
		for(;a[t1].x<=a[t2].x&&t1<=m;t1++)  if(a[t1].v==-1)  change(a[t1].y,a[t1].x+a[t1].y);
		if(a[t2].v!=-1)  a[t2].v=min(a[t2].v,a[t2].x+a[t2].y-ask(a[t2].y));
	}
	for(int i=l;i<=m;i++)  if(a[i].v==-1)  rchange(a[i].y);
//	printf("end %d,%d:\n",l,r);
//	for(int i=1;i<=N+M;i++)  printf("%d:%d %d,%d %d\n",i,a[i].id,a[i].x,a[i].y,a[i].v);
//	putchar('\n');
	for(int t1=l,t2=m+1,t0=l;t0<=r;t0++){
		if(t1>m)  _a[t0]=a[t2++];
		else if(t2>r)  _a[t0]=a[t1++];
		else if(cmpx(a[t1],a[t2]))  _a[t0]=a[t1++];
		else _a[t0]=a[t2++];
	}
	for(int i=l;i<=r;i++)  a[i]=_a[i];
}
#define ad a[i].id
int main(){
	freopen("in.txt","r",stdin);
	N=qd(),M=qd();
	for(int i=1;i<=N;i++)  a0[i].x=qd()+1,a0[i].y=qd()+1,a0[i].v=-1,a0[i].id=0;
	for(int i=1;i<=M;i++)  ans[i]=a0[N+i].v=(qd()==1?-1:maxh),a0[N+i].x=qd()+1,a0[N+i].y=qd()+1,a0[N+i].id=i;
	for(int i=1;i<=N+M;i++)  a[i]=a0[i];
	cdq(1,N+M);
	for(int i=1;i<=N+M;i++)  ans[ad]=min(ans[ad],a[i].v);
	for(int i=1;i<=N+M;i++)  a[i]=a0[i],a[i].x=_maxh-a[i].x;
	cdq(1,N+M);
	for(int i=1;i<=N+M;i++)  ans[ad]=min(ans[ad],a[i].v);
	for(int i=1;i<=N+M;i++)  a[i]=a0[i],a[i].y=_maxh-a[i].y;
	cdq(1,N+M);
	for(int i=1;i<=N+M;i++)  ans[ad]=min(ans[ad],a[i].v);
	for(int i=1;i<=N+M;i++)  a[i]=a0[i],a[i].x=_maxh-a[i].x,a[i].y=_maxh-a[i].y;
	cdq(1,N+M);
	for(int i=1;i<=N+M;i++)  ans[ad]=min(ans[ad],a[i].v);
	for(int i=1;i<=M;i++)  if(ans[i]!=-1)  printf("%d\n",ans[i]);
	return 0;
}
2022/7/30 20:59
加载中...