답안 #304970

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
304970 2020-09-22T09:57:27 Z baluteshih 식물 비교 (IOI20_plants) C++14
27 / 100
1130 ms 17388 KB
#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define X first
#define Y second
#define ALL(v) v.begin(),v.end()
#define SZ(a) ((int)a.size())
#define pb push_back

int seg1[800005],seg2[800005],lazy1[800005],lazy2[800005];
int layer[400005],L[200005],R[200005];

void build(int l,int r,int rt,const vector<int> &v,int *seg)
{
    if(l==r)
        return seg[rt]=v[l],void();
    int mid=(l+r)>>1;
    build(l,mid,rt<<1,v,seg),build(mid+1,r,rt<<1|1,v,seg);
    seg[rt]=min(seg[rt<<1],seg[rt<<1|1]);
}

void down(int rt,int *seg,int *lazy)
{
    if(lazy[rt])
    {
        seg[rt<<1]+=lazy[rt],lazy[rt<<1]+=lazy[rt];
        seg[rt<<1|1]+=lazy[rt],lazy[rt<<1|1]+=lazy[rt];
        lazy[rt]=0;
    }
}

void modify(int L,int R,int l,int r,int rt,int val,int *seg,int *lazy)
{
    if(l!=r) down(rt,seg,lazy);
    if(L<=l&&R>=r)
        return lazy[rt]+=val,seg[rt]+=val,void();
    int mid=(l+r)>>1;
    if(L<=mid)
        modify(L,R,l,mid,rt<<1,val,seg,lazy);
    if(R>mid)
        modify(L,R,mid+1,r,rt<<1|1,val,seg,lazy);
    seg[rt]=min(seg[rt<<1],seg[rt<<1|1]);
}

int query(int l,int r,int rt,int *seg,int *lazy)
{
    if(l!=r) down(rt,seg,lazy);
    if(l==r)
        return l;
    int mid=(l+r)>>1;
    if(seg[rt<<1]<=seg[rt<<1|1])
        return query(l,mid,rt<<1,seg,lazy);
    return query(mid+1,r,rt<<1|1,seg,lazy);
}

void dfs(int l,int r,int rt,int *seg,int *lazy,vector<int> &rst)
{
    if(l!=r) down(rt,seg,lazy);
    if(l==r)
        return rst.pb(l);
    int mid=(l+r)>>1;
    if(seg[rt<<1]==0)
        dfs(l,mid,rt<<1,seg,lazy,rst);
    if(seg[rt<<1|1]==0)
        dfs(mid+1,r,rt<<1|1,seg,lazy,rst);
}

const int INF=1e9;
int arr[200005],K,n;

void init(int k, vector<int> r)
{
    n=SZ(r),K=k;
	build(0,n-1,1,r,seg1),build(0,n-1,1,vector<int>(n,INF),seg2);
    for(int i=0,ly=0;i<n;++ly)
    {
        while(seg1[1]==0)
        {
            int u=query(0,n-1,1,seg1,lazy1);
            modify(u,u,0,n-1,1,INF,seg1,lazy1),modify(u,u,0,n-1,1,-INF,seg2,lazy2);
            if(u+k<=n)
                modify(u+1,u+k-1,0,n-1,1,1,seg2,lazy2);
            else
            {
                if(u<n-1)
                    modify(u+1,n-1,0,n-1,1,1,seg2,lazy2);
                modify(0,k-n+u-1,0,n-1,1,1,seg2,lazy2);
            }
        }
        vector<int> rst;
        dfs(0,n-1,1,seg2,lazy2,rst);
        for(int u:rst)
        {
            if(u>=k-1)
                modify(u-k+1,u,0,n-1,1,-1,seg1,lazy1);
            else
                modify(0,u,0,n-1,1,-1,seg1,lazy1),modify(n-(k-u-1),n-1,0,n-1,1,-1,seg1,lazy1);
            if(u+k<=n)
                modify(u+1,u+k-1,0,n-1,1,-1,seg2,lazy2);
            else
            {
                if(u<n-1)
                    modify(u+1,n-1,0,n-1,1,-1,seg2,lazy2);
                modify(0,k-n+u-1,0,n-1,1,-1,seg2,lazy2);
            }
            modify(u,u,0,n-1,1,INF,seg2,lazy2);
            layer[u]=ly;
        }
        i+=SZ(rst);
    }
    for(int i=0;i<n;++i)
        layer[i+n]=layer[i];
    vector<int> st;
    for(int i=0;i<n;++i)
    {
        while(!st.empty()&&layer[i]<layer[st.back()])
            st.pop_back();
        st.pb(i);
    }
    for(int i=n;i<2*n;++i)
    {
        while(!st.empty()&&layer[i]<layer[st.back()])
            st.pop_back();
        L[i-n]=st.back()-n+1,st.pb(i);
    }
    st.clear();
    for(int i=2*n-1;i>=n;--i)
    {
        while(!st.empty()&&layer[i]<layer[st.back()])
            st.pop_back();
        st.pb(i);
    }
    for(int i=n-1;i>=0;--i)
    {
        while(!st.empty()&&layer[i]<layer[st.back()])
            st.pop_back();
        R[i]=st.back()-1,st.pb(i);
    }
    for(int i=0;i<n;++i)
        L[i]=min(L[i],i-k+1),R[i]=max(R[i],i+k-1);
    /*for(int i=0;i<n;++i)
        cout << layer[i] << " \n"[i+1==n];
    for(int i=0;i<n;++i)
        cout << "[" << L[i] << "," << R[i] << "]" << " \n"[i+1==n];*/
}

int compare_plants(int x, int y)
{
    if(layer[x]==layer[y]) return 0;
    int rt=1;
    if(layer[x]>layer[y])
        swap(x,y),rt=-1;
    if((L[x]<=y&&y<=R[x])||(L[x]<=y-n&&y-n<=R[x])||(L[x]<=y+n&&y+n<=R[x]))
        return rt;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 5 ms 512 KB Output is correct
7 Correct 87 ms 3576 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 4 ms 512 KB Output is correct
10 Correct 88 ms 3612 KB Output is correct
11 Correct 86 ms 3576 KB Output is correct
12 Correct 81 ms 3832 KB Output is correct
13 Correct 86 ms 3704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 5 ms 512 KB Output is correct
7 Correct 87 ms 3576 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 4 ms 512 KB Output is correct
10 Correct 88 ms 3612 KB Output is correct
11 Correct 86 ms 3576 KB Output is correct
12 Correct 81 ms 3832 KB Output is correct
13 Correct 86 ms 3704 KB Output is correct
14 Correct 149 ms 4828 KB Output is correct
15 Correct 1130 ms 15716 KB Output is correct
16 Correct 148 ms 4828 KB Output is correct
17 Correct 1112 ms 15720 KB Output is correct
18 Correct 773 ms 17384 KB Output is correct
19 Correct 782 ms 17388 KB Output is correct
20 Correct 1048 ms 15692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 75 ms 3320 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 1 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 1 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -