Submission #51682

#TimeUsernameProblemLanguageResultExecution timeMemory
51682gs13105영역 (JOI16_ho_t4)C++17
15 / 100
100 ms16536 KiB
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <tuple>
#include <iterator>

using namespace std;

struct pos
{
    long long x, y;
    bool operator <(const pos &p) const
    {
        return x != p.x ? x < p.x : y < p.y;
    }
    bool operator ==(const pos &p) const
    {
        return x == p.x && y == p.y;
    }
};

struct eve
{
    long long x, e;
    bool operator <(const eve &a) const
    {
        return x != a.x ? x < a.x : e < a.e;
    }
};

inline long long irem(long long x, long long y)
{
    assert(y != 0);
    y = abs(y);
    return (x % y + y) % y;
}

long long kx, ky;
pair<pos, long long> decom(pos p)
{
    if(kx != 0)
    {
        pos q;
        q.x = irem(p.x, kx);

        long long t = (q.x - p.x) / kx;
        q.y = p.y + t * ky;
        return { q, t };
    }
    if(ky != 0)
    {
        pos q;
        q.y = irem(p.y, ky);

        long long t = (q.y - p.y) / ky;
        q.x = p.x + t * kx;
        return { q, t };
    }
    return { p, 0 };
}

vector<pos> com;
inline long long idx(pos p)
{
    return lower_bound(com.begin(), com.end(), p) - com.begin();
}

char str[100010];
pos arr[100010];

pos base[100010];
long long off[100010];

vector<long long> lis[100010];
const long long dx[4] = { 0, 0, 1, 1 };
const long long dy[4] = { 0, 1, 0, 1 };

int main()
{
    //freopen("in", "r", stdin);
    //freopen("out", "w", stdout);

    long long n, k, i;
    scanf("%lld%lld%s", &n, &k, str);
    
    kx = ky = 0;
    for(i = 0; i <= n; i++)
    {
        arr[i] = { kx, ky };
        if(i == n)
            break;

        if(str[i] == 'E')
            kx++;
        else if(str[i] == 'N')
            ky++;
        else if(str[i] == 'W')
            kx--;
        else
            ky--;
    }

    for(i = 0; i <= n; i++)
    {
        tie(base[i], off[i]) = decom(arr[i]);
        com.push_back(base[i]);
    }
    sort(com.begin(), com.end());
    com.erase(unique(com.begin(), com.end()), com.end());
    long long sz = com.size();

    for(i = 0; i <= n; i++)
        lis[idx(base[i])].push_back(off[i]);
    
    for(i = 0; i < sz; i++)
        sort(lis[i].begin(), lis[i].end());

    long long res = 0;
    for(i = 0; i < sz; i++)
    {
        long long a[4];
        long long b[4];

        bool ok = 1;
        for(long long d = 0; d < 4; d++)
        {
            pos p;
            tie(p, b[d]) = decom({ com[i].x + dx[d], com[i].y + dy[d] });
            a[d] = idx(p);
            if(!(a[d] < com.size() && com[a[d]] == p))
            {
                ok = 0;
                break;
            }
        }
        if(!ok)
            continue;

        vector<eve> v;
        for(long long d = 0; d < 4; d++)
        {
            for(long long l : lis[a[d]])
            {
                v.push_back({ l - b[d], d + 1 });
                v.push_back({ l - b[d] + k, -(d + 1) });
            }
        }
        sort(v.begin(), v.end());

        long long s[4];
        memset(s, 0, sizeof s);

        long long cnt = 0;
        bool inr = 0;
        long long sta;
        for(long long j = 0; j < v.size(); j++)
        {
            eve t = v[j];
            if(t.e > 0)
            {
                t.e--;
                s[t.e]++;
                if(s[t.e] == 1)
                    cnt++;
            }
            else
            {
                t.e = -t.e - 1;
                s[t.e]--;
                if(s[t.e] == 0)
                    cnt--;
            }

            if(j == (long long)v.size() - 1 || t.x != v[j + 1].x)
            {
                if(!inr && cnt == 4)
                {
                    inr = 1;
                    sta = t.x;
                }
                else if(inr && cnt != 4)
                {
                    inr = 0;
                    res += t.x - sta;
                }
            }
        }
    }

    printf("%lld\n", res);
    return 0;
}

Compilation message (stderr)

2016_ho_t4.cpp: In function 'int main()':
2016_ho_t4.cpp:141:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(!(a[d] < com.size() && com[a[d]] == p))
                  ~~~~~^~~~~~~~~~~~
2016_ho_t4.cpp:167:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(long long j = 0; j < v.size(); j++)
                              ~~^~~~~~~~~~
2016_ho_t4.cpp:95:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld%lld%s", &n, &k, str);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
2016_ho_t4.cpp:195:32: warning: 'sta' may be used uninitialized in this function [-Wmaybe-uninitialized]
                     res += t.x - sta;
                            ~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...