Submission #785435

# Submission time Handle Problem Language Result Execution time Memory
785435 2023-07-17T09:06:38 Z NothingXD Horses (IOI15_horses) C++17
20 / 100
149 ms 29888 KB
#include "horses.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef complex<ld> point;

typedef __uint128_t L;
struct FastMod {
	ull b, m;
	FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
	ull reduce(ull a) {
		ull q = (ull)((L(m) * a) >> 64);
		ull r = a - q * b; // can be proven that 0 <= r < 2*b
		return r >= b ? r - b : r;
	}
};
FastMod FM(1e9+7);


void debug_out(){cerr << endl;}

template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T){
	cout << H << " ";
	debug_out(T...);
}

#define debug(...) cerr << "(" << #__VA_ARGS__ << "): ", debug_out(__VA_ARGS__)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define MP(x, y) make_pair(x, y)

const int maxn = 5e5 + 10;
const int mod = 1e9 + 7;

int n;
ll x[maxn], y[maxn];
ll dp[maxn << 2][2];
bool of[maxn << 2];

int find(int v, int l, int r, int tmp){
	if (!of[v] && 1ll * tmp * dp[v][1] < mod) return -1;
	if (l + 1 == r) return l;
	int mid = (l + r) >> 1;
	int lc = v << 1;
	int rc = lc | 1;
	int res = find(rc, mid, r, tmp);
	if (res == -1){
		tmp *= dp[rc][1];
		res = find(lc, l, mid, tmp);
	}
	return res;
}

void build2(int v, int l, int r){
	if (l + 1 == r){
		dp[v][0] = x[l] * y[l];
		dp[v][1] = x[l];
		return;
	}
	int mid = (l + r) >> 1;
	int lc = v << 1;
	int rc = lc | 1;
	build2(lc, l, mid);
	build2(rc, mid, r);
	dp[v][0] = max(dp[lc][0], dp[lc][1] * dp[rc][0]);
	dp[v][1] = dp[lc][1] * dp[rc][1];
	if (dp[v][1] >= mod || of[lc] || of[rc]) of[v] = true;
	dp[v][1] = FM.reduce(dp[v][1]);
}

void change2(int v, int l, int r, int idx){
	if (l + 1 == r){
		dp[v][0] = x[l] * y[l];
		dp[v][1] = x[l];
		return;
	}
	int mid = (l + r) >> 1;
	int lc = v << 1;
	int rc = lc | 1;
	if (idx < mid) change2(lc, l, mid, idx);
	else change2(rc, mid, r, idx);
	dp[v][0] = max(dp[lc][0], dp[lc][1] * dp[rc][0]);
	dp[v][1] = dp[lc][1] * dp[rc][1];
	if (dp[v][1] >= mod || of[lc] || of[rc]) of[v] = true;
	dp[v][1] = FM.reduce(dp[v][1]);
}

pll get2(int v, int l, int r, int ql, int qr){
	if (ql <= l && r <= qr) return MP(dp[v][0], dp[v][1]);
	int mid = (l + r) >> 1;
	int lc = v << 1;
	int rc = lc | 1;
	pll a = {0, 1};
	pll b = {0, 1};
	if (qr > l && ql < mid) a = get2(lc, l, mid, ql, qr);
	if (qr > mid && ql < r) b = get2(rc, mid, r, ql, qr);
	return MP(max(a.F, a.S * b.F), FM.reduce(a.S * b.S));
}

int Calc(){
	int idx = find(1, 0, n, 1);
	if (idx == -1) idx = 0;
	assert(idx < n-1);
	int tmp = get2(1, 0, n, 0, idx+1).S;
	ll tmp2 = FM.reduce(max(y[idx], get2(1, 0, n, idx+1, n).F));
	return FM.reduce(1ll * tmp * tmp2);
}

int init(int N, int X[], int Y[]) {
	n = N;
	for (int i = 0; i < n; i++){
		x[i] = X[i];
		y[i] = Y[i];
	}
	build2(1, 0, n);
	return Calc();
}

int updateX(int pos, int val) {
	x[pos] = val;
	change2(1, 0, n, pos);
	return Calc();
}

int updateY(int pos, int val) {
	y[pos] = val;
	change2(1, 0, n, pos);
	return Calc();
}

Compilation message

horses.cpp: In constructor 'FastMod::FastMod(ull)':
horses.cpp:16:14: warning: declaration of 'b' shadows a member of 'FastMod' [-Wshadow]
   16 |  FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
      |          ~~~~^
horses.cpp:15:6: note: shadowed declaration is here
   15 |  ull b, m;
      |      ^
horses.cpp: In constructor 'FastMod::FastMod(ull)':
horses.cpp:16:14: warning: declaration of 'b' shadows a member of 'FastMod' [-Wshadow]
   16 |  FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
      |          ~~~~^
horses.cpp:15:6: note: shadowed declaration is here
   15 |  ull b, m;
      |      ^
horses.cpp: In constructor 'FastMod::FastMod(ull)':
horses.cpp:16:14: warning: declaration of 'b' shadows a member of 'FastMod' [-Wshadow]
   16 |  FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
      |          ~~~~^
horses.cpp:15:6: note: shadowed declaration is here
   15 |  ull b, m;
      |      ^
horses.cpp: In function 'int find(int, int, int, int)':
horses.cpp:56:7: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   56 |   tmp *= dp[rc][1];
      |   ~~~~^~~~~~~~~~~~
horses.cpp: In function 'int Calc()':
horses.cpp:36:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   36 | #define S second
      |           ^
horses.cpp:112:36: note: in expansion of macro 'S'
  112 |  int tmp = get2(1, 0, n, 0, idx+1).S;
      |                                    ^
horses.cpp:114:18: warning: conversion from 'ull' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
  114 |  return FM.reduce(1ll * tmp * tmp2);
      |         ~~~~~~~~~^~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Runtime error 2 ms 468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 89 ms 29384 KB Output is correct
2 Correct 149 ms 29864 KB Output is correct
3 Correct 140 ms 29872 KB Output is correct
4 Correct 130 ms 29888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 2 ms 468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -