답안 #398508

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
398508 2021-05-04T12:35:38 Z model_code Floppy (RMI20_floppy) C++17
59.2671 / 100
168 ms 11548 KB
/**
* user:  turevskii-2c9
* fname: Maxim
* lname: Turevskii
* task:  Floppy
* score: 64.0
* date:  2020-12-03 10:10:39.759270
*/
#include <bits/stdc++.h>
#include "floppy.h"
using namespace std;
/*string o1;
void save_to_floppy(string bits)
{
    o1=bits;
}*/
void read_array(int id,const vector <int> &v)
{
    int n=v.size();
    vector <pair<int,int> > z1;
    for(int i=0;i<n;++i)
    {
        z1.push_back({v[i],i});
    }
    sort(z1.begin(),z1.end());
    vector <int> t(n);
    int curr=(-1);
    for(int i=0;i<z1.size();++i)
    {
        if(i==0 || z1[i].first!=z1[i-1].first)
        {
            ++curr;
            t[z1[i].second]=curr;
        }
        else
        {
            t[z1[i].second]=curr;
        }
    }
    int nxt[n];int prev[n];bool used[n];
    for(int i=0;i<n;++i)
    {
        nxt[i]=(i+1);prev[i]=(i-1);used[i]=false;
    }
    vector <int> h(n);
    vector <int> z;
    int cyc=(-1);
    int prev1[n],nxt1[n];
    vector <int> g;
    vector <int> f;
    for(int i=0;i<n;++i)
    {
        f.push_back(i);
    }
    vector <int> f1;
    while(true)
    {
        f1.clear();
        g.clear();
        ++cyc;
        int curr=0;
        if(used[curr])
        {
        z.clear();
        int o2=nxt[curr];
        z.clear();
        z.push_back(curr);
        while(true)
        {
            if(o2==n) break;
            if(!used[o2]) break;
            z.push_back(o2);
            o2=nxt[o2];
        }
        for(auto h1:z)
        {
            nxt[h1]=o2;
        }
        curr=o2;
        }
        if(curr==n) break;
        //cout<<curr<<" curr "<<endl;
        for(auto i:f)
        {
            if(i>=0 && i<n && !used[i]) {}
            else {continue;}
            //cout<<i<<" i "<<endl;
            int o1=prev[i];
            //cout<<o1<<" o1 "<<endl;
            z.clear();
            z.push_back(i);
            while(true)
            {
                if(o1==(-1)) break;
                if(!used[o1]) break;
                z.push_back(o1);
                o1=prev[o1];
            }
            for(auto h1:z)
            {
                prev[h1]=o1;
            }
            int o2=nxt[i];
            z.clear();
            z.push_back(i);
            while(true)
            {
                if(o2==n) break;
                if(!used[o2]) break;
                z.push_back(o2);
                o2=nxt[o2];
            }
            for(auto h1:z)
            {
                nxt[h1]=o2;
            }
            if((o1==(-1) || (t[o1]>=t[i] && !used[i])) && (o2==n || (t[o2]>=t[i] && !used[i])))
            {
                g.push_back(i);
                h[i]=cyc;
                prev1[i]=o1;nxt1[i]=o2;
            }
        }
        for(auto u:g)
        {
            int i=u;
            int o1=prev[i];
            //cout<<o1<<" o1 "<<endl;
            z.clear();
            z.push_back(i);
            while(true)
            {
                if(o1==(-1)) break;
                if(!used[o1]) break;
                z.push_back(o1);
                o1=prev[o1];
            }
            for(auto h1:z)
            {
                prev[h1]=o1;
            }
            int o2=nxt[i];
            z.clear();
            z.push_back(i);
            while(true)
            {
                if(o2==n) break;
                if(!used[o2]) break;
                z.push_back(o2);
                o2=nxt[o2];
            }
            for(auto h1:z)
            {
                nxt[h1]=o2;
            }
            f1.push_back(prev[u]);f1.push_back(nxt[u]);
            used[u]=true;
        }
        sort(f1.begin(),f1.end());
        f1.erase(unique(f1.begin(),f1.end()),f1.end());
        f=f1;
    }
    /*for(auto l:h)
    {
        cout<<l<<' ';
    }
    cout<<endl;*/
    string bits1,bits2;
    for(int i=0;i<n;++i)
    {
        if(h[i]==0) bits1+='1';
        else bits1+='0';
        //cout<<prev1[i]<<' '<<nxt1[i]<<endl;
        if(prev1[i]!=(-1) && h[prev1[i]]==(h[i]+1)) bits2+="10";
        else if(nxt1[i]!=n && h[nxt1[i]]==(h[i]+1)) bits2+="11";
        else bits2+="00";
    }
    bits1+=bits2;
    save_to_floppy(bits1);
}
const int maxn=40005;
pair <int,int> t[4*maxn];
pair <int,int> merg(pair <int,int> u,pair <int,int> v)
{
    if(u.first<=v.first)
    {
        return u;
    }
    else
    {
        return v;
    }
}
void to(int node,int tl,int tr,int pos,int val)
{
    if(tl>pos || tr<=pos)
    {
        return;
    }
    if((tr-tl)==1)
    {
        t[node]={-val,tl};
        return;
    }
    int tm=(tl+tr)/2;
    to(2*node+1,tl,tm,pos,val);to(2*node+2,tm,tr,pos,val);
    t[node]=merg(t[2*node+1],t[2*node+2]);
}
pair <int,int> get(int node,int tl,int tr,int l,int r)
{
    if(tl>=l && tr<=r)
    {
        return t[node];
    }
    if(tl>=r || tr<=l)
    {
        return {1e9,1e9};
    }
    int tm=(tl+tr)/2;
    return merg(get(2*node+1,tl,tm,l,r),get(2*node+2,tm,tr,l,r));
}
vector <int> solve_queries(int id,int n,const string &bits,const vector <int> &a,const vector <int> &b)
{
    vector <int> v;
    for(int i=0;i<n;++i)
    {
        if(bits[i]=='1') v.push_back(i);
    }
    int nxt[n];int prev[n];bool used[n];
    for(int i=0;i<n;++i)
    {
        nxt[i]=(i+1);prev[i]=(i-1);used[i]=false;
    }
    vector <int> v1;
    vector <int> z;
    vector <int> o(n);
    int cyc=(-1);
    while(!v.empty())
    {
        v1.clear();
        ++cyc;
        for(auto i:v)
        {
            o[i]=cyc;
            used[i]=true;
            if(bits[2*i+n]=='1' && bits[2*i+n+1]=='1')
            {
                int o2=nxt[i];
                z.clear();
                z.push_back(i);
                while(true)
                {
                if(o2==n) break;
                if(!used[o2]) break;
                z.push_back(o2);
                o2=nxt[o2];
               }
               for(auto h1:z)
               {
                nxt[h1]=o2;
               }
               if(o2!=n)
               v1.push_back(o2);
            }
            else if(bits[2*i+n]=='1' && bits[2*i+n+1]=='0')
            {
            int o1=prev[i];
            z.clear();
            z.push_back(i);
            while(true)
            {
                if(o1==(-1)) break;
                if(!used[o1]) break;
                z.push_back(o1);
                o1=prev[o1];
            }
            for(auto h1:z)
            {
                prev[h1]=o1;
            }
            if(o1!=(-1))
            v1.push_back(o1);
            }
            else {}
        }
        sort(v1.begin(),v1.end());
        v1.erase(unique(v1.begin(),v1.end()),v1.end());
        v=v1;
    }
    for(int i=0;i<o.size();++i)
    {
        to(0,0,maxn,i,o[i]);
    }
    //cout<<get(0,0,maxn,0,1).first<<' '<<get(0,0,maxn,0,1).second<<" get "<<endl;
    /*for(auto l:o)
    {
        cout<<l<<' ';
    }
    cout<<endl;*/
    vector <int> res(a.size());
    for(int i=0;i<a.size();++i)
    {
        int l=a[i];
        int r=b[i];
        pair <int,int> u=get(0,0,maxn,l,r+1);
        res[i]=u.second;
    }
    return res;
}
/*int32_t main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    read_array(0,{1,2,3,6,6,5,2,3,5,6});
    //vector <int> a={0,1},b={5,6};
    //vector <int> res=solve_queries(0,9,o1,a,b);
    //for(auto h:res) cout<<h<<' ';
    return 0;
}*/

