求数论剪枝
查看原帖
求数论剪枝
741169
Xlw6friend楼主2025/7/25 15:54

WA on #10,90分。

将所有vector改为数组后仍过不去。

提交记录 : https://www.luogu.com.cn/record/226780189

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<int,int> 
inline int read(){
	int x=0,f=1;char C=getchar();
	while(C<'0'||C>'9'){if(C=='-')f=-1;C=getchar();}
	while(C>='0'&&C<='9')x=x*10+(C^48),C=getchar();
	return x*f;
}
inline void write(int x){
    if(x<0){putchar('-'); x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
bool Ck(char c){return c!=' '&&c!='\n'&&c!='\r';}
inline void rd(char s[], int &n){
	n=0;
	s[++n]=getchar();
	while(!Ck(s[n]))s[n]=getchar();
	while(Ck(s[n]))s[++n]=getchar();
	--n;
}
const int N = 2e5+5;

bool St;
struct Node{
	int l,r,x;
};
vector<Node>A,B;
vector<pii>AB,CD;
void work(int n,vector<Node> &A){
	A.clear();
	int l = 1, r = 0;
	while(l <= n){
		r = n / (n / l);
		A.push_back({l,r,n/l});
		l = r + 1;
	}
}
void check(vector<Node> A, vector<Node> B, vector<pii> &C){
	C.clear();
	int n1 = A.size(), n2 = B.size();
	int p1 = 0, p2 = 0, cur = 0;
	while(p1 < n1 && p2 < n2){
		if(A[p1].r < B[p2].r){
			if(A[p1].x < B[p2].x){
				C.push_back({cur + 1, A[p1].r});
			}
			cur = A[p1++].r;
		}
		else if(A[p1].r > B[p2].r){
			if(A[p1].x < B[p2].x){
				C.push_back({cur + 1, B[p2].r});
			}
			cur = B[p2++].r;
		}
		else{
			if(A[p1].x < B[p2].x){
				C.push_back({cur + 1, A[p1].r});
			}
			cur = A[p1++].r;
			p2++;
		}
	}
	while(p2 < n2){
		C.push_back({cur + 1, B[p2].r});
		cur = B[p2++].r;
	}
}

void solve(){
	int a,b,c,d;
	a=read();b=read();c=read();d=read();
	--a;--c;
	work(a,A); work(b,B); check(A,B,AB);
	work(c,A); work(d,B); check(A,B,CD);
	while(!AB.empty() && !CD.empty()){
		int l1 = AB.back().first, r1 = AB.back().second;
		int l2 = CD.back().first, r2 = CD.back().second;
		if(r1 < l2){
			CD.pop_back();continue;
		}
		if(r2 < l1){
			AB.pop_back();continue;
		}
		if(l1 <= r2 && r2 <= r1){
			cout << r2 << endl;
			return;
		}
		if(l2 <= r1 && r1 <= r2){
			cout << r1 << endl;
			return;
		}
	}
}

bool Ed; 
signed main()
{
	//freopen("data.txt","r",stdin);
	//cerr<< (&Ed - &St) / 1024 / 1024.0 << endl;
 	int T = read();
 	while(T--){
 		solve();
	}
	return 0;
}
2025/7/25 15:54
加载中...