求助常数
查看原帖
求助常数
714254
tder楼主2024/7/23 13:57

大常数选手 TLE * 3 求助。/bx

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define endl '\n'
#define print(x, y) cout<<(#x)<<" = "<<(x)<<y
const int N = 5e5 + 5;
namespace BIT {
	int n, t[N];
	int lowbit(int x) {
		return (-x) & x;
	}
	void add(int x, int k) {
		for(int i = x; i <= n; i += lowbit(i)) t[i] += k;
	}
	int sum(int x) {
		int r = 0;
		for(int i = x; i; i -= lowbit(i)) r += t[i];
		return r;
	}
	int sum(int l, int r) {
		return sum(r) - sum(l - 1);
	}
	void init(int m, int b[]) {
		n = m;
		for(int i = 1; i <= n; i++) add(i, b[i]);
	}
};
int n, m, a[N], b[N], c[N], d[N], f[N], g[N];
vector<int> p, q, l[N], r[N];
void update(int &f, vector<int> v, int s) {
	// cout<<"update "<<f<<" "<<(&f)<<endl;
	f = lower_bound(v.begin(), v.begin() + s, f) - v.begin() + 1;
	// cout<<"result "<<f<<endl;
}
struct Node {
	int x, y;
} e[N];
bool operator<(Node s, Node t) {
	if(s.x != t.x) return s.x < t.x;
	else return s.y < t.y;
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin>>n>>m;
	for(int i = 1; i <= n; i++) cin>>e[i].x>>e[i].y;
	for(int i = 1; i <= m; i++) cin>>a[i]>>b[i]>>c[i]>>d[i];
	for(int i = 1; i <= n; i++) p.push_back(e[i].x), q.push_back(e[i].y);
	for(int i = 1; i <= m; i++) p.push_back(a[i]), p.push_back(c[i]), q.push_back(b[i]), q.push_back(d[i]);
	sort(p.begin(), p.end()), sort(q.begin(), q.end());
	int k1 = unique(p.begin(), p.end()) - p.begin(), k2 = unique(q.begin(), q.end()) - q.begin();
	// cout<<k1<<" "<<k2<<endl;
	// for(int i = 0; i < k1; i++) cout<<p[i]<<" "; cout<<endl;
	// for(int i = 0; i < k2; i++) cout<<q[i]<<" "; cout<<endl;
	for(int i = 1; i <= n; i++) update(e[i].x, p, k1), update(e[i].y, q, k2);
	for(int i = 1; i <= m; i++) update(a[i], p, k1), update(c[i], p, k1), update(b[i], q, k2), update(d[i], q, k2);
	for(int i = 1; i <= m; i++) l[a[i] - 1].push_back(i), r[c[i]].push_back(i);
	sort(e + 1, e + n + 1);
	BIT::n = k2;
	for(int i = 0, j = 1; i <= k1; i++) {
		while(e[j].x <= i && j <= n) BIT::add(e[j].y, 1), j++;
		for(int k : l[i]) f[k] = BIT::sum(b[k], d[k]);
		for(int k : r[i]) g[k] = BIT::sum(b[k], d[k]);
	}
	for(int i = 1; i <= m; i++) cout<<g[i] - f[i]<<endl;
}
2024/7/23 13:57
加载中...