Submission #255748

#TimeUsernameProblemLanguageResultExecution timeMemory
255748FalconPairs (IOI07_pairs)C++14
60 / 100
44 ms2816 KiB
#pragma GCC optimize("O2")

#include <bits/stdc++.h>
#ifdef DEBUG
	#include "debug.hpp"
#endif

using namespace std;

#define all(c) (c).begin(), (c).end()
#define traverse(c, it) for(auto it = (c).begin(); it != (c).end(); it++)
#define rep(i, N) for(int i = 0; i < (N); i++)
#define rep1(i, N) for(int i = 1; i <= (N); i++)
#define rep2(i, s, e) for(int i = (s); i <= (e); i++)
#define rep3(i, s, e, d) for(int i = (s); (d) >= 0 ? i <= (e) : i >= (e); i += (d))
#define pb push_back


#ifdef DEBUG
	#define debug(x...) {dbg::depth++; string dbg_vals = dbg::to_string(x); dbg::depth--; dbg::fprint(__func__, __LINE__, #x, dbg_vals);}
	#define light_debug(x) {dbg::light = 1; dbg::dout << __func__ << ":" << __LINE__ << "  " << #x << " = " << x << endl; dbg::light = 0;}
#else
	#define debug(x...)
	#define light_debug(x) 
#endif


using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;


void solve1(){
	int N, D, M;
	cin >> N >> D >> M;
	vi A(N);
	rep(i, N)
		cin >> A[i];
	sort(all(A));
	ll ans = -N;
	for(int a : A)
		ans += upper_bound(all(A), a + D) - lower_bound(all(A), a - D);
	cout << (ans >> 1) << '\n';
}

struct Point2D{
	int x, y;
	bool operator<(Point2D& p){
		return x < p.x;
	}
};

template<int... n>
struct BIT{
	int a = 0;

	void upd(int v){
		a += v;
	}

	int qry(){
		return a;
	}
};

template<int n, int... m>
struct BIT<n, m...>{
	BIT<m...> a[n + 1];

	template<typename... args>
	void upd(int i, args... j){
		for(; i <= n; i += i & -i)
			a[i].upd(j...);
	}

	template<typename... args>
	int prf(int i, args... j){
		int s = 0;
		for(; i; i -= i & -i)
			s += a[i].qry(j...);
		return s;
	}

	template<typename... args>
	int qry(int i, int j, args... k){
		return prf(j, k...) - prf(i - 1, k...);
	}
};


void solve2(){
	int N, D, M;
	BIT<150001> bit;
	cin >> N >> D >> M;
	vector<Point2D> A(N);
	rep(i, N){
		int x, y;
		cin >> x >> y;
		A[i] = Point2D{M + x - y, x + y};
	}
	sort(all(A));
	ll ans = -N;
	auto pushx = A.begin(), popx = A.begin(), curx = A.begin();
	for(int x = 1; x <= 2 * M; x++){
		for(; pushx != A.end() && pushx->x <= x + D; pushx++)
			bit.upd(max(1, pushx->y - D), 1), bit.upd(min(pushx->y + D + 1, 2 * M + 1), -1);
		for(; popx != A.end() && popx->x < x - D; popx++)
			bit.upd(max(1, popx->y - D), -1), bit.upd(min(popx->y + D + 1, 2 * M + 1), 1);
		for(; curx != A.end() && curx->x == x; curx++)
			ans += bit.prf(curx->y);
	}
	ans >>= 1;
	cout << ans << '\n';
}

void solve3(){assert(0);}

signed main(){

	ios_base::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	#ifdef DEBUG
		freopen("debug", "w", stderr);
	#endif
	
	int B;
	cin >> B;
	if(B == 1) solve1();
	else if(B == 2) solve2();
	else solve3();



	#ifdef DEBUG
		dbg::dout << "\nExecution time: " << clock() << "ms\n";
	#endif

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...