Submission #1133792

#TimeUsernameProblemLanguageResultExecution timeMemory
1133792t9unkubjHorses (IOI15_horses)C++20
Compilation error
0 ms0 KiB
#ifdef t9unkubj #include"debug.cpp" //#include"template_no_debug.h" #else #include "horses.h" #define dbg(...) 199958 #endif #pragma GCC optimize("O3") using namespace std; #include<bits/stdc++.h> using ll=long long; using ull=unsigned long long; template<class T>using vc=vector<T>; template<class T>using vvc=vc<vc<T>>; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++) #define DREP(i,n,m) for(ll i=(n);i>=(m);i--) #define drep(i,n) for(ll i=((n)-1);i>=0;i--) #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() template<class T,class F> bool chmin(T &x, F y){ if(x>y){ x=y; return true; } return false; } template<class T, class F> bool chmax(T &x, F y){ if(x<y){ x=y; return true; } return false; } double pass_time=0; template<class T,class G,class F> F modpow(T x,G p,F m){ T ret=1%m; x%=m; while(p){ if(p&1)ret=(1ll*ret*x)%m; x=(1ll*x*x)%m; p>>=1; } return ret; } template<class T> T extgcd(T a,T b,T&x,T&y){//ax+by=gcd(a,b)となるようなもの if(b==0){ x=1; y=0; return a; }else{ T res=extgcd(b,a%b,y,x); y-=(a/b)*x; return res; } } template<class T> pair<T,T> inv(T x,T m){ T a1,a2; T res=extgcd(x,m,a1,a2); return {a1,m/res}; } constexpr int mod=1e9+7; struct mint{ long long val; inline long long fast(long long x){ if(x<mod&&x>=0)return x; x%=mod; if(x<0)x+=mod; return x; } mint():val(0){} mint(long long val):val(fast(val)){} mint power(long long m)const { mint res(1); mint ret(*this); while(m){ if(m&1)res*=ret; ret*=ret; m>>=1; } return res; } mint& operator++() { val++; if (val == mod) val = 0; return *this; } mint& operator--() { if (val == 0)val=mod; val--; return *this; } mint operator++(int) { mint result = *this; ++*this; return result; } mint operator--(int) { mint result = *this; --*this; return result; } mint operator-() const { return mint(-val); } friend mint operator +(const mint&a,const mint&b) noexcept{ return mint(a)+=b; } friend mint operator -(const mint&a,const mint&b) noexcept{ return mint(a)-=b; } friend mint operator *(const mint&a,const mint&b) noexcept{ return mint(a)*=b; } friend mint operator /(const mint&a,const mint&b) noexcept{ return mint(a)/=b; } mint& operator+=(const mint&a)noexcept{ val+=a.val; if(val>=mod)val-=mod; return *this; } mint& operator-=(const mint&a)noexcept{ val-=a.val; if(val<0)val+=mod; return *this; } mint& operator*=(const mint&a){ val*=a.val; val=fast(val); return *this; } mint& operator/=(const mint&a){ val*=inv<long long>(a.val,mod).first; val=fast(val); return *this; } bool operator == (const mint&x)const noexcept{ return this->val==x.val; } bool operator != (const mint&x)const noexcept{ return this->val!=x.val; } friend ostream& operator << (ostream &os, const mint &x) noexcept { return os << x.val; } friend istream& operator >> (istream &is, mint &x) noexcept { long long v; is >> v; x=mint(v); return is; } }; vector<mint>fact(1,1),invfact(1,1); void build(int n){ if(n<(int)fact.size())return; fact=invfact=vector<mint>(n+1); fact[0]=1; for(int i=1;i<=n;i++)fact[i]=fact[i-1]*i; invfact[n]=(1/fact[n]); for(int i=n-1;i>=0;i--)invfact[i]=invfact[i+1]*(i+1); } mint C(int a,int b){//aCb if(a<0||b<0||a-b<0)return mint(0); while((int)fact.size()<=a){ fact.push_back(fact.back()*(fact.size())); } while((int)invfact.size()<=a){ invfact.push_back(invfact.back()/invfact.size()); } return fact[a]*invfact[b]*invfact[a-b]; } mint P(int a,int b){ if(a<b||b<0)return 0; return fact[a]*invfact[a-b]; } //a個のものからb個を重複を許して選ぶ mint H(int a,int b){ return C(a+b-1,b); } void print(mint a) { cout << a; } template<class T> pair<T,T> mod_solve(T a,T b,T m){//ax=b mod mとなるxを返す a%=m,b%=m;if(a<0)a+=m;if(b<0)b+=m; T g=gcd(gcd(a,b),m); a/=g,b/=g,m/=g; if(gcd(a,m)>1)return {-1,-1}; return {(inv(a,m).first*b)%m,inv(a,m).second}; } template<class T,auto op> struct segtree{ int n; vc<T>node; T e; segtree(int n,T e):n(n),e(e),node(n*2,e){} void set(int i,T x){ node[i+=n]=x; while(i>>=1)node[i]=op(node[i*2],node[i*2+1]); } T prod(int l,int r){ l+=n,r+=n; T sml=e,smr=e; while(l<r){ if(l&1)sml=op(sml,node[l++]); if(r&1)smr=op(node[--r],smr); l/=2,r/=2; } return op(sml,smr); } }; ll op(ll a,ll b){ return a*b; } mint op2(mint a,mint b){ return a*b; } ll op3(ll a,ll b){ return max(a,b); } using i128=__int128; constexpr int N_=5e5; int x[N_],y[N_]; set<int>non_zero; segtree<ll,op>seg(N_,1); segtree<mint,op2>seg2(N_,1); segtree<ll,op3>ymax(N_,0); int n; mint answer(){ { vc<int>is; ll now=1; for(auto itr=non_zero.rbegin();itr!=non_zero.rend();itr++){ is.push_back(*itr); now*=x[*itr]; if(now>1e9)break; } if(now<=1e9&&x[0]==1){ is.push_back(0); } dbg(is); reverse(all(is)); is.push_back(n); array<i128,3>ans{}; REP(i,1,is.size()){ int l=is[i-1],r=is[i]; //[l,r) if(ans[0]<i128(seg.prod(is[0],r))*ymax.prod(l,r)){ ans={i128(seg.prod(is[0],r))*ymax.prod(l,r),l,r}; } } return ymax.prod(ans[1],ans[2])*seg2.prod(0,ans[2]); } } int init(int N, int X[], int Y[]){ n=N; rep(i,N)x[i]=X[i]; rep(i,N)y[i]=Y[i]; rep(i,N)seg.set(i,x[i]); rep(i,N)seg2.set(i,x[i]); rep(i,N)ymax.set(i,y[i]); rep(i,N){ if(x[i]>1){ non_zero.insert(i); } } return answer().val; } int updateX(int pos, int val) { if(x[pos]!=1){ non_zero.erase(pos); } x[pos]=val; if(x[pos]!=1){ non_zero.insert(pos); } seg.set(pos,val); seg2.set(pos,val); return answer().val; } int updateY(int pos, int val) { ymax.set(pos,val); return answer().val; } namespace judge{ void run(){ int n; cin>>n; int x[n],y[n]; rep(i,n)cin>>x[i]; rep(i,n)cin>>y[i]; dbg(init(n,x,y)); int m; cin>>m; while(m--){ int t,p,v; cin>>t>>p>>v; if(t==1)dbg(updateX(p,v)); else dbg(updateY(p,v)); } } }; int main(){judge::run();} /* 10 100 20 34 40 50 60 60 60 90 100 1 2 3 4 5 6 7 8 8 10 5 1 1 2 1 4 6 1 3 4 1 2 5 1 2 21901010 */

Compilation message (stderr)

/usr/bin/ld: /tmp/ccyZGy6L.o: in function `main':
grader.c:(.text.startup+0x0): multiple definition of `main'; /tmp/cc3jEMx6.o:horses.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status