Submission #266714

#TimeUsernameProblemLanguageResultExecution timeMemory
266714anubhavdharStrange Device (APIO19_strange_device)C++14
100 / 100
741 ms49248 KiB
#include<bits/stdc++.h>

#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ff first 
#define ss second
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pii>
#define vll vector<pll>
#define FOR(i,N) for(i=0;i<(N);++i)
#define FORe(i,N) for(i=1;i<=(N);++i)
#define FORr(i,a,b) for(i=(a);i<(b);++i)
#define FORrev(i,N) for(i=(N);i>=0;--i)
#define F0R(i,N) for(int i=0;i<(N);++i)
#define F0Re(i,N) for(int i=1;i<=(N);++i)
#define F0Rr(i,a,b) for(ll i=(a);i<(b);++i)
#define F0Rrev(i,N) for(int i=(N);i>=0;--i)
#define all(v) (v).begin(),(v).end()
#define dbgLine cerr<<" LINE : "<<__LINE__<<"\n"
#define ldd long double

using namespace std;

const int Alp = 26;
const int __PRECISION = 9;
const int inf = 1e9 + 8;

const ldd PI = acos(-1);
const ldd EPS = 1e-7;

const ll MOD = 1e9 + 7;
const ll MAXN = 2e5 + 5;
const ll ROOTN = 320;
const ll LOGN = 18;
const ll INF = 1e18 + 1022;

ll n, A, B, l, r, sm, mxDiff, T;
vll V, ranges;

ll gcd(ll a, ll b)
{
	if(a > b)
		swap(a, b);
	if(b % a == 0)
		return a;
	return gcd(b%a, a);
}

inline void check_period()
{
	ll tmp = gcd(A, B+1);
	if(log2(A*1.0) + log(B*1.0) - log(1.0 * tmp) > 59.99)
	{
		cout<<sm<<'\n';
		exit(0);
	}
	T = B * (A / tmp);
	if(mxDiff >= T)
	{
		cout<<T<<'\n';
		exit(0);
	}
}

signed main()
{

	
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	

	sm = mxDiff = 0;
	cin>>n>>A>>B;
	F0R(i, n)
	{
		cin>>l>>r;
		sm += r - l + 1;
		mxDiff = max(mxDiff, r-l+1);
		ranges.pb(mp(l, r));
	}

	check_period();
	sm = 0;
	F0R(i, n)
	{
		l = ranges[i].ff % T, r = ranges[i].ss % T;
		V.pb(mp(l, 0));
		V.pb(mp(r, 1));
		if(l > r)
			V.pb(mp(T-1, 1)),	V.pb(mp(0, 0));
	}

	// cerr<<"period = "<<T<<'\n';
	sort(all(V));

	// for(pll x : V)
		// cout<<"("<<x.ff<<','<<x.ss<<")\n";
	
	ll lst = -1, act = 0;

	for(pll pp : V)
	{
		if(act == 0 and pp.ss == 0)
			++sm;
		if(act > 0)
			sm += pp.ff - lst;
		if(pp.ss == 0)
			++act;
		else if(pp.ss == 1)
			--act;
		lst = pp.ff;
	}

	cout<<sm<<'\n';

	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...