제출 #1103671

#제출 시각아이디문제언어결과실행 시간메모리
1103671Pioneer말 (IOI15_horses)C++17
34 / 100
1581 ms54688 KiB
#include "horses.h"
#include <bits/stdc++.h>

#define ll long long
using namespace std;

const ll inf=1e9;
const int mod=1e9+7;
const int MAX=5e6+10;

int x[MAX];
int y[MAX];

struct segtree{
	pair<int,bool> t[4*MAX];

	pair<int,bool> mrg(pair<int,bool> a,pair<int,bool> b){
		pair<int,bool> res={(int)(a.first*1ll*b.first%mod),(a.second|b.second)};
		if(a.first*1ll*b.first>=mod){
			res.second=1;
		}
		return res;
	}

	void build(int v,int tl,int tr){
		if(tl==tr){
			t[v]={x[tl],0};
			return;
		}
		int tm=(tl+tr)/2;
		build(2*v,tl,tm);
		build(2*v+1,tm+1,tr);
		t[v]=mrg(t[2*v],t[2*v+1]);
	}

	void update(int v,int tl,int tr,int pos,int x){
		if(tl==tr){
			t[v]={x,0};
			return;
		}
		int tm=(tl+tr)/2;
		if(pos<=tm)update(2*v,tl,tm,pos,x);
		else update(2*v+1,tm+1,tr,pos,x);
		t[v]=mrg(t[2*v],t[2*v+1]);
	}


	pair<int,bool> get(int v,int tl,int tr,int l,int r){
		if(l>r||tl>r||l>tr)return {1,0};
		if(l<=tl&&tr<=r)return t[v];
		int tm=(tl+tr)/2;
		return mrg(get(2*v,tl,tm,l,r),get(2*v+1,tm+1,tr,l,r));
	}
}tx;


struct segtreeMx{
	pair<int,int> t[MAX];

	pair<int,int> mrg(pair<int,int> a,pair<int,int> b){
		if(a.first>=b.first)return a;
		else return b;
	}

	void build(int v,int tl,int tr){
		if(tl==tr){
			t[v]={y[tl],tl};
			return;
		}
		int tm=(tl+tr)/2;
		build(2*v,tl,tm);
		build(2*v+1,tm+1,tr);
		t[v]=mrg(t[2*v],t[2*v+1]);
	}

	void update(int v,int tl,int tr,int pos,int x){
		if(tl==tr){
			t[v]={x,tl};
			return;
		}
		int tm=(tl+tr)/2;
		if(pos<=tm)update(2*v,tl,tm,pos,x);
		else update(2*v+1,tm+1,tr,pos,x);
		t[v]=mrg(t[2*v],t[2*v+1]);
	}

	pair<int,int> get(int v,int tl,int tr,int l,int r){
		if(l>r||tl>r||l>tr)return {0,0};
		if(l<=tl&&tr<=r)return t[v];
		int tm=(tl+tr)/2;
		return mrg(get(2*v,tl,tm,l,r),get(2*v+1,tm+1,tr,l,r));
	}
}ty;

int n;
set<int> st;

int get(int pos){
	int ans=1;
	for(int i=1;i<=pos;i++)ans=(int)(ans*1ll*x[i]%mod);
	assert(ans==tx.get(1,1,n,1,pos).first);
	return ans*1ll*y[pos]%mod;
	return tx.get(1,1,n,1,pos).first*1ll*y[pos]%mod;
}

int get(){
	{
		int pos=n;
		int per=x[n]*1ll*y[n]%mod;
		bool bf=0;
		if(x[n]*1ll*y[n]>=mod)bf=1;
		for(int i=n-1;i>=max(1,n-1000);i--){
			if(!bf&&y[i]>=per){
				pos=i;
				per=y[i];
				bf=0;
			}
			if(per*1ll*x[i]>=mod){
				bf=1;
			}
			per=per*1ll*x[i]%mod;
		}
		return get(pos);
	}
	st.insert(1);
	vector<int> vec;
	int pos=ty.get(1,1,n,*st.rbegin(),n).second;
	vec.push_back(*st.rbegin());
	st.erase(--st.end());
	while(!st.empty()){
		int pos1=ty.get(1,1,n,*st.rbegin(),vec.back()-1).second;
		vec.push_back(*st.rbegin());
		st.erase(--st.end());
		pair<int,bool> bf=tx.get(1,1,n,pos1+1,pos);
		if(bf.second||bf.first*1ll*y[pos]>=mod)break;
		if(bf.first*y[pos]<=y[pos1])pos=pos1;
	}
	for(int x:vec)st.insert(x);
	return get(pos);
}

int init(int N, int X[], int Y[]) {
	// cout<<"! "<<N<<"\n";
	n=N;
	for(int i=0;i<N;i++){
		y[i+1]=Y[i];
		x[i+1]=X[i];
		if(X[i]!=1){
			st.insert(i+1);
		}
	}
	n=N;
	tx.build(1,1,n);
	ty.build(1,1,n);
	return get();
}

int updateX(int pos, int val) {	
	// return 0;
	pos++;
	if(x[pos]!=1)st.erase(pos);
	x[pos]=val;
	tx.update(1,1,n,pos,val);
	if(x[pos]!=1)st.insert(pos);
	return get();
}

int updateY(int pos, int val) {
	// return 0;
	pos++;
	y[pos]=val;
	ty.update(1,1,n,pos,val);
	return get();
}

컴파일 시 표준 에러 (stderr) 메시지

horses.cpp: In member function 'void segtree::update(int, int, int, int, int)':
horses.cpp:36:46: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   36 |  void update(int v,int tl,int tr,int pos,int x){
      |                                          ~~~~^
horses.cpp:11:5: note: shadowed declaration is here
   11 | int x[MAX];
      |     ^
horses.cpp: In member function 'void segtreeMx::update(int, int, int, int, int)':
horses.cpp:76:46: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   76 |  void update(int v,int tl,int tr,int pos,int x){
      |                                          ~~~~^
horses.cpp:11:5: note: shadowed declaration is here
   11 | int x[MAX];
      |     ^
horses.cpp: In function 'int get(int)':
horses.cpp:102:23: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  102 |  return ans*1ll*y[pos]%mod;
      |         ~~~~~~~~~~~~~~^~~~
horses.cpp:103:45: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  103 |  return tx.get(1,1,n,1,pos).first*1ll*y[pos]%mod;
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
horses.cpp: In function 'int get()':
horses.cpp:109:24: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  109 |   int per=x[n]*1ll*y[n]%mod;
      |           ~~~~~~~~~~~~~^~~~
horses.cpp:121:20: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  121 |    per=per*1ll*x[i]%mod;
      |        ~~~~~~~~~~~~^~~~
horses.cpp:138:10: warning: declaration of 'x' shadows a global declaration [-Wshadow]
  138 |  for(int x:vec)st.insert(x);
      |          ^
horses.cpp:11:5: note: shadowed declaration is here
   11 | int x[MAX];
      |     ^
#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...