Submission #30846

#TimeUsernameProblemLanguageResultExecution timeMemory
30846inqrHorses (IOI15_horses)C++14
100 / 100
1113 ms76264 KiB
#include "horses.h" #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define rt insert #define st first #define nd second #define ll long long #define pii pair < int , int > #define DB printf("debug\n"); #define umax( x , y ) x = max( x , (y) ) #define umin( x , y ) x = min( x , (y) ) #define all(x) x.begin() , x.end() #define MAXN 500005 #define MOD (ll)1000000007 using namespace std; int n; ll x[MAXN],y[MAXN]; pair<double,ll> st[4*MAXN]; pair<double,ll> lz[4*MAXN]; pair<double,ll> merge(pair<double,ll> a,pair<double,ll> b){ return {a.st+b.st,(a.nd*b.nd+MOD)%MOD}; } void lz_upd(int l,int r,int stp){ st[stp]=merge(st[stp],lz[stp]); if(l!=r){ lz[stp*2]=merge(lz[stp*2],lz[stp]); lz[stp*2+1]=merge(lz[stp*2+1],lz[stp]); } lz[stp]={0,1}; } void upd(int ul,int ur,double uv1,ll uv2,int l,int r,int stp){ lz_upd(l,r,stp); if(ur<l||r<ul)return; if(ul<=l&&r<=ur){ lz[stp]={uv1,uv2}; lz_upd(l,r,stp); return; } int m=(l+r)/2; upd(ul,ur,uv1,uv2,l,m,stp*2);upd(ul,ur,uv1,uv2,m+1,r,stp*2+1); st[stp]=max(st[stp*2],st[stp*2+1]); } void build(int l,int r,int stp){ if(l==r){ st[stp]=lz[stp]={0,1}; return; } st[stp]=lz[stp]={0,1}; int m=(l+r)/2; build(l,m,stp*2);build(m+1,r,stp*2+1); } ll invert(ll base){ ll res=1; ll exp=MOD-2; while(exp>0){ if(exp&1){ res*=base; res%=MOD; } base*=base; base%=MOD; exp/=2; } return res; } int init(int N, int X[], int Y[]) { n=N; for(int i=0;i<n;i++)x[i]=X[i],y[i]=Y[i]; build(0,n-1,1); for(int i=0;i<n;i++){ upd(i,n-1,(double)log2(x[i]),x[i],0,n-1,1); upd(i,i,(double)log2(y[i]),y[i],0,n-1,1); } return st[1].nd; } int updateX(int pos, int val){ upd(pos,n-1,-(double)log2(x[pos]),invert(x[pos]),0,n-1,1); x[pos]=val; upd(pos,n-1,(double)log2(x[pos]),x[pos],0,n-1,1); return st[1].nd; } int updateY(int pos, int val) { upd(pos,pos,-(double)log2(y[pos]),invert(y[pos]),0,n-1,1); y[pos]=val; upd(pos,pos,(double)log2(y[pos]),y[pos],0,n-1,1); return st[1].nd; }

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:7:12: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
 #define nd second
            ^
horses.cpp:79:15: note: in expansion of macro 'nd'
  return st[1].nd;
               ^
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:7:12: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
 #define nd second
            ^
horses.cpp:85:15: note: in expansion of macro 'nd'
  return st[1].nd;
               ^
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:7:12: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
 #define nd second
            ^
horses.cpp:91:15: note: in expansion of macro 'nd'
  return st[1].nd;
               ^
#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...