样例都没过/大哭
查看原帖
样例都没过/大哭
125375
Goliard楼主2023/10/24 21:29
#include <bits/stdc++.h>

using namespace std;

const int N=3e5+5;
const int M=1e6;
bool vis[N];
int n, m, cnt, ans[N<<1];
struct Node { int a, b, c; bool fl; }pre[N<<1], cdq[N<<1], num[N<<1];
struct Tree {
	int tr[(M<<1)+5];
	
	int lowbit(int x) { return x&-x; }
	
	void Add(int u, int x) {
		u=u+M+1;
		for(; u<=M*2; u+=lowbit(u)) tr[u]=max(tr[u], x);
	}
	
	void Cov(int u, int x) {
		u=u+M+1;
		for(; u<=M*2; u+=lowbit(u)) tr[u]=x;
	}
	
	int Ask(int u) {
		int sum=0; u=u+M+1;
		for(; u; u-=lowbit(u)) sum=max(sum, tr[u]);
		return sum;
	}
}dis;

inline int read() {
    int x=0,fl=1; register char ch=getchar();
    for( ; !isdigit(ch); fl=ch=='-'?-1:1, ch=getchar());
    for( ; isdigit(ch); x=(x<<3)+(x<<1)+(ch^48), ch=getchar());
    return fl==1?x:-x;
}

void CDQsolve(int l, int r) {
	if(l==r) return;
	
	int mid=(l+r)>>1;
	CDQsolve(l, mid);
	CDQsolve(mid+1, r);
	
	int p=l, q=mid+1;
	for(int tot=1; tot<=r-l+1; ++tot) {
		if(p>mid) {
			while(q<=r) {
				num[tot++]=cdq[q];
				if(cdq[q].fl) ans[cdq[q].a]=min(ans[cdq[q].a], cdq[q].b+cdq[q].c-dis.Ask(cdq[q].c)); q++;
			} break; }
		if(q>r) {
			while(p<=mid) num[tot++]=cdq[p], p++;
			break;
		}
		if(cdq[p].b<cdq[q].b || (cdq[p].b==cdq[q].b && !cdq[p].fl)) { num[tot]=cdq[p]; if(!cdq[p].fl) dis.Add(cdq[p].c, cdq[p].b+cdq[p].c); p++; }
		else { num[tot]=cdq[q]; if(cdq[q].fl) ans[cdq[q].a]=min(ans[cdq[q].a], cdq[q].b+cdq[q].c-dis.Ask(cdq[q].c)); q++; }
	}
	for(int i=l; i<=mid; ++i) if(!cdq[i].fl) dis.Cov(cdq[i].c, -1e9);
	for(int i=1; i<=r-l+1; ++i) cdq[i+l-1]=num[i];
}

int main() {
//    freopen(".in", "r", stdin);
//    freopen(".out", "w", stdout);
	n=read();
	m=read();
	for(int i=1; i<=n; ++i) {
		cdq[i].a=0;
		cdq[i].b=read();
		cdq[i].c=read();
		cdq[i].fl=0;
	}
	for(int i=1; i<=m; ++i) {
		cdq[i+n].a=i;
		cdq[i+n].fl=read()-1;
		vis[i]=cdq[i+n].fl;
		cdq[i+n].b=read();
		cdq[i+n].c=read();
	}
	
	sort(cdq+1, cdq+n+m+1, [=](const Node &x, const Node &y){ return x.a<y.a; });
	for(int i=1; i<=n+m; ++i) pre[i]=cdq[i];
	
	memset(ans, 0x3f, sizeof(ans));
	memset(dis.tr, 128, sizeof(dis.tr));
	
	CDQsolve(1, n+m);
	
	for(int i=1; i<=n+m; ++i) cdq[i]=pre[i], cdq[i].b=-cdq[i].b;
	CDQsolve(1, n+m);
	
	for(int i=1; i<=n+m; ++i) cdq[i]=pre[i], cdq[i].c=-cdq[i].c;
	CDQsolve(1, n+m);
	
	for(int i=1; i<=n+m; ++i) cdq[i]=pre[i], cdq[i].b=-cdq[i].b, cdq[i].c=-cdq[i].c;
	CDQsolve(1, n+m);
	
	for(int i=1; i<=m; ++i) if(vis[i]) printf("%d\n", ans[i]);
    return 0;
}
2023/10/24 21:29
加载中...