이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "wiring.h"
/*
Author of all code: Pedro BIGMAN Dias
Last edit: 15/02/2021
*/
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#pragma GCC optimize("Ofast")
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <deque>
#include <list>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <cstring>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
#define REP(i,a,b) for(ll i=(ll) a; i<(ll) b; i++)
#define pb push_back
#define mp make_pair
#define pl pair<ll,ll>
#define ff first
#define ss second
#define whole(x) x.begin(),x.end()
#define DEBUG(i) cout<<"Pedro Is The Master "<<i<<endl
#define INF 5000000000000000LL
#define EPS 0.00000001
#define pi 3.14159
ll mod=1000000007LL;
template<class A=ll>
void Out(vector<A> a) {REP(i,0,a.size()) {cout<<a[i]<<" ";} cout<<endl;}
template<class A=ll>
void In(vector<A> &a, ll N) {A cur; REP(i,0,N) {cin>>cur; a.pb(cur);}}
vector<ll> dp;
vector<ll> ps;
ll f(ll s)
{
if(s==-1LL) {return 0LL;}
else {return dp[s];}
}
ll PS(ll a, ll b)
{
if(a==0) {return ps[b];} else {return (ps[b]-ps[a-1]);}
}
ll min_total_length(vector<int> r, vector<int> b)
{
vector<pl> a;
ll cntA=0LL, cntB=0LL;
while(cntA<r.size() || cntB<b.size())
{
if(cntA==r.size()) {a.pb({b[cntB],1}); cntB++;}
else if(cntB==b.size()) {a.pb({r[cntA],0}); cntA++;}
else if(b[cntB]>r[cntA]) {a.pb({r[cntA],0}); cntA++;}
else {a.pb({b[cntB],1}); cntB++;}
}
ll N = a.size(); REP(i,0,N) {dp.pb(INF);}
ll cursum=0LL; REP(i,0,N) {cursum+=a[i].ff; ps.pb(cursum);}
vector<pl> lastblock; pl cur={-1,-1};
REP(i,0,N)
{
if(i>0 && a[i].ss!=a[i-1].ss)
{
cur={lastblock.back().ss+1,i-1};
}
lastblock.pb(cur);
}
ll len, len1, len2;
ll A,B,C;
vector<ll> val1,val2; REP(i,0,N) {val1.pb(INF); val2.pb(INF);}
vector<ll> minright1, minleft2; REP(i,0,N) {minright1.pb(INF); minleft2.pb(INF);}
ll curmin1,curmin2;
REP(i,0,N)
{
A = lastblock[i].ff; B = lastblock[i].ss+1; C = i;
if(A==B-1LL && A>=0LL)
{
dp[i]=min(dp[i],min(f(A),f(A-1))+PS(B,C)-(C-A)*a[A].ff);
}
else if(A>=0LL)
{
len1=INF; len2=INF;
ll pos1=INF,pos2=-1LL;
REP(x,A,B)
{
if(x>=2LL*B-C-1LL) {pos1=min(pos1,x);}
else {pos2=max(pos2,x);}
}
if(pos1!=INF) {len1=minright1[pos1];}
if(pos2!=-1) {len2=minleft2[pos2];}
dp[i]=min(dp[i],len1 + PS(B,C) - (C+1LL-2LL*B)*a[B-1].ff);
dp[i]=min(dp[i],len2 + PS(B,C) - (C+1LL-2LL*B)*a[B].ff);
}
if(i!=N-1 && a[i+1].ss!=a[i].ss)
{
A = lastblock[i+1].ff; B = lastblock[i+1].ss +1;
curmin1=INF; curmin2=INF;
REP(x,A,B)
{
val1[x]= f(x-1) - PS(x,B-1) - x*a[B-1].ff;
val2[x]= f(x-1) - PS(x,B-1) - x*a[B].ff;
}
REP(x,A,B)
{
curmin2=min(curmin2,val2[x]); minleft2[x]=curmin2;
}
for(ll x = B-1; x>=A; x--)
{
curmin1=min(curmin1,val1[x]); minright1[x]=curmin1;
}
}
}
return dp[N-1];
}
컴파일 시 표준 에러 (stderr) 메시지
wiring.cpp:6: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
6 | #pragma GCC optimization ("O3")
|
wiring.cpp:7: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
7 | #pragma GCC optimization ("unroll-loops")
|
wiring.cpp: In function 'll min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:66:12: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
66 | while(cntA<r.size() || cntB<b.size())
| ~~~~^~~~~~~~~
wiring.cpp:66:29: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
66 | while(cntA<r.size() || cntB<b.size())
| ~~~~^~~~~~~~~
wiring.cpp:68:10: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | if(cntA==r.size()) {a.pb({b[cntB],1}); cntB++;}
| ~~~~^~~~~~~~~~
wiring.cpp:69:15: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | else if(cntB==b.size()) {a.pb({r[cntA],0}); cntA++;}
| ~~~~^~~~~~~~~~
wiring.cpp:84:5: warning: unused variable 'len' [-Wunused-variable]
84 | ll len, len1, len2;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |