Submission #404135

#TimeUsernameProblemLanguageResultExecution timeMemory
404135SavicS말 (IOI15_horses)C++14
17 / 100
743 ms65588 KiB
#include "horses.h"

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ff(i,a,b) for(int i=a;i<=b;i++)
#define fb(i,b,a) for(int i=b;i>=a;i--)

using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<ll,ll> pii;
const int maxn = 500005;
const int inf = 1e9 + 5;

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

// os.order_of_key(k) the number of elements in the os less than k
// *os.find_by_order(k)  print the k-th smallest number in os(0-based)

int n;
pii niz[maxn];

struct MXSegTree{
	ll bor[4 * maxn];
	void update(int v, int tl, int tr, int pos, ll val){
		if(tl == tr){
			bor[v] = val;
			return;
		}
		int mid = (tl + tr) / 2;
		if(pos <= mid)update(v * 2, tl, mid, pos, val);
		else update(v * 2 + 1, mid + 1, tr, pos, val);
		bor[v] = max(bor[v * 2], bor[v * 2 + 1]);
	}
	
	ll kveri(int v, int tl, int tr, int l, int r){
		if(tl > r || l > tr)return 0;
		if(tl >= l && tr <= r)return bor[v];
		int mid = (tl + tr) / 2;
		return max(kveri(v * 2, tl, mid, l, r), kveri(v * 2 + 1, mid + 1, tr, l, r));
	}	
	
}MX;

const int mod = 1e9 + 7;
struct MulSegTree{
	ll bor[4 * maxn];
	void update(int v, int tl, int tr, int pos, ll val){
		if(tl == tr){
			bor[v] = val;
			return;
		}
		int mid = (tl + tr) / 2;
		if(pos <= mid)update(v * 2, tl, mid, pos, val);
		else update(v * 2 + 1, mid + 1, tr, pos, val);
		bor[v] = (bor[v * 2] * bor[v * 2 + 1]) % mod;
	}
	
	ll kveri(int v, int tl, int tr, int l, int r){
		if(tl > r || l > tr)return 1;
		if(tl >= l && tr <= r)return bor[v];
		int mid = (tl + tr) / 2;
		return (kveri(v * 2, tl, mid, l, r) * kveri(v * 2 + 1, mid + 1, tr, l, r)) % mod;
	}	
}P;

set<int> s;

ll get(){
	ll cur = 1;
	
	auto it = s.rbegin();
	// u S su mi indeski gde nije 1
	
	vector<int> seg; seg.pb(n + 1);
	while(cur < mod && sz(seg) <= sz(s)){
		cur *= niz[*it].fi, seg.pb(*it);
		it++;
		if(cur >= mod)break;
	}
	
	reverse(all(seg));
	int len = sz(seg);
	
	ll ans = 0; cur = 1;
	ff(i,0,len - 2){
		int A = seg[i]; cur *= niz[A].fi;
		
		ans = max(ans, (cur * MX.kveri(1,1,n,A, seg[i + 1] - 1)));
		
	}
	
	if(sz(seg) > sz(s))return max(ans, MX.bor[1]) % mod;
	else return (ans % mod * P.kveri(1,1,n,1,seg[0] - 1)) % mod;
	
}

int init(int N, int X[], int Y[]) {
	n = N;
	ff(i,1,n)niz[i] = {X[i - 1], Y[i - 1]};
	
	ff(i,1,n){
		MX.update(1,1,n,i,niz[i].se);
		
		if(niz[i].fi != 1)s.insert(i);
		P.update(1,1,n,i,niz[i].fi);
		
	}
	
	return get();
}

int updateX(int pos, int val) {	
	pos++;
	
	if(niz[pos].fi != 1)s.erase(pos);
	niz[pos].fi = val, P.update(1,1,n,pos,niz[pos].fi);
	if(niz[pos].fi != 1)s.insert(pos);
	
	return get();
}

int updateY(int pos, int val) {
	pos++, niz[pos].se = val, MX.update(1,1,n,pos,val);
	return get();
}

//int main()
//{
//    ios::sync_with_stdio(false);
//    cout.tie(nullptr);
//    cin.tie(nullptr);
//	
//	
//    return 0;
//}
/**

3
2 1 3 
3 2 1

3
2 1 3
3 4 1

// probati bojenje sahovski ili slicno

**/

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:119:12: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  119 |  return get();
      |         ~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:129:12: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  129 |  return get();
      |         ~~~^~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:134:12: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  134 |  return get();
      |         ~~~^~
#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...