답안 #651532

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
651532 2022-10-19T08:31:55 Z IWTIM Cake 3 (JOI19_cake3) C++17
100 / 100
1035 ms 154036 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = long double; // or double, if TL is tight
using str = string; // yay python! 
 
// pairs
using pii = pair<ll,int>;
using pl = pair<ll,ll>;
using pd = pair<db,db>;
#define mp make_pair
#define f first
#define s second
 
#define tcT template<class T
#define tcTU tcT, class U
// ^ lol this makes everything look weird but I'll try it
tcT> using V = vector<T>; 
tcT, size_t SZ> using AR = array<T,SZ>; 
using vi = V<int>;
using vb = V<bool>;
using vd = V<db>;
using vs = V<str>;
using vpi = V<pii>;
using vpl = V<pl>;
using vpd = V<pd>;
 
// vectors
// oops size(x), rbegin(x), rend(x) need C++17
#define sz(x) int((x).size())
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
#define rall(x) x.rbegin(), x.rend() 
#define sor(x) sort(all(x)) 
#define rsz resize
#define ins insert 
#define pb push_back
#define eb emplace_back
#define ft front()
#define bk back()
 
#define lb lower_bound
#define ub upper_bound
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define rep(a) F0R(_,a)
#define each(a,x) for (auto& a: x)
const int MOD = 998244353;
const int N = 1e6 + 5;
const ll inf = 1e15; // not too close to LLONG_MAX
const db PI = acos((db)-1);
const int dx[4]{1,0,-1,0}, dy[4]{0,1,0,-1}; // for every grid problem!!
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count()); 
template<class T> using pqg = priority_queue<T,vector<T>,greater<T>>;
struct DSU {
	vi e; void init(int N) { e = vi(N,-1); }
	int get(int x) { return e[x] < 0 ? x : e[x] = get(e[x]); } 
	bool sameSet(int a, int b) { return get(a) == get(b); }
	int size(int x) { return -e[get(x)]; }
	bool unite(int x, int y) { // union by size
		x = get(x), y = get(y); if (x == y) return 0;
		if (e[x] > e[y]) swap(x,y);
		e[x] += e[y]; e[y] = x; return 1;
	}
};
/*
inline namespace Helpers {
	//////////// is_iterable
	// https://stackoverflow.com/questions/13830158/check-if-a-variable-type-is-iterable
	// this gets used only when we can call begin() and end() on that type
	tcT, class = void> struct is_iterable : false_type {};
	tcT> struct is_iterable<T, void_t<decltype(begin(declval<T>())),
	                                  decltype(end(declval<T>()))
	                                 >
	                       > : true_type {};
	tcT> constexpr bool is_iterableftchv = is_iterable<T>::value;
 
	//////////// is_readable
	tcT, class = void> struct is_readable : false_type {};
	tcT> struct is_readable<T,
	        typename std::enableftchif_t<
	            is_same_v<decltype(cin >> declval<T&>()), istream&>
	        >
	    > : true_type {};
	tcT> constexpr bool is_readableftchv = is_readable<T>::value;
 
	//////////// is_printable
	// // https://nafe.es/posts/2020-02-29-is-printable/
	tcT, class = void> struct is_printable : false_type {};
	tcT> struct is_printable<T,
	        typename std::enableftchif_t<
	            is_same_v<decltype(cout << declval<T>()), ostream&>
	        >
	    > : true_type {};
	tcT> constexpr bool is_printableftchv = is_printable<T>::value;
}*/
using ll = long long;
using db = long double; // or double, if TL is tight
using str = string; // yay python! 
 
// pairs
using pii = pair<ll,int>;
using pl = pair<ll,ll>;
using pd = pair<db,db>;
#define mp make_pair
#define f first
#define s second
 
#define tcT template<class T
#define tcTU tcT, class U
// ^ lol this makes everything look weird but I'll try it
tcT> using V = vector<T>; 
tcT, size_t SZ> using AR = array<T,SZ>; 
using vi = V<int>;
using vb = V<bool>;
using vd = V<db>;
using vs = V<str>;
using vpi = V<pii>;
using vpl = V<pl>;
using vpd = V<pd>;
 
// vectors
// oops size(x), rbegin(x), rend(x) need C++17
#define sz(x) int((x).size())
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
#define rall(x) x.rbegin(), x.rend() 
#define sor(x) sort(all(x)) 
#define rsz resize
#define ins insert 
#define pb push_back
#define eb emplace_back
#define ft front()
#define bk back()
 
#define lb lower_bound
#define ub upper_bound
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define rep(a) F0R(_,a)
#define each(a,x) for (auto& a: x)
template<class T> using pqg = priority_queue<T,vector<T>,greater<T>>;
#define int long long
 
/*
inline namespace Helpers {
	//////////// is_iterable
	// https://stackoverflow.com/questions/13830158/check-if-a-variable-type-is-iterable
	// this gets used only when we can call begin() and end() on that type
	tcT, class = void> struct is_iterable : false_type {};
	tcT> struct is_iterable<T, void_t<decltype(begin(declval<T>())),
	                                  decltype(end(declval<T>()))
	                                 >
	                       > : true_type {};
	tcT> constexpr bool is_iterableftchv = is_iterable<T>::value;
 
	//////////// is_readable
	tcT, class = void> struct is_readable : false_type {};
	tcT> struct is_readable<T,
	        typename std::enableftchif_t<
	            is_same_v<decltype(cin >> declval<T&>()), istream&>
	        >
	    > : true_type {};
	tcT> constexpr bool is_readableftchv = is_readable<T>::value;
 
	//////////// is_printable
	// // https://nafe.es/posts/2020-02-29-is-printable/
	tcT, class = void> struct is_printable : false_type {};
	tcT> struct is_printable<T,
	        typename std::enableftchif_t<
	            is_same_v<decltype(cout << declval<T>()), ostream&>
	        >
	    > : true_type {};
	tcT> constexpr bool is_printableftchv = is_printable<T>::value;
}*/
const int M = 10000000;
int t, n, m, ans = -inf, leftch[M], rigch[M], cur, sz, rt[N];
map<int, int> mpp;
vector<int> v;
pii a[N];
struct nod
{
	int sum, cnt;
};
 
nod tree[M];
nod merge(nod a, nod b)
{
	return {
		a.sum + b.sum, a.cnt + b.cnt
	};
 
}
 
void build(int vert, int le, int ri)
{
	if (le == ri)
	{
		return;
	}
 
	int mid = (le + ri) / 2;
	leftch[vert] = ++cur;
	rigch[vert] = ++cur;
	build(leftch[vert], le, mid);
	build(rigch[vert], mid + 1, ri);
	tree[vert] = merge(tree[leftch[vert]], tree[rigch[vert]]);
}
 
void update(int vert, int le, int ri, int idx, int val)
{
	if (le > idx || ri < idx) return;
	if (le == ri)
	{
		tree[cur].sum = tree[vert].sum + val;
		tree[cur].cnt = tree[vert].cnt + 1;
		return;
	}
 
	int x = cur;
	int mid = (le + ri) / 2;
 
	leftch[x] = leftch[vert];
	rigch[x] = rigch[vert];
	if (idx <= mid) leftch[x] = ++cur;
	else rigch[x] = ++cur;
	update(leftch[vert], le, mid, idx, val);
	update(rigch[vert], mid + 1, ri, idx, val);
	tree[x] = merge(tree[leftch[x]], tree[rigch[x]]);
}
 
int answer(int le, int ri, int vert1, int vert2, int k)
{
	if (le > ri) return 0;
	if (le == ri)
	{
		int occ = tree[vert2].cnt - tree[vert1].cnt;
		int vl = (tree[vert2].sum - tree[vert1].sum) / occ;
		return k * vl;
	}
 
	int mid = (le + ri) / 2;
	int raod = tree[rigch[vert2]].cnt - tree[rigch[vert1]].cnt;
	if (raod >= k)
	{
		return answer(mid + 1, ri, rigch[vert1], rigch[vert2], k);
	}
	else
	{
		return tree[rigch[vert2]].sum - tree[rigch[vert1]].sum + answer(le, mid, leftch[vert1], leftch[vert2], k - raod);
	}
}
 
int cost(int le, int ri)
{
	return answer(1, sz, rt[le - 1], rt[ri], m - 2);
}
 
vector<int> comp(vector<int> v)
{
	sort(v.begin(), v.end());
	vector<int> res;
	for (int i = 0; i < v.size(); i++)
	{
		if (i == 0 || v[i] != v[i - 1]) res.pb(v[i]);
	}
 
	return res;
}
 
void solve(int le, int ri, int optl, int optr)
{
	int mid = (le + ri) / 2;
	int best = -inf, bestid = 0, cursum = 0;
	multiset<int> s;
	for (int i = max(mid + m - 1, optl); i <= optr; i++)
	{
		int x = -2 *a[i].f + cost(mid + 1, i - 1) + a[i].s + a[mid].s;
		if (x > best) best = x, bestid = i;
	}
 
	ans = max(ans, best + 2 *a[mid].f);
	if (le == ri) return;
	solve(le, mid, optl, bestid);
	solve(mid + 1, ri, bestid, optr);
}
 
signed main()
{
	ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i].s >> a[i].f;
		v.pb(a[i].s);
	}
 
	sort(a + 1, a + n + 1);
	vector<int> v1 = comp(v);
	v.clear();
	v.pb(0);
	for (int x: v1) v.pb(x);
 
	sz = v.size() - 1;
	for (int i = 1; i <= sz; i++)
	{
		mpp[v[i]] = i;
	}
 
	cur = 1;
	rt[0] = 1;
	build(1, 1, sz);
	for (int i = 1; i <= n; i++)
	{
		int prt = rt[i - 1];
		rt[i] = ++cur;
		update(rt[i - 1], 1, sz, mpp[a[i].s], a[i].s);
	}
 
	solve(1, n - m + 1, 1, n);
	cout << ans << "\n";
 
}

Compilation message

cake3.cpp: In function 'std::vector<long long int> comp(std::vector<long long int>)':
cake3.cpp:267:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  267 |  for (int i = 0; i < v.size(); i++)
      |                  ~~^~~~~~~~~~
cake3.cpp: In function 'void solve(long long int, long long int, long long int, long long int)':
cake3.cpp:278:31: warning: unused variable 'cursum' [-Wunused-variable]
  278 |  int best = -inf, bestid = 0, cursum = 0;
      |                               ^~~~~~
cake3.cpp: In function 'int main()':
cake3.cpp:319:7: warning: unused variable 'prt' [-Wunused-variable]
  319 |   int prt = rt[i - 1];
      |       ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 352 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 340 KB Output is correct
22 Correct 1 ms 340 KB Output is correct
23 Correct 1 ms 340 KB Output is correct
24 Correct 1 ms 340 KB Output is correct
25 Correct 1 ms 340 KB Output is correct
26 Correct 1 ms 340 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 340 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 1 ms 348 KB Output is correct
31 Correct 1 ms 344 KB Output is correct
32 Correct 1 ms 340 KB Output is correct
33 Correct 1 ms 340 KB Output is correct
34 Correct 1 ms 340 KB Output is correct
35 Correct 1 ms 344 KB Output is correct
36 Correct 1 ms 340 KB Output is correct
37 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 352 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 340 KB Output is correct
22 Correct 1 ms 340 KB Output is correct
23 Correct 1 ms 340 KB Output is correct
24 Correct 1 ms 340 KB Output is correct
25 Correct 1 ms 340 KB Output is correct
26 Correct 1 ms 340 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 340 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 1 ms 348 KB Output is correct
31 Correct 1 ms 344 KB Output is correct
32 Correct 1 ms 340 KB Output is correct
33 Correct 1 ms 340 KB Output is correct
34 Correct 1 ms 340 KB Output is correct
35 Correct 1 ms 344 KB Output is correct
36 Correct 1 ms 340 KB Output is correct
37 Correct 1 ms 340 KB Output is correct
38 Correct 4 ms 1364 KB Output is correct
39 Correct 4 ms 1432 KB Output is correct
40 Correct 3 ms 1436 KB Output is correct
41 Correct 3 ms 1364 KB Output is correct
42 Correct 4 ms 1364 KB Output is correct
43 Correct 3 ms 1364 KB Output is correct
44 Correct 3 ms 1380 KB Output is correct
45 Correct 3 ms 1364 KB Output is correct
46 Correct 3 ms 1424 KB Output is correct
47 Correct 3 ms 1364 KB Output is correct
48 Correct 4 ms 1380 KB Output is correct
49 Correct 3 ms 1364 KB Output is correct
50 Correct 3 ms 1364 KB Output is correct
51 Correct 3 ms 1384 KB Output is correct
52 Correct 4 ms 1296 KB Output is correct
53 Correct 3 ms 1420 KB Output is correct
54 Correct 3 ms 1364 KB Output is correct
55 Correct 3 ms 1364 KB Output is correct
56 Correct 2 ms 1364 KB Output is correct
57 Correct 3 ms 1364 KB Output is correct
58 Correct 3 ms 1364 KB Output is correct
59 Correct 2 ms 468 KB Output is correct
60 Correct 1 ms 596 KB Output is correct
61 Correct 1 ms 488 KB Output is correct
62 Correct 2 ms 468 KB Output is correct
63 Correct 1 ms 612 KB Output is correct
64 Correct 1 ms 484 KB Output is correct
65 Correct 3 ms 1364 KB Output is correct
66 Correct 3 ms 1380 KB Output is correct
67 Correct 3 ms 1364 KB Output is correct
68 Correct 3 ms 1364 KB Output is correct
69 Correct 3 ms 1384 KB Output is correct
70 Correct 3 ms 1364 KB Output is correct
71 Correct 2 ms 724 KB Output is correct
72 Correct 1 ms 724 KB Output is correct
73 Correct 3 ms 1380 KB Output is correct
74 Correct 3 ms 1492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 352 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 340 KB Output is correct
22 Correct 1 ms 340 KB Output is correct
23 Correct 1 ms 340 KB Output is correct
24 Correct 1 ms 340 KB Output is correct
25 Correct 1 ms 340 KB Output is correct
26 Correct 1 ms 340 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 340 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 1 ms 348 KB Output is correct
31 Correct 1 ms 344 KB Output is correct
32 Correct 1 ms 340 KB Output is correct
33 Correct 1 ms 340 KB Output is correct
34 Correct 1 ms 340 KB Output is correct
35 Correct 1 ms 344 KB Output is correct
36 Correct 1 ms 340 KB Output is correct
37 Correct 1 ms 340 KB Output is correct
38 Correct 4 ms 1364 KB Output is correct
39 Correct 4 ms 1432 KB Output is correct
40 Correct 3 ms 1436 KB Output is correct
41 Correct 3 ms 1364 KB Output is correct
42 Correct 4 ms 1364 KB Output is correct
43 Correct 3 ms 1364 KB Output is correct
44 Correct 3 ms 1380 KB Output is correct
45 Correct 3 ms 1364 KB Output is correct
46 Correct 3 ms 1424 KB Output is correct
47 Correct 3 ms 1364 KB Output is correct
48 Correct 4 ms 1380 KB Output is correct
49 Correct 3 ms 1364 KB Output is correct
50 Correct 3 ms 1364 KB Output is correct
51 Correct 3 ms 1384 KB Output is correct
52 Correct 4 ms 1296 KB Output is correct
53 Correct 3 ms 1420 KB Output is correct
54 Correct 3 ms 1364 KB Output is correct
55 Correct 3 ms 1364 KB Output is correct
56 Correct 2 ms 1364 KB Output is correct
57 Correct 3 ms 1364 KB Output is correct
58 Correct 3 ms 1364 KB Output is correct
59 Correct 2 ms 468 KB Output is correct
60 Correct 1 ms 596 KB Output is correct
61 Correct 1 ms 488 KB Output is correct
62 Correct 2 ms 468 KB Output is correct
63 Correct 1 ms 612 KB Output is correct
64 Correct 1 ms 484 KB Output is correct
65 Correct 3 ms 1364 KB Output is correct
66 Correct 3 ms 1380 KB Output is correct
67 Correct 3 ms 1364 KB Output is correct
68 Correct 3 ms 1364 KB Output is correct
69 Correct 3 ms 1384 KB Output is correct
70 Correct 3 ms 1364 KB Output is correct
71 Correct 2 ms 724 KB Output is correct
72 Correct 1 ms 724 KB Output is correct
73 Correct 3 ms 1380 KB Output is correct
74 Correct 3 ms 1492 KB Output is correct
75 Correct 977 ms 143052 KB Output is correct
76 Correct 950 ms 138944 KB Output is correct
77 Correct 884 ms 143364 KB Output is correct
78 Correct 1035 ms 145624 KB Output is correct
79 Correct 570 ms 146264 KB Output is correct
80 Correct 607 ms 141988 KB Output is correct
81 Correct 517 ms 105940 KB Output is correct
82 Correct 629 ms 114420 KB Output is correct
83 Correct 525 ms 112372 KB Output is correct
84 Correct 565 ms 113620 KB Output is correct
85 Correct 472 ms 107024 KB Output is correct
86 Correct 284 ms 99060 KB Output is correct
87 Correct 298 ms 98704 KB Output is correct
88 Correct 447 ms 101040 KB Output is correct
89 Correct 372 ms 104396 KB Output is correct
90 Correct 286 ms 105760 KB Output is correct
91 Correct 278 ms 96624 KB Output is correct
92 Correct 255 ms 96268 KB Output is correct
93 Correct 258 ms 100504 KB Output is correct
94 Correct 247 ms 102564 KB Output is correct
95 Correct 295 ms 105432 KB Output is correct
96 Correct 62 ms 11840 KB Output is correct
97 Correct 68 ms 12740 KB Output is correct
98 Correct 66 ms 12552 KB Output is correct
99 Correct 63 ms 12604 KB Output is correct
100 Correct 56 ms 11936 KB Output is correct
101 Correct 61 ms 11932 KB Output is correct
102 Correct 247 ms 84296 KB Output is correct
103 Correct 252 ms 82992 KB Output is correct
104 Correct 307 ms 89560 KB Output is correct
105 Correct 229 ms 83376 KB Output is correct
106 Correct 238 ms 85296 KB Output is correct
107 Correct 210 ms 81136 KB Output is correct
108 Correct 904 ms 144780 KB Output is correct
109 Correct 874 ms 153888 KB Output is correct
110 Correct 80 ms 34248 KB Output is correct
111 Correct 93 ms 34840 KB Output is correct
112 Correct 665 ms 137000 KB Output is correct
113 Correct 512 ms 154036 KB Output is correct