Submission #758693

#TimeUsernameProblemLanguageResultExecution timeMemory
758693bgnbvnbvtrapezoid (balkan11_trapezoid)C++14
100 / 100
130 ms24784 KiB

#include <bits/stdc++.h>

using namespace std;

const string taskname = "";
#define FILE 0

#define mp make_pair
#define pb push_back
#define pf push_front
#define fi first
#define se second

#define bit(i, a) (((a)>>(i))&1)
#define ms(a, v) memset(a, v, sizeof(a))
#define lb(a, v) lower_bound(a.begin(), a.end(), v)
#define ub(a, v) upper_bound(a.begin(), a.end(), v)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef map<int, int> mii;
typedef map<ll, ll> mll;
typedef vector<bool> vb;




const ll mod = 30013;
const ll maxn = 2e5+13;
const ll inf = 1e9+5;
const ll infl = 1e18+5;
char tochar[] = {'0','1','2','3','4','5','6','7','8','9'};
const bool testcases = true;
const ll maxN=2e5+10;
ll n,a[maxN],b[maxN],c[maxN],d[maxN];
#define pli pair<ll,ll>
vector<ll> cor;
vector<pli>vec,vec1;
ll dp[maxN],cnt[maxN];
struct node
{
    ll val,cnt;
    node ()
    {
        val=-inf,cnt=0;
    }
    node operator+(const node&o)
    {
        node ans;
        ans=o;
        if(ans.val<val)
        {
            ans.val=val;
            ans.cnt=cnt;
        }
        else if(ans.val==val)
        {
            ans.cnt+=cnt;
            ans.cnt%=mod;
        }
        return ans;
    }
}st[4*maxN];
void update(ll pos,ll val1,ll val2,ll id=1,ll l=1,ll r=2*n)
{
    if(l==r)
    {
        node cc;
        cc.val=val1;
        cc.cnt=val2;
        st[id]=st[id]+cc;
        return;
    }
    ll mid=l+r>>1;
    if(pos<=mid) update(pos,val1,val2,id*2,l,mid);
    else update(pos,val1,val2,id*2+1,mid+1,r);
    st[id]=st[id*2]+st[id*2+1];
}
node get(ll i,ll j,ll id=1,ll l=1,ll r=2*n)
{
    if(j<l||r<i) return node();
    if(i<=l&&r<=j) return st[id];
    ll mid=l+r>>1;
    return get(i,j,id*2,l,mid)+get(i,j,id*2+1,mid+1,r);

}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ///freopen((taskname+".inp").c_str(), "r", stdin);
    ///freopen((taskname+".out").c_str(), "w", stdout);
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        vec.pb({b[i],i});
        vec1.pb({a[i],i});
        cor.pb(c[i]);
        cor.pb(d[i]);
    }
    sort(cor.begin(),cor.end());
    for(int i=1;i<=n;i++)
    {
        c[i]=lower_bound(cor.begin(),cor.end(),c[i])-cor.begin()+1;
        d[i]=lower_bound(cor.begin(),cor.end(),d[i])-cor.begin()+1;
    }
    sort(vec1.begin(),vec1.end());
    sort(vec.begin(),vec.end());
    ll j=0;
    for(int i=0;i<vec1.size();i++)
    {
        while(j<vec.size()&&vec[j].fi<=vec1[i].fi)
        {
            update(d[vec[j].se],dp[vec[j].se],cnt[vec[j].se]);
            j++;
        }
        dp[vec1[i].se]=1;
        cnt[vec1[i].se]=1;
        ll x=get(1,c[vec1[i].se]).val;
        ll ct=get(1,c[vec1[i].se]).cnt;
        if(dp[vec1[i].se]<x+1)
        {
            dp[vec1[i].se]=x+1;
            cnt[vec1[i].se]=ct;
        }
        else if(dp[vec1[i].se]==x+1)
        {
            cnt[vec1[i].se]+=ct;
            cnt[vec1[i].se]%=mod;
        }
    }
    ll mx=0,ctt=0;
    for(int i=1;i<=n;i++)
    {
        if(dp[i]>mx)
        {
            mx=dp[i];
            ctt=cnt[i];
        }
        else if(dp[i]==mx) ctt+=cnt[i],ctt%=mod;
    }
    cout << mx <<' '<<ctt;
}

Compilation message (stderr)

trapezoid.cpp: In function 'void update(ll, ll, ll, ll, ll, ll)':
trapezoid.cpp:79:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   79 |     ll mid=l+r>>1;
      |            ~^~
trapezoid.cpp: In function 'node get(ll, ll, ll, ll, ll)':
trapezoid.cpp:88:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   88 |     ll mid=l+r>>1;
      |            ~^~
trapezoid.cpp: In function 'int main()':
trapezoid.cpp:116:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |     for(int i=0;i<vec1.size();i++)
      |                 ~^~~~~~~~~~~~
trapezoid.cpp:118:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |         while(j<vec.size()&&vec[j].fi<=vec1[i].fi)
      |               ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...