Submission #409768

# Submission time Handle Problem Language Result Execution time Memory
409768 2021-05-21T13:29:16 Z MKopchev Sky Walking (IOI19_walk) C++14
10 / 100
4000 ms 197756 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(0,l[i]-1,y[i]));
        push(i,s);
        push(i,get_first(s+1,g-1,y[i]));

        push(i,get_last(s+1,g-1,y[i]));
        push(i,g);
        push(i,get_first(g+1,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);
    }

    for(int i=0;i<y.size();i++)
    {
        //cout<<l[i]<<" "<<r[i]<<" "<<y[i]<<" :"<<endl;

        vector<int> me=seen_by_y[y[i]];

        int prv=-1;

        for(auto w:me)
            if(l[i]<=w&&w<=r[i])
            {
                if(prv!=-1)
                {
                    add_edge(prv,y[i],w,y[i]);
                }

                prv=w;
            }
    }

    /*
    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:264:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  264 |     for(int i=0;i<y.size();i++)
      |                 ~^~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 7 ms 11980 KB Output is correct
2 Correct 7 ms 11980 KB Output is correct
3 Correct 7 ms 12000 KB Output is correct
4 Correct 8 ms 11980 KB Output is correct
5 Correct 7 ms 12108 KB Output is correct
6 Correct 8 ms 12108 KB Output is correct
7 Correct 8 ms 12052 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 12048 KB Output is correct
11 Correct 7 ms 11980 KB Output is correct
12 Correct 8 ms 12024 KB Output is correct
13 Correct 7 ms 12052 KB Output is correct
14 Correct 8 ms 11980 KB Output is correct
15 Correct 7 ms 12048 KB Output is correct
16 Correct 7 ms 11980 KB Output is correct
17 Correct 8 ms 12108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 11980 KB Output is correct
2 Correct 7 ms 11980 KB Output is correct
3 Correct 2009 ms 118564 KB Output is correct
4 Correct 2817 ms 154784 KB Output is correct
5 Correct 1628 ms 126420 KB Output is correct
6 Correct 1699 ms 119052 KB Output is correct
7 Correct 1722 ms 126596 KB Output is correct
8 Correct 2369 ms 127348 KB Output is correct
9 Correct 2532 ms 136184 KB Output is correct
10 Correct 2883 ms 160684 KB Output is correct
11 Correct 2227 ms 106520 KB Output is correct
12 Correct 1856 ms 97292 KB Output is correct
13 Correct 2590 ms 163608 KB Output is correct
14 Correct 1360 ms 92416 KB Output is correct
15 Execution timed out 4105 ms 77280 KB Time limit exceeded
16 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1190 ms 30192 KB Output is correct
2 Correct 2453 ms 149400 KB Output is correct
3 Correct 2828 ms 157996 KB Output is correct
4 Correct 3502 ms 195756 KB Output is correct
5 Correct 3662 ms 197756 KB Output is correct
6 Correct 3778 ms 191884 KB Output is correct
7 Correct 1749 ms 125780 KB Output is correct
8 Correct 1926 ms 97328 KB Output is correct
9 Correct 3699 ms 188504 KB Output is correct
10 Execution timed out 4067 ms 102440 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1190 ms 30192 KB Output is correct
2 Correct 2453 ms 149400 KB Output is correct
3 Correct 2828 ms 157996 KB Output is correct
4 Correct 3502 ms 195756 KB Output is correct
5 Correct 3662 ms 197756 KB Output is correct
6 Correct 3778 ms 191884 KB Output is correct
7 Correct 1749 ms 125780 KB Output is correct
8 Correct 1926 ms 97328 KB Output is correct
9 Correct 3699 ms 188504 KB Output is correct
10 Execution timed out 4067 ms 102440 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 11980 KB Output is correct
2 Correct 7 ms 11980 KB Output is correct
3 Correct 7 ms 12000 KB Output is correct
4 Correct 8 ms 11980 KB Output is correct
5 Correct 7 ms 12108 KB Output is correct
6 Correct 8 ms 12108 KB Output is correct
7 Correct 8 ms 12052 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 12048 KB Output is correct
11 Correct 7 ms 11980 KB Output is correct
12 Correct 8 ms 12024 KB Output is correct
13 Correct 7 ms 12052 KB Output is correct
14 Correct 8 ms 11980 KB Output is correct
15 Correct 7 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 8 ms 11980 KB Output is correct
19 Correct 7 ms 11980 KB Output is correct
20 Correct 2009 ms 118564 KB Output is correct
21 Correct 2817 ms 154784 KB Output is correct
22 Correct 1628 ms 126420 KB Output is correct
23 Correct 1699 ms 119052 KB Output is correct
24 Correct 1722 ms 126596 KB Output is correct
25 Correct 2369 ms 127348 KB Output is correct
26 Correct 2532 ms 136184 KB Output is correct
27 Correct 2883 ms 160684 KB Output is correct
28 Correct 2227 ms 106520 KB Output is correct
29 Correct 1856 ms 97292 KB Output is correct
30 Correct 2590 ms 163608 KB Output is correct
31 Correct 1360 ms 92416 KB Output is correct
32 Execution timed out 4105 ms 77280 KB Time limit exceeded
33 Halted 0 ms 0 KB -