제출 #395842

#제출 시각아이디문제언어결과실행 시간메모리
395842Pichon5Global Warming (CEOI18_glo)C++17
0 / 100
353 ms262148 KiB
#include<bits/stdc++.h>
#include <chrono>
#include <thread>
#define lcm(a,b) (a/__gcd(a,b))*b
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long int
#define vi vector<int>
#define vll vector<ll>
#define pb push_back
#define F first
#define S second
#define mp make_pair
//salida rapida "\n"
//DECIMALES fixed<<sp(n)<<x<<endl;
//gcd(a,b)= ax + by
//lCB x&-x
//set.erase(it) - ersases the element present at the required index//auto it = s.find(element)
//set.find(element) - iterator pointing to the given element if it is present else return pointer pointing to set.end()
//set.lower_bound(element) - iterator pointing to element greater than or equal to the given element
//set.upper_bound(element) - iterator pointing to element greater than the given element
// | ^
//__builtin_popcount(x)
using namespace std;
const ll INF=1e18;
int main()
{

    freopen("glo6a.in","r",stdin);
    ll n,k,x;
    cin>>n>>k;
    vll v;
    ll res=0;
    for(int i=0;i<n;i++){
        cin>>x;
        v.pb(x);
    }
    vll E(n+1);
    vll dp(n+2,INF);
    dp[0]=-INF;
    for(int i=0;i<n;i++){
        int b=1,e=n;
        while(b<=e){
            ll mid=(b+e)/2;
            if(v[i]<=dp[mid] && dp[mid-1]<v[i]){
                dp[mid]=v[i];
                res=max(res,mid);
                E[i]=mid;
                break;
            }
            if(dp[mid]>v[i]){
                e=mid-1;
            }else{
                b=mid+1;
            }
        }
    }
    dp.assign(n+2,INF);
    dp[0]=-INF;
    for(int i=n-1;i>=0;i--){
        int b=1,e=n;
        int val=-v[i]+k;//le reduzco a todo el prefijo i, eso es darle ventaja a i sobre el sufijo
        while(b<=e){
            int mid=(b+e)/2;
            if(val<=dp[mid] && dp[mid-1]<val){
                res=max(res,E[i]+mid-1);
                break;
            }
            if(dp[mid]>val){
                e=mid-1;
            }else{
                b=mid+1;
            }
        }
        val=-v[i];
        b=1,e=n;
        while(b<=e){
            int mid=(b+e)/2;
            if(val<=dp[mid] && dp[mid-1]<val){
                dp[mid]=val;
                break;
            }
            if(dp[mid]>val){
                e=mid-1;
            }else{
                b=mid+1;
            }
        }

    }
    cout<<res<<endl;



    return 0;
}
//409336628

컴파일 시 표준 에러 (stderr) 메시지

glo.cpp: In function 'int main()':
glo.cpp:28:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   28 |     freopen("glo6a.in","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...