Submission #727327

# Submission time Handle Problem Language Result Execution time Memory
727327 2023-04-20T12:01:27 Z jwvg0425 Horses (IOI15_horses) C++17
17 / 100
356 ms 76744 KB
#include "horses.h"
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
#include <string>
#include <bitset>
#include <map>
#include <set>
#include <tuple>
#include <string.h>
#include <math.h>
#include <random>
#include <functional>
#include <assert.h>
#include <math.h>
#define all(x) (x).begin(), (x).end()
#define xx first
#define yy second
#define MOD ((i64)1e9 + 7)
 
using namespace std;
 
template <typename T, typename Pr = less<T>>
using pq = priority_queue<T, vector<T>, Pr>;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
 
constexpr int clog2(int n) { return ((n < 2) ? 1 : 1 + clog2(n / 2)); }
 
template <typename T>
class SegmentTree
{
public:
	SegmentTree() = default;
 
	template <typename M>
	SegmentTree(const M &m) : merge(m) {}
 
	void init(const vector<T> &raw_)
	{
		raw = raw_;
		n = (int)raw.size();
		int sz = (1 << (clog2(n) + 1));
		data.resize(sz);
 
		_init(raw, 1, 0, n - 1);
	}
 
	T modify(int idx, function<T(T)> modifier) { return update(idx, modifier(raw[idx])); }
	T update(int idx, const T &newVal)
	{
		raw[idx] = newVal;
		return _update(1, 0, n - 1, idx, newVal);
	}
	T query(int left, int right) { return _query(1, 0, n - 1, left, right); }
 
private:
	vector<T> raw;
	vector<T> data;
	int n;
	using Merge = function<T(const T &, const T &)>;
	Merge merge;
 
	T _init(const vector<T> &raw, int node, int start, int end)
	{
		int mid = (start + end) / 2;
		if (start == end)
			return data[node] = raw[start];
		else
			return data[node] = merge(_init(raw, node * 2, start, mid),
																_init(raw, node * 2 + 1, mid + 1, end));
	}
 
	T _update(int node, int start, int end, int index, const T &newVal)
	{
		if (index < start || index > end)
			return data[node];
 
		if (start == end)
			data[node] = newVal;
		else
		{
			int mid = (start + end) / 2;
			data[node] = merge(_update(node * 2, start, mid, index, newVal),
												 _update(node * 2 + 1, mid + 1, end, index, newVal));
		}
 
		return data[node];
	}
 
	T _query(int node, int start, int end, int left, int right)
	{
		if (left <= start && end <= right)
			return data[node];
 
		int mid = (start + end) / 2;
 
		if (mid < left)
			return _query(node * 2 + 1, mid + 1, end, left, right);
 
		if (mid + 1 > right)
			return _query(node * 2, start, mid, left, right);
 
		return merge(_query(node * 2, start, mid, left, right),
								 _query(node * 2 + 1, mid + 1, end, left, right));
	}
};
 
int n;
vector<i64> x;
vector<pair<i64, int>> y;
set<int> xp;
auto ytree = SegmentTree<pair<i64, int>>([](auto &l, auto &r)
																				 { return max(l, r); });
auto xtree = SegmentTree<i64>([](i64 l, i64 r)
															{ return (l * r) % MOD; });
 
int getAns()
{
	vector<int> xps = {n};
	i64 xi = 1;
	auto iter = xp.rbegin();
	while (iter != xp.rend() && xi < (i64)1e9)
	{
		xps.push_back(*iter);
		xi *= x[*iter];
		++iter;
	}
 
	// x 다 곱해도 1e9 안 되는 경우, 전부 봐줘야함
	if (xi < (i64)1e9 && xps.back() != 0)
		xps.push_back(0);
 
	reverse(all(xps));
 
	i64 nowX = 1;
	i64 maxX = 1;
	i64 maxY = 1;
	int ans = 0;
 
	for (int k = 1; k < xps.size(); k++)
	{
		i64 nxtX = (nowX * x[xps[k - 1]]) % MOD;
		auto nxtY = ytree.query(xps[k - 1], xps[k] - 1);
 
		if (maxY < nxtX / maxX * nxtY.xx)
		{
			maxX = nxtX;
			maxY = nxtY.xx;
			ans = nxtY.yy;
		}
      	nowX = nxtX;
	}
 
	return (xtree.query(0, ans) * y[ans].xx) % MOD;
}
 
