이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<utility>
#include<queue>
#define ln (e-s+1)
#define md ((e+s)/2)
#define dm ((e+s)/2 + 1)
#define lc (id*2)
#define rc (id*2 + 1)
#define ll long long
#define F first
#define S second
#define pll pair<ll , ll>
#define pii pair<int, int>
#define pb push_back
using namespace std;
const int N = (int)3e5 + 5, inf = (int)1e9 + 7;
int n, d, a[N];
int dp[N];
vector<int> vct;
int seg[N << 2];
void upd(int p,int x,int id = 1,int s = 1,int e = n){
if(p < s || p > e)return;
if(ln == 1){
seg[id] = max(seg[id], x);
return;
}
if(p>= s&&p <= md)upd( p, x, lc, s, md);
if(p>=dm&&p <= e)upd( p, x, rc, dm, e);
seg[id] = max(seg[lc], seg[rc]);
}
//void build(int k, int id = 1,int s)
int get(int l,int r,int id = 1,int s = 1,int e = n){
if(r < s|| l > e)return 0;
if(l <= s && e <= r)return seg[id];
return max(get( l, r, lc, s, md), get( l, r, rc, dm , e));
}
bool wef;
int few, ret, pd[N];
void sb(){
/* int ans = 1;ret = 1;
multiset<int> st; st.insert(a[n]);
for(int i = n - 1; i ; i --){
ans += 1;
st.insert(a[i]);
ans -= (st.lower_bound(a[i]) - st.find(a[i]));
//cout << *(st.lower_bound(a[i])) << endl;
ret = max(ret, ans);
}cout << ret << endl;
*/ exit(0);
}
void sb2(){
int few = 0;
priority_queue<int, vector<int>> q;
for(int i = 1; i <= n; i ++){
while(few && a[i] > a[dp[few]] )few --;
pd[i] = dp[few] + 1;
dp[++few] =i;
}
for(int i = n ; i ; i--){
q.push(pd[i]);
while(q.top() > i) q.pop();
ret = max(ret, (int)q.size());
}
cout << ret << endl;
exit(0);
}
int main(){
//ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
scanf("%d%d", &n, &d);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), vct.pb(a[i]);
sort(vct.begin(), vct.end()); unique( vct.begin(), vct.end());
for(int i = 1; i <= n; i ++){
a[i] = (lower_bound(vct.begin(), vct.end(), a[i]) - vct.begin());
// upd(i, a[i]);
}
// if(d == n)sb();
if(d == 1)sb2();
for(int i = 1; i <= n; i ++){
dp[i] = wef = 1;
few = 0;
for(int j = i - 1 ; j ; j --){
if(wef && a[j] < a[i]) dp[i] = max( dp[i], dp[j] + 1);
(a[j] >= a[i])? few ++: few =0;
if(few >= d) wef = 0;
}
ret = max(ret,dp[i]);
}
cout << ret <<endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:75:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
75 | scanf("%d%d", &n, &d);
| ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:76:36: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
76 | for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), vct.pb(a[i]);
| ~~~~~^~~~~~~~~~~~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |