Submission #304882

# Submission time Handle Problem Language Result Execution time Memory
304882 2020-09-22T06:22:43 Z baluteshih Comparing Plants (IOI20_plants) C++14
44 / 100
1105 ms 13544 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[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)
    //    cout << layer[i] << " \n"[i+1==n];
}

int compare_plants(int x, int y)
{
    if(layer[x]==layer[y]) return 0;
    if(layer[x]<layer[y]) return 1;
    return -1;
    int rt=1;
    if(layer[x]>layer[y]) swap(x,y),rt=-1;
    if((y>x&&x+K>y)||(y<x&&x+K>y+n))
        return rt;
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 5 ms 644 KB Output is correct
7 Correct 85 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 85 ms 3576 KB Output is correct
11 Correct 83 ms 3448 KB Output is correct
12 Correct 83 ms 3704 KB Output is correct
13 Correct 83 ms 3528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 5 ms 644 KB Output is correct
7 Correct 85 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 85 ms 3576 KB Output is correct
11 Correct 83 ms 3448 KB Output is correct
12 Correct 83 ms 3704 KB Output is correct
13 Correct 83 ms 3528 KB Output is correct
14 Correct 142 ms 4572 KB Output is correct
15 Correct 1105 ms 13448 KB Output is correct
16 Correct 147 ms 4700 KB Output is correct
17 Correct 1100 ms 13288 KB Output is correct
18 Correct 768 ms 13228 KB Output is correct
19 Correct 770 ms 13288 KB Output is correct
20 Correct 987 ms 13412 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 75 ms 3320 KB Output is correct
4 Correct 550 ms 13160 KB Output is correct
5 Correct 674 ms 13288 KB Output is correct
6 Correct 908 ms 13412 KB Output is correct
7 Correct 1008 ms 13412 KB Output is correct
8 Correct 1099 ms 13412 KB Output is correct
9 Correct 588 ms 13284 KB Output is correct
10 Correct 604 ms 13288 KB Output is correct
11 Correct 501 ms 12264 KB Output is correct
12 Correct 595 ms 13412 KB Output is correct
13 Correct 757 ms 13544 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Incorrect 1 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 0 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -