답안 #409776

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
409776 2021-05-21T13:43:11 Z MKopchev Sky Walking (IOI19_walk) C++14
57 / 100
4000 ms 238100 KB
#include "walk.h"
#include<bits/stdc++.h>

using namespace std;

const int nmax=1e5+42;

set<int> there[nmax];
map<int,int> id[nmax];

vector<long long> dist;

vector< vector< pair<int,int> > > adj;

vector<int> inp;

void add_edge(int x1,int y1,int x2,int y2)
{
    int p=id[x1][y1];
    int q=id[x2][y2];

    int d=abs(inp[x1]-inp[x2])+abs(y1-y2);

    //cout<<"x1= "<<x1<<" y1= "<<y1<<" x2= "<<x2<<" y2= "<<y2<<" d= "<<d<<" p= "<<p<<" q= "<<q<<endl;

    while(adj.size()<=p)adj.push_back({});
    while(adj.size()<=q)adj.push_back({});

    adj[p].push_back({q,d});
    adj[q].push_back({p,d});
}

priority_queue< pair<long long,int> > pq;

int tree[4*nmax];

vector<int> mem_h,mem_l,mem_r,mem_y;

void build(int node,int l,int r)
{
    if(l==r)
    {
        tree[node]=mem_h[l];
        return;
    }

    int av=(l+r)/2;

    build(node*2,l,av);
    build(node*2+1,av+1,r);

    tree[node]=max(tree[node*2],tree[node*2+1]);
}

void push(int i,int j)
{
    //cout<<"push "<<i<<" "<<j<<endl;

    if(mem_l[i]<=j&&j<=mem_r[i])
    {
        if(mem_h[j]>=mem_y[i])
        {
            //cout<<"in"<<endl;
            there[j].insert(mem_y[i]);
        }
    }
}
int query(int node,int l,int r,int lq,int rq)
{
    if(l==lq&&r==rq)return tree[node];

    int av=(l+r)/2;

    int ret=0;

    if(lq<=av)ret=max(ret,query(node*2,l,av,lq,min(av,rq)));
    if(av<rq)ret=max(ret,query(node*2+1,av+1,r,max(av+1,lq),rq));

    return ret;
}

int get_first(int l,int r,int h)
{
    if(l>r)return -1;

    if(query(1,0,mem_h.size()-1,l,r)<h)return -1;

    int ok=r,not_ok=l-1;

    while(ok-not_ok>1)
    {
        int av=(ok+not_ok)/2;

        if(query(1,0,mem_h.size()-1,l,av)<h)not_ok=av;
        else ok=av;
    }
    return ok;
}

int get_last(int l,int r,int h)
{
    if(l>r)return -1;

    if(query(1,0,mem_h.size()-1,l,r)<h)return -1;

    int ok=l,not_ok=r+1;

    while(not_ok-ok>1)
    {
        int av=(ok+not_ok)/2;

        if(query(1,0,mem_h.size()-1,av,r)<h)not_ok=av;
        else ok=av;
    }
    return ok;
}

vector< pair<int,int> > updates[nmax];

long long min_distance(std::vector<int> x, std::vector<int> h, std::vector<int> l, std::vector<int> r, std::vector<int> y, int s, int g) {

    mem_l=l;
    mem_r=r;
    mem_y=y;

    if(s>g)swap(s,g);

    inp=x;
    mem_h=h;

    build(1,0,h.size()-1);

	for(int i=0;i<x.size();i++)
        there[i].insert(0);

	for(int i=0;i<y.size();i++)
    {
        updates[l[i]].push_back({y[i],1});
        updates[r[i]+1].push_back({y[i],-1});

        //cout<<"line: "<<l[i]<<" "<<r[i]<<" "<<y[i]<<endl;

        /*
        for(int j=l[i];j<=r[i];j++)
            if(h[j]>=y[i])
            {
                //cout<<"push "<<j<<" h= "<<y[i]<<endl;

                there[j].insert(y[i]);
                noted[i].insert(j);
            }
        */

        push(i,l[i]);

        push(i,get_last(l[i],s,y[i]));

        push(i,get_first(s,g,y[i]));

        push(i,get_last(s,g,y[i]));

        push(i,get_first(g,r[i],y[i]));

        push(i,r[i]);
    }

    set<int> active={};
    map<int,int> cnt_active={};

    for(int i=0;i<x.size();i++)
    {
        for(auto w:updates[i])
        {
            cnt_active[w.first]+=w.second;

            active.erase(w.first);

            if(cnt_active[w.first])active.insert(w.first);
        }

        set<int> help=there[i];

        for(auto w:help)
        {
            set<int>::iterator it=active.lower_bound(w);

            if(it!=active.begin())
            {
                it--;

                int val=*it;

                if(0<=val&&val<=h[i])there[i].insert(val);

                //cout<<"low "<<*it<<endl;
            }

            it=active.upper_bound(w);

            if(it!=active.end())
            {
                int val=*it;

                if(0<=val&&val<=h[i])there[i].insert(val);

                //cout<<"high "<<*it<<endl;
            }
        }
    }

    int pointer=0;

    for(int i=0;i<x.size();i++)
    {
        for(auto w:there[i])
        {
            id[i][w]=pointer;

            //cout<<"id "<<i<<" "<<w<<" -> "<<pointer<<endl;

            pointer++;
        }
    }

    /*
    cout<<"towers: "<<endl;

    for(int i=0;i<x.size();i++)
    {
        cout<<"i= "<<i<<" : ";

        for(auto w:there[i])
            cout<<w<<" ";

        cout<<endl;
    }
    */

    for(int i=0;i<x.size();i++)
    {
        int prv=0;

        for(auto w:there[i])
        {
            if(w)
            {
                add_edge(i,prv,i,w);
            }

            prv=w;
        }
    }

    //cout<<"-------------"<<endl;

    map<int, vector<int> > seen_by_y={};

    for(int i=0;i<x.size();i++)
    {
        for(auto w:there[i])
            seen_by_y[w].push_back(i);
    }

    map<int, vector< pair<int,int> > > seen_updates_y={};

    for(int i=0;i<y.size();i++)
        seen_updates_y[y[i]].push_back({l[i],r[i]});


    for(auto w:seen_by_y)
    {
        //cout<<l[i]<<" "<<r[i]<<" "<<y[i]<<" :"<<endl;

        vector<int> me=w.second;

        vector<int> pref=me;

        for(auto &t:pref)
            t=0;

        int prv=-1;

        for(auto u:seen_updates_y[w.first])
        {
            int p=lower_bound(me.begin(),me.end(),u.first)-me.begin();
            int q=lower_bound(me.begin(),me.end(),u.second)-me.begin();

            pref[p]++;
            pref[q]--;
        }

        for(int i=1;i<pref.size();i++)
            pref[i]+=pref[i-1];

        for(int i=0;i+1<pref.size();i++)
        {
            if(pref[i])
                add_edge(me[i],w.first,me[i+1],w.first);
        }
    }

    /*
    cout<<"there: "<<endl;
    for(int i=0;i<x.size();i++)
    {
        cout<<i<<" -> ";for(auto j:there[i])cout<<j<<" ";cout<<endl;
    }
    */

    for(int i=0;i<=pointer;i++)
        dist.push_back(-1);

    pq.push({0,id[s][0]});

    while(pq.size())
    {
        pair<long long,int> tp=pq.top();
        pq.pop();

        tp.first=-tp.first;

        if(dist[tp.second]!=-1)continue;

        dist[tp.second]=tp.first;

        //cout<<"dist: "<<tp.second<<" -> "<<tp.first<<endl;

        for(auto w:adj[tp.second])
            pq.push({-(tp.first+w.second),w.first});
    }

    return dist[id[g][0]];
}
/*
int main() {
    int n, m;
	assert(2 == scanf("%d%d", &n, &m));
	vector<int> x(n), h(n);
	for (int i = 0; i < n; i++)
		assert(2 == scanf("%d%d", &x[i], &h[i]));
	vector<int> l(m), r(m), y(m);
	for (int i = 0; i < m; i++)
		assert(3 == scanf("%d%d%d", &l[i], &r[i], &y[i]));
	int s, g;
	assert(2 == scanf("%d%d", &s, &g));
	fclose(stdin);

	long long result = min_distance(x, h, l, r, y, s, g);

	printf("%lld\n", result);
	fclose(stdout);
	return 0;
}
*/

Compilation message

walk.cpp: In function 'void add_edge(int, int, int, int)':
walk.cpp:26:21: warning: comparison of integer expressions of different signedness: 'std::vector<std::vector<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   26 |     while(adj.size()<=p)adj.push_back({});
      |           ~~~~~~~~~~^~~
walk.cpp:27:21: warning: comparison of integer expressions of different signedness: 'std::vector<std::vector<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   27 |     while(adj.size()<=q)adj.push_back({});
      |           ~~~~~~~~~~^~~
walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:133:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |  for(int i=0;i<x.size();i++)
      |              ~^~~~~~~~~
walk.cpp:136:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |  for(int i=0;i<y.size();i++)
      |              ~^~~~~~~~~
walk.cpp:170:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  170 |     for(int i=0;i<x.size();i++)
      |                 ~^~~~~~~~~
walk.cpp:213:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  213 |     for(int i=0;i<x.size();i++)
      |                 ~^~~~~~~~~
walk.cpp:239:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  239 |     for(int i=0;i<x.size();i++)
      |                 ~^~~~~~~~~
walk.cpp:258:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  258 |     for(int i=0;i<x.size();i++)
      |                 ~^~~~~~~~~
walk.cpp:266:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  266 |     for(int i=0;i<y.size();i++)
      |                 ~^~~~~~~~~
walk.cpp:292:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  292 |         for(int i=1;i<pref.size();i++)
      |                     ~^~~~~~~~~~~~
walk.cpp:295:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  295 |         for(int i=0;i+1<pref.size();i++)
      |                     ~~~^~~~~~~~~~~~
walk.cpp:281:13: warning: unused variable 'prv' [-Wunused-variable]
  281 |         int prv=-1;
      |             ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11980 KB Output is correct
