답안 #597117

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
597117 2022-07-15T14:22:28 Z Apiram 말 (IOI15_horses) C++14
컴파일 오류
0 ms 0 KB
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
struct dataa{
	long long v = 0;
	bool ok = 1;
	void add(long long val){
		v = val;
		//sum += val *(right - left + 1);
	}
};
long long S,T;
struct Segment_Tree{
	vector<dataa>tree;
	void build(long long node,long long left,long long right,vector<long long>&arr,long long n){
		if (left == right){
			tree[node].v  = arr[left];
			return ;
		}
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		build(node + 1,left,mid,arr,n);
		build(z,mid + 1,right,arr,n);
		tree[node] = combine(tree[node + 1],tree[z]);
	}
	void init(long long n,vector<long long>&arr){
		tree.resize(2*n - 1);
		build(0,0,n-1,arr,n);
	}
	dataa combine(dataa left,dataa right){
		dataa res;
		res.v = (left.v * right.v)%mod;
		res.ok = left.ok & right.ok;
		if (res.ok){
			if (left.v * right.v > 1e9)res.ok = false;
		}
		return res;
	}
	dataa query(long long node,long long left,long long right,long long qleft,long long qright){
		if (qright<left|| qleft > right)return {1,1};
		if (qleft<=left && qright>=right){
			return tree[node];
		}
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		return combine(query(node + 1,left,mid,qleft,qright),query(z,mid + 1,right,qleft,qright));
	}
	void update(long long node,long long left,long long right,long long uleft,long long uright,long long v){
		if (left > uright || right < uleft) return;
		if (uleft <= left && right <=uright){
			tree[node].add(v);
			return;
		}
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		if (uleft<=mid){
			update(node + 1,left,mid,uleft,uright,v);
		}
		if (uright > mid){
			update(z,mid + 1,right,uleft,uright,v);
		}
		tree[node] = combine(tree[node + 1],tree[z]);
	}
};

vector<long long>x,y;
Segment_Tree st;
int solve(){
	int N = (int)x.size();
	int ans = 0;
	long long maxxy = y[N - 1],index = N - 1;
	auto temp = st.query(0,0,N - 1,0,N - 1);
	ans = (temp.v * y[N - 1])%mod;
	for (int i = N - 2;i>=0;--i){
		temp = st.query(0,0,N - 1,i + 1,index);
		bool ok = temp.ok;
		//cout<<temp<<" "<<Y[i - 1] / Y[index]<<" "<<i<<" "<<maxxy<<" "<<index<<'\n';
		if (y[i] > maxxy && (ok && temp.v * y[index] <= y[i])){
			maxxy = y[i];
			index = i;
			temp = st.query(0,0,N - 1,0,i);
			ans = (temp.v * y[i])%mod;
		}
	}
	return ans;
}
int init(int N, int X[], int Y[]) {
	for (int i = 0;i<N;++i){
		x.push_back(X[i]);
		y.push_back(Y[i]);
	}
	st.init(N,x);
	return solve();
}

int updateX(int pos, int val) {	
	st.update(0,0,n-1,pos,pos,val);
	return solve();
}

int updateY(int pos, int val) {
	y[pos] = val;
	return solve();
}

Compilation message

horses.cpp: In member function 'dataa Segment_Tree::combine(dataa, dataa)':
horses.cpp:36:15: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
   36 |    if (left.v * right.v > 1e9)res.ok = false;
      |        ~~~~~~~^~~~~~~~~
horses.cpp: In function 'int solve()':
horses.cpp:74:27: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   74 |  ans = (temp.v * y[N - 1])%mod;
      |        ~~~~~~~~~~~~~~~~~~~^~~~
horses.cpp:83:25: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   83 |    ans = (temp.v * y[i])%mod;
      |          ~~~~~~~~~~~~~~~^~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:98:16: error: 'n' was not declared in this scope
   98 |  st.update(0,0,n-1,pos,pos,val);
      |                ^