結果
問題 | No.1368 サイクルの中に眠る門松列 |
ユーザー |
|
提出日時 | 2021-01-29 22:29:18 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 132 ms / 2,000 ms |
コード長 | 1,757 bytes |
コンパイル時間 | 1,603 ms |
コンパイル使用メモリ | 100,500 KB |
最終ジャッジ日時 | 2025-01-18 09:28:03 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 15 |
ソースコード
#include <iostream>#include <algorithm>#include <vector>#include <string>#include <utility>#include <set>#include <map>#include <cmath>#include <queue>#include <cstdio>#include <limits>#define rep(i,n) for(int i = 0; i < n; ++i)#define rep1(i,n) for(int i = 1; i <= n; ++i)using namespace std;template<class T>bool chmax(T &a, const T &b) { if(a < b){ a = b; return 1; } return 0; }template<class T>bool chmin(T &a, const T &b) { if(a > b){ a = b; return 1; } return 0; }template<class T> inline int sz(T &a) { return a.size(); }using ll = long long; using ld = long double;using pi = pair<int,int>; using pl = pair<ll,ll>;using vi = vector<int>; using vvi = vector<vi>;using vl = vector<ll>; using vvl = vector<vl>;const int inf = numeric_limits<int>::max();const ll infll = numeric_limits<ll>::max();int main(){auto check = [](ll a, ll b, ll c)->bool {if(a != b && b != c && c != a && ((a < b && b > c) || (a > b && b < c))) return true;else return false;};int q; cin >> q;while(q-- > 0) {int n; cin >> n;vl a(n);rep(i,n) cin >> a[i];a.push_back(a[0]);a.push_back(a[1]);ll res = 0;vl dp(n+3, 0);rep(i,n) {if(i+3 <= n && check(a[i], a[i+1], a[i+2])) chmax(dp[i+3], dp[i] + a[i]);chmax(dp[i+1], dp[i]);}chmax(res, dp[n]);dp.assign(n+3, 0);rep1(i,n) {if(i+3 <= n+1 && check(a[i], a[i+1], a[i+2])) chmax(dp[i+3], dp[i] + a[i]);chmax(dp[i+1], dp[i]);}chmax(res, dp[n+1]);dp.assign(n+3, 0);for(int i = 2; i <= n+1; ++i) {if(i+3 <= n+2 && check(a[i], a[i+1], a[i+2])) chmax(dp[i+3], dp[i] + a[i]);chmax(dp[i+1], dp[i]);}chmax(res, dp[n+2]);cout << res << "\n";}return 0;}