2 Correct 7 ms 11980 KB Output is correct
3 Correct 7 ms 11980 KB Output is correct
4 Correct 7 ms 11952 KB Output is correct
5 Correct 7 ms 12108 KB Output is correct
6 Correct 9 ms 12028 KB Output is correct
7 Correct 8 ms 12108 KB Output is correct
8 Correct 7 ms 12108 KB Output is correct
9 Correct 7 ms 11980 KB Output is correct
10 Correct 8 ms 12108 KB Output is correct
11 Correct 7 ms 11980 KB Output is correct
12 Correct 7 ms 12108 KB Output is correct
13 Correct 8 ms 11980 KB Output is correct
14 Correct 7 ms 11980 KB Output is correct
15 Correct 9 ms 12048 KB Output is correct
16 Correct 7 ms 11980 KB Output is correct
17 Correct 8 ms 12108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11996 KB Output is correct
2 Correct 8 ms 11980 KB Output is correct
3 Correct 1841 ms 127712 KB Output is correct
4 Correct 2233 ms 163416 KB Output is correct
5 Correct 1300 ms 132468 KB Output is correct
6 Correct 1355 ms 124956 KB Output is correct
7 Correct 1307 ms 132484 KB Output is correct
8 Correct 2032 ms 135124 KB Output is correct
9 Correct 2039 ms 144724 KB Output is correct
10 Correct 2384 ms 169180 KB Output is correct
11 Correct 1793 ms 115020 KB Output is correct
12 Correct 1076 ms 104280 KB Output is correct
13 Correct 1883 ms 172448 KB Output is correct
14 Correct 1391 ms 98504 KB Output is correct
15 Correct 1243 ms 86788 KB Output is correct
16 Correct 1314 ms 81848 KB Output is correct
17 Correct 1143 ms 78764 KB Output is correct
18 Correct 1174 ms 103440 KB Output is correct
19 Correct 47 ms 16260 KB Output is correct
20 Correct 660 ms 55624 KB Output is correct
21 Correct 831 ms 74544 KB Output is correct
22 Correct 723 ms 79996 KB Output is correct
23 Correct 1234 ms 106056 KB Output is correct
24 Correct 864 ms 80856 KB Output is correct
25 Correct 812 ms 77440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 238 ms 30196 KB Output is correct
2 Correct 1916 ms 153816 KB Output is correct
3 Correct 2235 ms 162164 KB Output is correct
4 Correct 2689 ms 200068 KB Output is correct
5 Correct 2992 ms 199108 KB Output is correct
6 Correct 2712 ms 191492 KB Output is correct
7 Correct 1299 ms 129360 KB Output is correct
8 Correct 1058 ms 104288 KB Output is correct
9 Correct 2359 ms 183920 KB Output is correct
10 Correct 1008 ms 112832 KB Output is correct
11 Correct 36 ms 21840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 238 ms 30196 KB Output is correct
2 Correct 1916 ms 153816 KB Output is correct
3 Correct 2235 ms 162164 KB Output is correct
4 Correct 2689 ms 200068 KB Output is correct
5 Correct 2992 ms 199108 KB Output is correct
6 Correct 2712 ms 191492 KB Output is correct
7 Correct 1299 ms 129360 KB Output is correct
8 Correct 1058 ms 104288 KB Output is correct
9 Correct 2359 ms 183920 KB Output is correct
10 Correct 1008 ms 112832 KB Output is correct
11 Correct 36 ms 21840 KB Output is correct
12 Correct 2123 ms 161712 KB Output is correct
13 Correct 1999 ms 200192 KB Output is correct
14 Correct 2744 ms 199052 KB Output is correct
15 Correct 1617 ms 146888 KB Output is correct
16 Correct 1713 ms 161008 KB Output is correct
17 Correct 1967 ms 184948 KB Output is correct
18 Correct 1596 ms 147036 KB Output is correct
19 Correct 1721 ms 161020 KB Output is correct
20 Correct 1236 ms 126000 KB Output is correct
21 Correct 163 ms 55400 KB Output is correct
22 Correct 1419 ms 165520 KB Output is correct
23 Correct 1332 ms 157160 KB Output is correct
24 Correct 1102 ms 115996 KB Output is correct
25 Correct 1322 ms 151156 KB Output is correct
26 Correct 1058 ms 98524 KB Output is correct
27 Correct 2727 ms 199148 KB Output is correct
28 Correct 2017 ms 201016 KB Output is correct
29 Correct 2504 ms 191544 KB Output is correct
30 Correct 1269 ms 128984 KB Output is correct
31 Correct 2292 ms 183864 KB Output is correct
32 Correct 972 ms 92884 KB Output is correct
33 Correct 843 ms 95764 KB Output is correct
34 Correct 1145 ms 106324 KB Output is correct
35 Correct 1135 ms 108812 KB Output is correct
36 Correct 926 ms 91684 KB Output is correct
37 Correct 810 ms 74556 KB Output is correct
38 Correct 670 ms 80088 KB Output is correct
39 Correct 1200 ms 106020 KB Output is correct
40 Correct 825 ms 80824 KB Output is correct
41 Correct 813 ms 77460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11980 KB Output is correct
2 Correct 7 ms 11980 KB Output is correct
3 Correct 7 ms 11980 KB Output is correct
4 Correct 7 ms 11952 KB Output is correct
5 Correct 7 ms 12108 KB Output is correct
6 Correct 9 ms 12028 KB Output is correct
7 Correct 8 ms 12108 KB Output is correct
8 Correct 7 ms 12108 KB Output is correct
9 Correct 7 ms 11980 KB Output is correct
10 Correct 8 ms 12108 KB Output is correct
11 Correct 7 ms 11980 KB Output is correct
12 Correct 7 ms 12108 KB Output is correct
13 Correct 8 ms 11980 KB Output is correct
14 Correct 7 ms 11980 KB Output is correct
15 Correct 9 ms 12048 KB Output is correct
16 Correct 7 ms 11980 KB Output is correct
17 Correct 8 ms 12108 KB Output is correct
18 Correct 7 ms 11996 KB Output is correct
19 Correct 8 ms 11980 KB Output is correct
20 Correct 1841 ms 127712 KB Output is correct
21 Correct 2233 ms 163416 KB Output is correct
22 Correct 1300 ms 132468 KB Output is correct
23 Correct 1355 ms 124956 KB Output is correct
24 Correct 1307 ms 132484 KB Output is correct
25 Correct 2032 ms 135124 KB Output is correct
26 Correct 2039 ms 144724 KB Output is correct
27 Correct 2384 ms 169180 KB Output is correct
28 Correct 1793 ms 115020 KB Output is correct
29 Correct 1076 ms 104280 KB Output is correct
30 Correct 1883 ms 172448 KB Output is correct
31 Correct 1391 ms 98504 KB Output is correct
32 Correct 1243 ms 86788 KB Output is correct
33 Correct 1314 ms 81848 KB Output is correct
34 Correct 1143 ms 78764 KB Output is correct
35 Correct 1174 ms 103440 KB Output is correct
36 Correct 47 ms 16260 KB Output is correct
37 Correct 660 ms 55624 KB Output is correct
38 Correct 831 ms 74544 KB Output is correct
39 Correct 723 ms 79996 KB Output is correct
40 Correct 1234 ms 106056 KB Output is correct
41 Correct 864 ms 80856 KB Output is correct
42 Correct 812 ms 77440 KB Output is correct
43 Correct 238 ms 30196 KB Output is correct
44 Correct 1916 ms 153816 KB Output is correct
45 Correct 2235 ms 162164 KB Output is correct
46 Correct 2689 ms 200068 KB Output is correct
47 Correct 2992 ms 199108 KB Output is correct
48 Correct 2712 ms 191492 KB Output is correct
49 Correct 1299 ms 129360 KB Output is correct
50 Correct 1058 ms 104288 KB Output is correct
51 Correct 2359 ms 183920 KB Output is correct
52 Correct 1008 ms 112832 KB Output is correct
53 Correct 36 ms 21840 KB Output is correct
54 Correct 2123 ms 161712 KB Output is correct
55 Correct 1999 ms 200192 KB Output is correct
56 Correct 2744 ms 199052 KB Output is correct
57 Correct 1617 ms 146888 KB Output is correct
58 Correct 1713 ms 161008 KB Output is correct
59 Correct 1967 ms 184948 KB Output is correct
60 Correct 1596 ms 147036 KB Output is correct
61 Correct 1721 ms 161020 KB Output is correct
62 Correct 1236 ms 126000 KB Output is correct
63 Correct 163 ms 55400 KB Output is correct
64 Correct 1419 ms 165520 KB Output is correct
65 Correct 1332 ms 157160 KB Output is correct
66 Correct 1102 ms 115996 KB Output is correct
67 Correct 1322 ms 151156 KB Output is correct
68 Correct 1058 ms 98524 KB Output is correct
69 Correct 2727 ms 199148 KB Output is correct
70 Correct 2017 ms 201016 KB Output is correct
71 Correct 2504 ms 191544 KB Output is correct
72 Correct 1269 ms 128984 KB Output is correct
73 Correct 2292 ms 183864 KB Output is correct
74 Correct 972 ms 92884 KB Output is correct
75 Correct 843 ms 95764 KB Output is correct
76 Correct 1145 ms 106324 KB Output is correct
77 Correct 1135 ms 108812 KB Output is correct
78 Correct 926 ms 91684 KB Output is correct
79 Correct 810 ms 74556 KB Output is correct
80 Correct 670 ms 80088 KB Output is correct
81 Correct 1200 ms 106020 KB Output is correct
82 Correct 825 ms 80824 KB Output is correct
83 Correct 813 ms 77460 KB Output is correct
84 Correct 294 ms 26856 KB Output is correct
85 Correct 2526 ms 164060 KB Output is correct
86 Correct 3709 ms 213824 KB Output is correct
87 Correct 299 ms 63136 KB Output is correct
88 Correct 323 ms 64952 KB Output is correct
89 Correct 305 ms 63084 KB Output is correct
90 Correct 90 ms 20856 KB Output is correct
91 Correct 10 ms 12748 KB Output is correct
92 Correct 85 ms 21700 KB Output is correct
93 Correct 1118 ms 106348 KB Output is correct
94 Correct 177 ms 57700 KB Output is correct
95 Correct 1778 ms 175320 KB Output is correct
96 Correct 1546 ms 161596 KB Output is correct
97 Correct 1330 ms 119648 KB Output is correct
98 Correct 1482 ms 154628 KB Output is correct
99 Execution timed out 4030 ms 238100 KB Time limit exceeded
100 Halted 0 ms 0 KB -