Submission #721341

#TimeUsernameProblemLanguageResultExecution timeMemory
721341bin9638Catfish Farm (IOI22_fish)C++17
100 / 100
816 ms96716 KiB
#include <bits/stdc++.h>

#ifndef SKY
#include "fish.h"
#endif // SKY

using namespace std;

#define N 100010
#define ll long long
#define fs first
#define sc second
#define ii pair<int,ll>
#define pb push_back

struct IT
{
    vector<ll>ST;
    int num_node=0;

    void init(int n)
    {
        num_node=n;
        ST.resize(n*4+1,-1e18);
    }

    void update(int id,int l,int r,int i,ll val)
    {
        if(l>i||r<i)
            return;
        if(l==r)
        {
            ST[id]=max(ST[id],val);
            return;
        }
        int mid=(l+r)/2;
        update(id*2,l,mid,i,val);
        update(id*2+1,mid+1,r,i,val);
        ST[id]=max(ST[id*2],ST[id*2+1]);
    }

    void gan(int i,ll val)
    {
        update(1,1,num_node,i,val);
    }

    ll get(int id,int l,int r,int u,int v)
    {
        if(l>v||r<u)
            return -1e18;
        if(l>=u&&r<=v)
            return ST[id];
        int mid=(l+r)/2;
        return max(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v));
    }

    ll solve(int u,int v)
    {
        return get(1,1,num_node,u,v);
    }
}T[N][4];

int n,m;
vector<ii>lis[N];
vector<ll>sum[N];
ll ans=0;

ll get_cost(int i,int heigh)
{
    if(lis[i].empty())
        return 0;
    if(heigh<lis[i][0].fs)
        return 0;
    //cout<<i<<" "<<heigh<<" "<<prev(upper_bound(lis[i].begin(),lis[i].end(),ii{heigh,1e18}))-lis[i].begin()<<endl;
    return sum[i][prev(upper_bound(lis[i].begin(),lis[i].end(),ii{heigh,1e18}))-lis[i].begin()];
}

ll max_weights(int nnn, int mmm, vector<int> X, vector<int> Y,vector<int> W)
{
    n=nnn;
    m=mmm;
    for(int i=0;i<m;i++)
    {
        lis[X[i]+1].pb({Y[i]+1,W[i]});
    }
    for(int i=1;i<=n;i++)
    {
        lis[i].pb({n+1,0});
        sort(lis[i].begin(),lis[i].end());
    }
    for(int i=1;i<=n;i++)
    {
        T[i][0].init(lis[i].size());
        T[i][1].init(lis[i].size());
        T[i][2].init(lis[i].size());
        T[i][3].init(lis[i].size());
        sum[i].resize(lis[i].size()+1,0);
        for(int j=0;j<lis[i].size();j++)
            sum[i][j]=(j>0 ? sum[i][j-1] : 0)+lis[i][j].sc;
    }
    for(int j=0;j<lis[1].size();j++)
    {
        T[1][0].gan(j+1,get_cost(2,lis[1][j].fs-1));
        T[1][1].gan(j+1,-get_cost(1,lis[1][j].fs-1));
       // if(j==0)cout<<lis[1][j].fs<<" "<<-get_cost(1,lis[1][j].fs-1)<<endl;
        T[1][2].gan(j+1,get_cost(2,lis[1][j].fs-1));
        T[1][3].gan(j+1,0);
    }
    //cout<<n<<" "<<m<<endl;
  // return 0;
    for(int i=2;i<=n;i++)
        for(int j=0;j<lis[i].size();j++)
        {
           //  cout<<i<<" "<<j<<endl;
            if(lis[i][j].fs<=lis[i-1].back().fs)
            {
                int vt=lower_bound(lis[i-1].begin(),lis[i-1].end(),ii{lis[i][j].fs,0})-lis[i-1].begin()+1;
              //  cout<<vt<<endl;
                ll val=T[i-1][0].solve(vt,lis[i-1].size())-get_cost(i,lis[i][j].fs-1);
                ans=max(ans,val);
              //  cout<<val<<endl;
                T[i][0].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                T[i][2].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                T[i][3].gan(j+1,val);
            }
            if(lis[i][j].fs>=lis[i-1][0].fs)
            {
                int vt=(lis[i][j].fs>=lis[i-1].back().fs ? lis[i-1].size() :
                         prev(upper_bound(lis[i-1].begin(),lis[i-1].end(),ii{lis[i][j].fs,1e18}))-lis[i-1].begin()+1);
                ll val=T[i-1][1].solve(1,vt)+get_cost(i-1,lis[i][j].fs-1);
             //    cout<<val<<" "<<vt<<" "<<T[i-1][1].solve(1,vt)<<endl;
                ans=max(ans,val);
                T[i][0].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                T[i][1].gan(j+1,val-get_cost(i,lis[i][j].fs-1));
                T[i][2].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                T[i][3].gan(j+1,val);
            }
            if(i>2)
            {
                if(lis[i][j].fs<=lis[i-2].back().fs)
                {
                    int vt=lower_bound(lis[i-2].begin(),lis[i-2].end(),ii{lis[i][j].fs,0})-lis[i-2].begin()+1;
                    ll val=T[i-2][2].solve(vt,lis[i-2].size());//-get_cost(i,lis[i][j].fs-1);
                    ans=max(ans,val);
                    T[i][0].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                    T[i][1].gan(j+1,val-get_cost(i,lis[i][j].fs-1));
                    T[i][2].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                    T[i][3].gan(j+1,val);
                }
                if(lis[i][j].fs>=lis[i-2][0].fs)
                {
                    int vt=(lis[i][j].fs>=lis[i-2].back().fs ? lis[i-2].size() :
                            prev(upper_bound(lis[i-2].begin(),lis[i-2].end(),ii{lis[i][j].fs,1e18}))-lis[i-2].begin()+1);
                    ll val=T[i-2][1].solve(1,vt)+get_cost(i-1,lis[i][j].fs-1);
                    ans=max(ans,val);
                    T[i][0].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                    T[i][1].gan(j+1,val-get_cost(i,lis[i][j].fs-1));
                    T[i][2].gan(j+1,val+get_cost(i+1,lis[i][j].fs-1));
                    T[i][3].gan(j+1,val);
                }
            }
        }
    return ans;
}

#ifdef SKY
int main()
{
    freopen("A.inp","r",stdin);
    freopen("A.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int n,m;
    cin>>n>>m;
    vector<int>X(m),Y(m),W(m);
    for(int i=0;i<m;i++)
        cin>>X[i];//>>Y[i]>>W[i];
          for(int i=0;i<m;i++)
        cin>>Y[i];//>>Y[i]>>W[i];
          for(int i=0;i<m;i++)
        cin>>W[i];//>>Y[i]>>W[i];
    cout<<max_weights(n,m,X,Y,W);
    return 0;
}
#endif

Compilation message (stderr)

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:98:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |         for(int j=0;j<lis[i].size();j++)
      |                     ~^~~~~~~~~~~~~~
fish.cpp:101:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |     for(int j=0;j<lis[1].size();j++)
      |                 ~^~~~~~~~~~~~~~
fish.cpp:112:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         for(int j=0;j<lis[i].size();j++)
      |                     ~^~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...