Submission #760375

#TimeUsernameProblemLanguageResultExecution timeMemory
760375bgnbvnbvRectangles (IOI19_rect)C++14
100 / 100
1167 ms351260 KiB
#include "rect.h"
#include<bits/stdc++.h>
#define TASKNAME "codeforce"
#define pb push_back
#define pli pair<ll,ll>
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL);
using namespace std;
using ll=long long;
const ll maxN=2500+10;
const ll inf=1e18;
const ll mod=1e9+7;
vector<int>dq[maxN];
vector<ll>vec[maxN];
ll bit[maxN][maxN];
void update(ll t,ll i,ll v)
{
    while(i<=t)
    {
        bit[t][i]+=v;
        i+=i&(-i);
    }
}
ll get(ll t,ll i)
{
    ll aa=0;
    while(i>0)
    {
        aa+=bit[t][i];
        i-=i&(-i);
    }
    return aa;
}
struct qq
{
    ll x,y,en;
};
vector<qq>in[maxN];
ll count_rectangles(vector<vector<int>> a)
{
    ll n=a.size();
    ll m=a[0].size();
    for(int i=0;i<n;i++)
    {
        dq[i].pb(0);
    }
    for(int j=1;j<m;j++)
    {
        for(int i=0;i<n;i++)
        {
            while(dq[i].size()>0&&a[i][j]>a[i][dq[i].back()])
            {
                if(dq[i].back()<=j-2) vec[dq[i].back()+1].pb(i);
                dq[i].pop_back();
            }
            if(dq[i].size())
            {
                if(dq[i].back()<=j-2) vec[dq[i].back()+1].pb(i);
                if(a[i][j]==a[i][dq[i].back()]) dq[i].pop_back();
            }
            dq[i].pb(j);
        }
        for(int i=0;i<j;i++)
        {
            ll l;
            for(int k=0;k<vec[i].size();k++)
            {
                if(k==0)
                {
                    l=vec[i][k];
                }
                else if(vec[i][k]>vec[i][k-1]+1)
                {
                    in[l].pb({i,j-1,vec[i][k-1]});
                    l=vec[i][k];
                }
            }
            if(vec[i].size()>0) in[l].pb({i,j-1,vec[i].back()});
            vec[i].clear();
        }
    }


    for(int i=0;i<m;i++)
    {
        dq[i].clear();
        dq[i].pb(0);
    }
    vector<pair<ll,qq>>tap,cc;
    ll ans=0;
    for(int i=1;i<n;i++)
    {
        for(auto zz:in[i-1])
        {
            tap.pb({i-1,zz});
        }
        cc.clear();
        for(auto zz:tap)
        {
            if(zz.se.en>=i-1) cc.pb(zz);
        }
        swap(tap,cc);
        for(int j=0;j<m;j++)
        {
            while(dq[j].size()>0&&a[i][j]>a[dq[j].back()][j])
            {
                if(dq[j].back()+1<=i-1) vec[dq[j].back()+1].pb(j);
                dq[j].pop_back();
            }
            if(dq[j].size()>0)
            {
                if(dq[j].back()+1<=i-1) vec[dq[j].back()+1].pb(j);
                if(a[dq[j].back()][j]==a[i][j]) dq[j].pop_back();
            }
            dq[j].pb(i);
        }
        ll q=0;
        for(int j=0;j<i;j++)
        {
            ll l;
            while(q<tap.size()&&tap[q].fi<=j)
            {
                update(tap[q].se.y,tap[q].se.x,1);
                q++;
            }
            for(int k=0;k<vec[j].size();k++)
            {
                if(k==0)
                {
                    l=vec[j][k];
                }
                else if(vec[j][k]>vec[j][k-1]+1)
                {
                    l=vec[j][k];
                }
                ans+=get(vec[j][k],vec[j][k])-get(vec[j][k],l-1);
            }
            vec[j].clear();
        }
        q--;
        while(q>=0)
        {
            update(tap[q].se.y,tap[q].se.x,-1);
            q--;
        }
    }
    return ans;
}
/*void solve()
{
    cout << count_rectangles({{4, 8, 7, 5, 6},
                  {7, 4, 10, 3, 5},
                  {9, 7, 20, 14, 2},
                  {9, 14, 7, 3, 6},
                  {5, 7, 5, 2, 7},
                  {4, 5, 13, 5, 6}});
}
int main()
{
    fastio
    //freopen(TASKNAME".INP","r",stdin);
    //freopen(TASKNAME".OUT","w",stdout);
    solve();
}*/

Compilation message (stderr)

rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:67:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |             for(int k=0;k<vec[i].size();k++)
      |                         ~^~~~~~~~~~~~~~
rect.cpp:122:20: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, qq> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |             while(q<tap.size()&&tap[q].fi<=j)
      |                   ~^~~~~~~~~~~
rect.cpp:127:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |             for(int k=0;k<vec[j].size();k++)
      |                         ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...