Submission #40275

#TimeUsernameProblemLanguageResultExecution timeMemory
40275szawinisHorses (IOI15_horses)C++14
17 / 100
129 ms74680 KiB
#include "horses.h"
#include <algorithm>
#include <cmath>
using namespace std;
using ll = long long;
const int N = 1 << 19, MOD = 1e9+7;

ll modPow(ll b, ll e) {
	if(!e) return 1;
	if(e == 1) return b;
	return modPow(b*b % MOD, e >> 1) * modPow(b, e & 1) % MOD;
}

struct node {
	long double comp;
	ll val;
	bool lazy_needed;
	void merge(node rhs) {
		lazy_needed = true;
		comp += rhs.comp;
		val = (val * rhs.val) % MOD;
	}
	bool operator>(const node& rhs) const {
		if(comp > rhs.comp) return true;
		if(val > rhs.val) return true;
		return false;
	}
} t[2*N], lz[2*N];

void build(int i, int l, int r) {
	if(l == r) return;
	int mid = l+r >> 1;
	build(i<<1, l, mid);
	build(i<<1|1, mid+1, r);
	if(t[i<<1] > t[i<<1|1]) t[i] = t[i<<1];
	else t[i] = t[i<<1|1];
}

void apply(int i) {
	t[i].merge(lz[i]);
	if(i < N) {
		lz[i<<1].merge(lz[i]);
		lz[i<<1|1].merge(lz[i]);
	}
	lz[i].lazy_needed = false;
	lz[i].comp = 0, lz[i].val = 1;
}

void update(int i, int l, int r, int tl, int tr, node v) {
	if(lz[i].lazy_needed) apply(i);
	if(l > tr || r < tl) return;
	if(l >= tl && r <= tr) {
		lz[i].merge(v);
		apply(i);
		return;
	}
	int mid = l+r >> 1;
	update(i<<1, l, mid, tl, tr, v);
	update(i<<1|1, mid+1, r, tl, tr, v);
	if(t[i<<1] > t[i<<1|1]) t[i] = t[i<<1];
	else t[i] = t[i<<1|1];
}

int n, x[N], y[N];
int init(int _n, int _x[], int _y[]) {
	n = _n;
	copy(_x, _x+n, x);
	copy(_y, _y+n, y);
	node curr = {0, 1, 0};
	for(int i = 0; i < n; i++) {
		curr.merge((node) {(long double) log2(x[i]), x[i]});
		t[N+i] = curr;
		t[N+i].merge((node) {(long double) log2(y[i]), y[i]});
	}
	build(1, 0, N-1);
	return t[1].val;
}

int updateX(int pos, int val) {	
	long double ncomp = (long double) log2(val) - log2(x[pos]);
	ll nval = 1ll * val * modPow(x[pos], MOD-2) % MOD;
	update(1, 0, N-1, pos, N-1, (node) {ncomp, nval});
	return t[1].val;
}

int updateY(int pos, int val) {
	long double ncomp = (long double) log2(val) - log2(y[pos]);
	ll nval = 1ll * val * modPow(y[pos], MOD-2) % MOD;
	update(1, 0, N-1, pos, pos, (node) {ncomp, nval});
	return t[1].val;
}

Compilation message (stderr)

horses.cpp: In function 'void build(int, int, int)':
horses.cpp:32:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1;
             ^
horses.cpp: In function 'void update(int, int, int, int, int, node)':
horses.cpp:57:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1;
             ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:71:52: warning: missing initializer for member 'node::lazy_needed' [-Wmissing-field-initializers]
   curr.merge((node) {(long double) log2(x[i]), x[i]});
                                                    ^
horses.cpp:73:54: warning: missing initializer for member 'node::lazy_needed' [-Wmissing-field-initializers]
   t[N+i].merge((node) {(long double) log2(y[i]), y[i]});
                                                      ^
horses.cpp:76:14: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return t[1].val;
              ^
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:82:49: warning: missing initializer for member 'node::lazy_needed' [-Wmissing-field-initializers]
  update(1, 0, N-1, pos, N-1, (node) {ncomp, nval});
                                                 ^
horses.cpp:83:14: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return t[1].val;
              ^
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:89:49: warning: missing initializer for member 'node::lazy_needed' [-Wmissing-field-initializers]
  update(1, 0, N-1, pos, pos, (node) {ncomp, nval});
                                                 ^
horses.cpp:90:14: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return t[1].val;
              ^
#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...