답안 #307103

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
307103 2020-09-27T04:50:51 Z rrrr10000 식물 비교 (IOI20_plants) C++14
44 / 100
1066 ms 30056 KB
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n)  for(long long i=0;i<(long long)(n);i++)
#define REP(i,k,n) for(long long i=k;i<(long long)(n);i++)
#define all(a) a.begin(),a.end()
#define pb emplace_back
#define eb emplace_back
#define lb(v,k) (lower_bound(all(v),k)-v.begin())
#define ub(v,k) (upper_bound(all(v),k)-v.begin())
#define fi first
#define se second
#define pi M_PI
#define PQ(T) priority_queue<T>
#define SPQ(T) priority_queue<T,vector<T>,greater<T>>
#define dame(a) {out(a);return 0;}
#define decimal cout<<fixed<<setprecision(15);
#define dupli(a) {sort(all(a));a.erase(unique(all(a)),a.end());}
typedef long long ll;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> PP;
typedef tuple<ll,ll,ll,ll> PPP;
typedef multiset<ll> S;
using vi=vector<ll>;
using vvi=vector<vi>;
using vvvi=vector<vvi>;
using vvvvi=vector<vvvi>;
using vp=vector<P>;
using vvp=vector<vp>;
using vb=vector<bool>;
using vvb=vector<vb>;
const ll inf=1001001001001001001;
const ll INF=1001001001;
const ll mod=1000000007;
const double eps=1e-10;
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<class T> void out(T a){cout<<a<<'\n';}
template<class T> void outp(T a){cout<<'('<<a.fi<<','<<a.se<<')'<<'\n';}
template<class T> void outvp(T v){rep(i,v.size())cout<<'('<<v[i].fi<<','<<v[i].se<<')';cout<<'\n';}
template<class T> void outvvp(T v){rep(i,v.size())outvp(v[i]);}
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<'\n';}
template<class T> void outvv(T v){rep(i,v.size())outv(v[i]);}
template<class T> bool isin(T x,T l,T r){return (l)<=(x)&&(x)<=(r);}
template<class T> void yesno(T b){if(b)out("yes");else out("no");}
template<class T> void YesNo(T b){if(b)out("Yes");else out("No");}
template<class T> void YESNO(T b){if(b)out("YES");else out("NO");}
template<class T> void noyes(T b){if(b)out("no");else out("yes");}
template<class T> void NoYes(T b){if(b)out("No");else out("Yes");}
template<class T> void NOYES(T b){if(b)out("NO");else out("YES");}
void outs(ll a,ll b){if(a>=inf-100)out(b);else out(a);}
ll gcd(ll a,ll b){if(b==0)return a;return gcd(b,a%b);}
ll modpow(ll a,ll b){ll res=1;a%=mod;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
#include "plants.h"
typedef set<ll>::iterator iter;
vi ans;
set<ll> s;
ll n,k;
ll dif(iter i,iter j){
    if(*i>*j)return *i-*j;
    return n+*i-*j;
}
iter mi(iter itr){
    if(itr==s.begin())itr=s.end();itr--;
    return itr;
}
iter pl(iter itr){
    itr++;if(itr==s.end())itr=s.begin();
    return itr;
}
bool check(ll i){
    auto itr=s.lower_bound(i);
    auto i1=mi(itr);
    if(dif(itr,i1)>=k)return true;
    return false;
}
ll N=1;
vp segmi;
vi lazy;
void INIT(vector<int> v){
    while(N<v.size())N*=2;
    segmi=vp(N*2-1);
    lazy=vi(N*2-1);
    rep(i,v.size())segmi[i+N-1]=P(v[i],i);
    for(int i=N-2;i>=0;i--)segmi[i]=min(segmi[i*2+1],segmi[i*2+2]);
}
void eval(int k,int l,int r){
    if(lazy[k]==0)return;
    segmi[k].fi+=lazy[k];
    if(r-l>1){
        lazy[k*2+1]+=lazy[k];
        lazy[k*2+2]+=lazy[k];
    }
    lazy[k]=0;
}
void add(int a,int b,int k,int l,int r,ll x){
    if(a<0){
        add(0,b,k,l,r,x);add(n+a,n,k,l,r,x);return;
    }
    eval(k,l,r);
    if(r<=a||b<=l)return;
    if(a<=l&&r<=b){
        lazy[k]+=x;
        eval(k,l,r);
    }
    else{
        add(a,b,k*2+1,l,(l+r)/2,x);
        add(a,b,k*2+2,(l+r)/2,r,x);
        segmi[k]=min(segmi[k*2+1],segmi[k*2+2]);
    }
}
P getmi(int a,int b,int k,int l,int r){
    if(a<0)return min(getmi(0,b,k,l,r),getmi(n+a,n,k,l,r));
    eval(k,l,r);
    if(a<=l&&r<=b)return segmi[k];
    if(r<=a||b<=l)return P(inf,-1);
    P c1=getmi(a,b,k*2+1,l,(l+r)/2);
    P c2=getmi(a,b,k*2+2,(l+r)/2,r);
    return min(c1,c2);
}
void init(int K,vector<int> r){
    n=r.size();k=K;ll cnt=0;
    ans=vi(n,-1);
    vi v;
    rep(i,n)if(r[i]==0){
        r[i]=INF;
        s.insert(i);
        v.pb(i);
    }
    INIT(r);
    rep(i,n){
        auto i1=s.begin(),i2=i1;
        i2++;
        ll ne;
        if(s.size()==1)ne=*s.begin();
        else{
            while(true){
                ll x=v.back();
                v.pop_back();
                if(ans[x]!=-1)continue;
                if(check(x)){ne=x;v.pb(*pl(s.lower_bound(x)));break;}
            }
        }
        ans[ne]=cnt++;
        s.erase(ne);
        add(ne-k+1,ne,0,0,N,-1);
        while(true){
            P p=getmi(ne-k+1,ne,0,0,N);
            if(p.fi!=0)break;
            add(p.se,p.se+1,0,0,N,INF);
            s.insert(p.se);
            v.pb(p.se);
        }
    }
}
int compare_plants(int x,int y){
    if(ans[x]<ans[y])return 1;
    return -1;
}

Compilation message

plants.cpp: In function 'iter mi(iter)':
plants.cpp:63:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   63 |     if(itr==s.begin())itr=s.end();itr--;
      |     ^~
plants.cpp:63:35: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   63 |     if(itr==s.begin())itr=s.end();itr--;
      |                                   ^~~
plants.cpp: In function 'void INIT(std::vector<int>)':
plants.cpp:80:12: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     while(N<v.size())N*=2;
      |           ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Incorrect 0 ms 256 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 0 ms 256 KB Output is correct
5 Correct 1 ms 256 KB Output is correct
6 Correct 4 ms 512 KB Output is correct
7 Correct 82 ms 3704 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 4 ms 512 KB Output is correct
10 Correct 81 ms 3704 KB Output is correct
11 Correct 77 ms 3704 KB Output is correct
12 Correct 77 ms 3832 KB Output is correct
13 Correct 86 ms 3836 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 0 ms 256 KB Output is correct
5 Correct 1 ms 256 KB Output is correct
6 Correct 4 ms 512 KB Output is correct
7 Correct 82 ms 3704 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 4 ms 512 KB Output is correct
10 Correct 81 ms 3704 KB Output is correct
11 Correct 77 ms 3704 KB Output is correct
12 Correct 77 ms 3832 KB Output is correct
13 Correct 86 ms 3836 KB Output is correct
14 Correct 159 ms 5152 KB Output is correct
15 Correct 1028 ms 21352 KB Output is correct
16 Correct 158 ms 5160 KB Output is correct
17 Correct 1066 ms 20160 KB Output is correct
18 Correct 702 ms 24332 KB Output is correct
19 Correct 689 ms 21228 KB Output is correct
20 Correct 1012 ms 21224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 69 ms 3320 KB Output is correct
4 Correct 489 ms 22508 KB Output is correct
5 Correct 594 ms 21732 KB Output is correct
6 Correct 767 ms 21352 KB Output is correct
7 Correct 914 ms 20328 KB Output is correct
8 Correct 1024 ms 19972 KB Output is correct
9 Correct 520 ms 22492 KB Output is correct
10 Correct 548 ms 20096 KB Output is correct
11 Correct 366 ms 30056 KB Output is correct
12 Correct 490 ms 21352 KB Output is correct
13 Correct 602 ms 26728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Incorrect 0 ms 256 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Incorrect 0 ms 256 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Incorrect 0 ms 256 KB Output isn't correct
5 Halted 0 ms 0 KB -