結果
| 問題 |
No.284 門松と魔法(2)
|
| コンテスト | |
| ユーザー |
koyumeishi
|
| 提出日時 | 2015-09-25 01:50:57 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,465 bytes |
| コンパイル時間 | 1,131 ms |
| コンパイル使用メモリ | 95,496 KB |
| 実行使用メモリ | 16,084 KB |
| 最終ジャッジ日時 | 2024-07-19 09:07:53 |
| 合計ジャッジ時間 | 8,700 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 30 WA * 10 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:137:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
137 | scanf("%d", &a[i]);
| ~~~~~^~~~~~~~~~~~~
ソースコード
#include <iostream>
#include <vector>
#include <cstdio>
#include <sstream>
#include <map>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
#include <set>
using namespace std;
struct node{
int cnt;
int l;
int m;
node():cnt(0),l(0),m(0){}
bool operator < (const node& x) const{
return cnt < x.cnt;
}
};
struct val{
node a;
node b;
val operator +(const val& x){
val ret;
priority_queue<node, vector<node>, less<node>> pq;
pq.push(a);
pq.push(b);
pq.push(x.a);
pq.push(x.b);
ret.a = pq.top();
pq.pop();
bool ok = false;
while(pq.size() && !ok){
if(pq.top().l != ret.a.l){
ok = true;
ret.b = pq.top();
}else{
pq.pop();
}
}
return ret;
}
};
val hoge(val& x, int a){
val ret;
if(x.a.l != a){
ret.a = x.a;
if(x.b.l != a){
ret.b = x.b;
}
}else if(x.b.l != a){
ret.a = x.b;
}
return ret;
}
class seg{
public:
vector<val> v;
int size;
seg(int n){
size = 1;
while(size<n){
size <<= 1;
}
v.resize(2*size);
}
void update(int l, int r, val& x, int lb, int ub, int pos){
if(ub<=l || r<=lb) return;
if(l<=lb && ub<=r){
v[pos] = v[pos]+x;
return;
}
update(l,r,x, lb,(lb+ub)/2, pos*2+1);
update(l,r,x, (lb+ub)/2,ub, pos*2+2);
v[pos] = v[pos*2+1] + v[pos*2+2];
}
void update(int l, int r, val& x){
update(l,r,x,0,size,0);
}
val get(int l, int r, int a, int cnt, int lb, int ub, int pos){
if(ub<=l || r<=lb) return val();
if(l<=lb && ub<=r){
val ret;
if(cnt == 2){
ret = hoge(v[pos], a);
if(ret.b.l == 0 && (ub-lb>1)){
val tmp = get(l,r,a,1, lb,(lb+ub)/2, pos*2+1) + get(l,r,a,1, (lb+ub)/2,ub, pos*2+2);
ret = ret + tmp;
}
}else{
ret = hoge(v[pos], a);
}
return ret;
}
val x;
if(!((lb+ub)/2<=l || r<=lb)) x = get(l,r, a,cnt, lb, (lb+ub)/2, pos*2+1);
//x = hoge(x, a);
val y;
if(!(ub<=l || r<=(lb+ub)/2)) y = get(l,r, a,cnt, (lb+ub)/2, ub, pos*2+2);
//y = hoge(y, a);
val ret = x+y;
return ret;
}
val get(int l, int r, int a){
return get(l,r, a,2, 0,size,0);
}
};
template<class T>
vector<T> compress(vector<T> a, int& size){
auto b = a;
sort(b.begin(), b.end());
b.erase( unique(b.begin(), b.end()), b.end());
for(int i=0; i<a.size(); i++){
a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin() +1;
}
size = b.size();
return a;
}
int main(){
int n;
cin >> n;
vector<int> a(n);
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
}
int m;
a = compress(a, m);
seg inc(m+1);
seg dec(m+1);
for(int i=0; i<n; i++){
val s,t;
{
val x = inc.get(a[i]+1, m+1, a[i]);
s.a.m = a[i];
if(x.a.l != a[i]){
s.a.cnt = x.a.cnt + 1;
s.a.l = x.a.m;
if(x.b.l != a[i]){
s.b.m = a[i];
s.b.cnt = x.b.cnt + 1;
s.b.l = x.b.m;
}
}else{
s.a.cnt = x.b.cnt + 1;
s.a.l = x.b.m;
}
if(s.a.l == 0) s.a.l = n+i;
if(s.b.l == 0) s.b.l = n+i;
}
{
val x = dec.get(0,a[i], a[i]);
t.a.m = a[i];
if(x.a.l != a[i]){
t.a.cnt = x.a.cnt + 1;
t.a.l = x.a.m;
if(x.b.l != a[i]){
t.b.m = a[i];
t.b.cnt = x.b.cnt + 1;
t.b.l = x.b.m;
}
}else{
t.a.cnt = x.b.cnt + 1;
t.a.l = x.b.m;
}
if(t.a.l == 0) t.a.l = 2*n+i;
if(t.b.l == 0) t.b.l = 2*n+i;
}
dec.update(a[i],a[i]+1, s);
inc.update(a[i],a[i]+1, t);
}
int ans = 0;
val x = inc.get(0,m+1, 0);
val y = dec.get(0,m+1, 0);
ans = max(x.a.cnt, y.a.cnt);
if(ans <= 2) ans = 0;
cout << ans << endl;
return 0;
}
koyumeishi