int init(int N, int X[], int Y[])
{
	n = N;
	x = vector<i64>(N + 1);
	y = vector<pair<i64, int>>(N + 1);
 
	for (int i = 0; i < N; i++)
	{
		x[i] = X[i];
		if (x[i] >= 2)
			xp.insert(i);
	}
 
	for (int i = 0; i < N; i++)
	{
		y[i].yy = i;
		y[i].xx = Y[i];
	}
 
	ytree.init(y);
	xtree.init(x);
 
	return getAns();
}
 
int updateX(int pos, int val)
{
	x[pos] = val;
	xtree.update(pos, val);
	if (x[pos] == 1)
		xp.erase(pos);
	else
		xp.insert(pos);
 
	return getAns();
}
 
int updateY(int pos, int val)
{
	y[pos].xx = val;
	ytree.update(pos, y[pos]);
	return getAns();
}

Compilation message

horses.cpp: In member function 'T SegmentTree<T>::_init(const std::vector<_Tp>&, int, int, int)':
horses.cpp:67:27: warning: declaration of 'raw' shadows a member of 'SegmentTree<T>' [-Wshadow]
   67 |  T _init(const vector<T> &raw, int node, int start, int end)
      |          ~~~~~~~~~~~~~~~~~^~~
horses.cpp:61:12: note: shadowed declaration is here
   61 |  vector<T> raw;
      |            ^~~
horses.cpp: In function 'int getAns()':
horses.cpp:144:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  144 |  for (int k = 1; k < xps.size(); k++)
      |                  ~~^~~~~~~~~~~~
horses.cpp:158:43: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  158 |  return (xtree.query(0, ans) * y[ans].xx) % MOD;
      |                                           ^
horses.cpp: In instantiation of 'T SegmentTree<T>::_init(const std::vector<_Tp>&, int, int, int) [with T = std::pair<long long int, int>]':
horses.cpp:49:3:   required from 'void SegmentTree<T>::init(const std::vector<_Tp>&) [with T = std::pair<long long int, int>]'
horses.cpp:180:14:   required from here
horses.cpp:67:27: warning: declaration of 'raw' shadows a member of 'SegmentTree<std::pair<long long int, int> >' [-Wshadow]
   67 |  T _init(const vector<T> &raw, int node, int start, int end)
      |          ~~~~~~~~~~~~~~~~~^~~
horses.cpp:61:12: note: shadowed declaration is here
   61 |  vector<T> raw;
      |            ^~~
horses.cpp: In instantiation of 'T SegmentTree<T>::_init(const std::vector<_Tp>&, int, int, int) [with T = long long int]':
horses.cpp:49:3:   required from 'void SegmentTree<T>::init(const std::vector<_Tp>&) [with T = long long int]'
horses.cpp:181:14:   required from here
horses.cpp:67:27: warning: declaration of 'raw' shadows a member of 'SegmentTree<long long int>' [-Wshadow]
   67 |  T _init(const vector<T> &raw, int node, int start, int end)
      |          ~~~~~~~~~~~~~~~~~^~~
horses.cpp:61:12: note: shadowed declaration is here
   61 |  vector<T> raw;
      |            ^~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 304 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 0 ms 304 KB Output is correct
16 Correct 1 ms 304 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 304 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 304 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 304 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 308 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Correct 1 ms 304 KB Output is correct
14 Correct 1 ms 300 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 304 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 308 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Incorrect 0 ms 300 KB Output isn't correct
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 356 ms 76744 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 308 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 300 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Incorrect 1 ms 212 KB Output isn't correct
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 308 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 308 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 1 ms 304 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 300 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 304 KB Output is correct
20 Correct 1 ms 308 KB Output is correct
21 Incorrect 1 ms 212 KB Output isn't correct
22 Halted 0 ms 0 KB -