Compilation message

floppy.cpp: In function 'void read_array(int, const std::vector<int>&)':
floppy.cpp:28:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     for(int i=0;i<z1.size();++i)
      |                 ~^~~~~~~~~~
floppy.cpp: In function 'std::vector<int> solve_queries(int, int, const string&, const std::vector<int>&, const std::vector<int>&)':
floppy.cpp:290:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  290 |     for(int i=0;i<o.size();++i)
      |                 ~^~~~~~~~~
floppy.cpp:301:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  301 |     for(int i=0;i<a.size();++i)
      |                 ~^~~~~~~~~
stub.cpp: In function 'void run2()':
stub.cpp:101:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  101 |     if (query_answers.size() != M) {
      |         ~~~~~~~~~~~~~~~~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 772 KB Output is correct
2 Correct 3 ms 768 KB Output is correct
3 Correct 3 ms 776 KB Output is correct
4 Correct 4 ms 768 KB Output is correct
5 Correct 3 ms 776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 3364 KB Output is correct
2 Correct 38 ms 3344 KB Output is correct
3 Correct 42 ms 3248 KB Output is correct
4 Correct 39 ms 3296 KB Output is correct
5 Correct 38 ms 3280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 168 ms 11320 KB Partially correct
2 Partially correct 154 ms 11320 KB Partially correct
3 Partially correct 150 ms 11184 KB Partially correct
4 Partially correct 158 ms 11548 KB Partially correct
5 Partially correct 152 ms 11252 KB Partially correct