답안 #312740

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
312740 2020-10-14T09:19:01 Z misir 사다리꼴 (balkan11_trapezoid) C++14
100 / 100
108 ms 9448 KB
/*بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم*/

//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
typedef long long ll;
using pii = pair<int, int>;
const double PI = acos(-1.0);
const ll mod = 30013;
//const ll mod = 998244353;


inline void normal(ll &a) { a %= mod; (a < 0) && (a += mod); }
inline ll modMul(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a * b) % mod; }
inline ll modAdd(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a + b) % mod; }
inline ll modSub(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); a -= b; normal(a); return a; }
inline ll modPow(ll b, ll p) { ll r = 1; while (p) { if (p & 1) r = modMul(r, b); b = modMul(b, b); p >>= 1; } return r; }
inline ll modInverse(ll a) { return modPow(a, mod - 2); }
inline ll modDiv(ll a, ll b) { return modMul(a, modInverse(b)); }

#define si(x) scanf("%d",&x)
#define sii(x,y) scanf("%d %d",&x,&y)
#define siii(x,y,z) scanf("%d %d %d",&x,&y,&z)
#define sl(x) scanf("%lld",&x)
#define sll(x,y) scanf("%lld %lld",&x,&y)
#define slll(x,y,z) scanf("%lld %lld %lld",&x,&y,&z)
#define ss(ch) scanf("%s",ch)
#define pi(x) printf("%d",x)
#define pii(x,y) printf("%d %d",x,y)
#define piii(x,y,z) printf("%d %d %d",x,y,z)
#define pl(x) printf("%lld",x)
#define pll(x,y) printf("%lld %lld",x,y)
#define plll(x,y,z) printf("%lld %lld %lld",x,y,z)
#define ps(ch) printf("%s",ch)
#define F(i,a,b)      for(int i= a; i <= b; i++)
#define R(i,b,a)      for(int i= b; i >= a; i--)
#define REP(i,n) for(int i = 0; i < (n); i++)

int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int dx8[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy8[] = {1, -1, -1, 0, 1, -1, 0, 1};
int kx8[] = {1, 1, 2, 2, -1, -1, -2, -2};
int ky8[] = {2, -2, 1, -1, 2, -2, 1, -1};
/* for Random Number generate
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
*/
///**
template < typename F, typename S >ostream& operator << ( ostream& os, const pair< F, S > & p ) {return os << "(" << p.first << ", " << p.second << ")";}
template < typename T >ostream &operator << ( ostream & os, const vector< T > &v ) {os << "{"; for (auto it = v.begin(); it != v.end(); ++it) {if ( it != v.begin() ) os << ", "; os << *it;} return os << "}";}
template < typename T >ostream &operator << ( ostream & os, const set< T > &v ) {os << "["; for (auto it = v.begin(); it != v.end(); ++it) {if ( it != v.begin()) os << ", "; os << *it;} return os << "]";}
template < typename F, typename S >ostream &operator << ( ostream & os, const map< F, S > &v ) {os << "["; for (auto it = v.begin(); it != v.end(); ++it) {if ( it != v.begin() ) os << ", "; os << it -> first << " = " << it -> second ;} return os << "]";}
#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)
clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)
void faltu () { cerr << endl; }
template <typename T>void faltu( T a[], int n ) {for (int i = 0; i < n; ++i) cerr << a[i] << ' '; cerr << endl;}
template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

// Program showing a policy-based data structure.
#include <ext/pb_ds/assoc_container.hpp> // Common file 
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less 
using namespace __gnu_pbds;

// GNU link : https://goo.gl/WVDL6g
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
        tree_order_statistics_node_update>
        new_data_set;
// find_by_order(k) – ফাংশনটি kth ordered element এর একটা পয়েন্টার রিটার্ন করে। অর্থাৎ তুমি চাইলেই kth ইন্ডেক্সে কি আছে, সেটা জেনে ফেলতে পারছো!
// order_of_key(x) – ফাংশনটি x এলিমেন্টটা কোন পজিশনে আছে সেটা বলে দেয়।
//*//**___________________________________________________**/
const int N = 100006;

struct Trape
{
	int a, b, c, d;
} tra[N];
int n;
vector<int> vec;
vector<pii> event;

pii bit[N << 2], dp[N];

void upd(int p, int len, int num)
{
	for (; p <= 2 * n; p += p & -p)
		if (bit[p].first == len) (bit[p].second += num) %= mod;
		else if (bit[p].first < len) bit[p] = {len, num};
}

pii query(int p)
{
	pii res;
	for (; p; p -= p & -p) if (bit[p].first > res.first) res = bit[p];
		else if (bit[p].first == res.first) (res.second += bit[p].second) %= mod;
	return res;
}
int main()
{
	FASTIO
	/*
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
	freopen("error.txt", "w", stderr);
#endif
//*/
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int a, b, c, d;
		cin >> a >> b >> c >> d;
		tra[i] = {a, b, c, d};
		vec.emplace_back(c);
		vec.emplace_back(d);
	}
	sort(vec.begin(), vec.end());
	for (int i = 1; i <= n; i++) {
		tra[i].c = lower_bound(vec.begin(), vec.end(), tra[i].c) - vec.begin() + 1;
		tra[i].d = lower_bound(vec.begin(), vec.end(), tra[i].d) - vec.begin() + 1;
		event.emplace_back(tra[i].a, i);
		event.emplace_back(tra[i].b, -i);
	}

	pii ans = {0, 0};
	sort(event.begin(), event.end());

	for (auto  E : event) {
		if (E.second > 0) {
			pii mx = query(tra[E.second].c);
			if (!mx.first)mx.second = 1;
			dp[E.second] = {mx.first + 1, mx.second};
			if (ans.first < dp[E.second].first)ans = dp[E.second];
			else if (ans.first == dp[E.second].first)
				(ans.second += dp[E.second].second) %= mod;
		}
		else upd(tra[-E.second].d, dp[-E.second].first, dp[-E.second].second);
	}
	cout << ans.first << " " << ans.second << "\n";
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 2 ms 512 KB Output is correct
5 Correct 2 ms 512 KB Output is correct
6 Correct 3 ms 640 KB Output is correct
7 Correct 4 ms 768 KB Output is correct
8 Correct 5 ms 896 KB Output is correct
9 Correct 10 ms 1404 KB Output is correct
10 Correct 20 ms 2296 KB Output is correct
11 Correct 24 ms 2672 KB Output is correct
12 Correct 53 ms 4992 KB Output is correct
13 Correct 65 ms 5864 KB Output is correct
14 Correct 77 ms 6888 KB Output is correct
15 Correct 84 ms 7144 KB Output is correct
16 Correct 90 ms 7652 KB Output is correct
17 Correct 93 ms 8172 KB Output is correct
18 Correct 90 ms 8548 KB Output is correct
19 Correct 98 ms 8948 KB Output is correct
20 Correct 108 ms 9448 KB Output is correct