結果
| 問題 |
No.284 門松と魔法(2)
|
| コンテスト | |
| ユーザー |
sigma425
|
| 提出日時 | 2016-09-25 22:29:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 689 ms / 5,000 ms |
| コード長 | 4,180 bytes |
| コンパイル時間 | 2,064 ms |
| コンパイル使用メモリ | 186,636 KB |
| 実行使用メモリ | 16,728 KB |
| 最終ジャッジ日時 | 2024-11-18 14:17:40 |
| 合計ジャッジ時間 | 6,541 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:163:44: warning: 'arg2' may be used uninitialized [-Wmaybe-uninitialized]
163 | int mx2=-2,arg2;
| ^~~~
main.cpp:173:38: warning: 'arg' may be used uninitialized [-Wmaybe-uninitialized]
173 | uval = D(arg,X,mx,-1,-1,-1);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
main.cpp:153:35: note: 'arg' was declared here
153 | int mx=-2,arg;
| ^~~
main.cpp:135:44: warning: 'arg2' may be used uninitialized [-Wmaybe-uninitialized]
135 | int mx2=-2,arg2;
| ^~~~
main.cpp:145:38: warning: 'arg' may be used uninitialized [-Wmaybe-uninitialized]
145 | dval = D(arg,X,mx,-1,-1,-1);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
main.cpp:125:35: note: 'arg' was declared here
125 | int mx=-2,arg;
| ^~~
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
using namespace std;
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){return o<<"("<<p.fs<<","<<p.sc<<")";}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){o<<"sz = "<<vc.size()<<endl<<"[";for(const T& v:vc) o<<v<<",";o<<"]";return o;}
struct D{
int segid[2],id[2],mx[2]; //id[i] -> segid[i] -> nxt
D(){
segid[0]=segid[1]=-1;
id[0]=id[1]=-1;
mx[0]=mx[1]=-1;
}
D(int x){
segid[0]=x;
segid[1]=-1;
id[0]=-1;
id[1]=-1;
mx[0]=1;
mx[1]=-1;
}
D(int a,int b,int c,int d,int e,int f){
id[0]=a,segid[0]=b,mx[0]=c,id[1]=d,segid[1]=e,mx[1]=f;
}
const static D e;
/* D operator+(const D& r) const {
typedef pair<int,int> P;
typedef pair<P,int> PP;
map<int,P> mp;
rep(i,2) if(mx[i]>=0) chmax(mp[id[i]],P(mx[i],segid[i]));
rep(i,2) if(r.mx[i]>=0) chmax(mp[r.id[i]],P(r.mx[i],r.segid[i]));
vector<PP> vp;
for(auto it:mp) vp.pb(PP(it.sc,it.fs));
sort(all(vp),greater<PP>());
int K=vp.size();
D ret;
rep(i,min(2,K)) ret.id[i]=vp[i].sc,ret.mx[i]=vp[i].fs.fs,ret.segid[i]=vp[i].fs.sc;
return ret;
}*/
D operator+(const D& r) const {
int tid[4],tsegid[4],tmx[4],K=0;
rep(i,2) if(mx[i]>=0) tid[K]=id[i],tsegid[K]=segid[i],tmx[K]=mx[i],K++;
rep(i,2) if(r.mx[i]>=0) tid[K]=r.id[i],tsegid[K]=r.segid[i],tmx[K]=r.mx[i],K++;
rep(i,K-1) rep(j,K-1-i) if(tmx[j]<tmx[j+1]) swap(tmx[j],tmx[j+1]),swap(tsegid[j],tsegid[j+1]),swap(tid[j],tid[j+1]);
int I=0;
D ret;
rep(i,K){
bool ok=1;
rep(j,i){
if(tid[j]==tid[i]){
ok=0;
break;
}
}
if(!ok) continue;
ret.id[I]=tid[i],ret.segid[I]=tsegid[i],ret.mx[I]=tmx[i],I++;
if(I==2) break;
}
return ret;
}
void inc(){
rep(i,2) if(mx[i]>=0) mx[i]++;
}
friend ostream& operator<<(ostream& o,const D& d){
o<<"d= mx="<<d.mx[0]<<" at ("<<d.id[0]<<","<<d.segid[0]<<")"<<endl;
o<<" mx="<<d.mx[1]<<" at ("<<d.id[1]<<","<<d.segid[1]<<")"<<endl;
return o;
}
};
const D D::e = D();
template<class D>
struct segtree{
static const int N=1<<17;
D e=D::e;
vector<D> seg;
segtree():seg(N*2,e){}
void update(int k,D val){
k+=N;
seg[k]=val;
k/=2;
while(k){
seg[k]=seg[k*2]+seg[k*2+1];
k/=2;
}
}
D calc(int a,int b,int l=0,int r=N,int k=1){
if(b<=a||b<=l||r<=a) return e;
if(a<=l&&r<=b) return seg[k];
return calc(a,b,l,(l+r)/2,k*2)+calc(a,b,(l+r)/2,r,k*2+1);
}
};
segtree<D> up,down;
int N;
int x[100000];
vector<int> xs;
int main(){
cin>>N;
rep(i,N){
scanf("%d",x+i);
xs.pb(x[i]);
}
sort(all(xs));
xs.erase(unique(xs.begin(),xs.end()),xs.end());
int K=xs.size();
rep(i,N) x[i]=lower_bound(all(xs),x[i])-xs.begin();
rep(i,N){
// printf("i=%d\n",i);
int X=x[i];
D dval,uval;
{//go up
D dmx=down.calc(0,X);
int mx=-2,arg;
rep(j,2){
if(dmx.id[j]!=X){
mx=dmx.mx[j];
arg=dmx.segid[j];
break;
}
}
if(mx>=0){
D dmx2 = down.calc(0,arg) + down.calc(arg+1,X);
int mx2=-2,arg2;
rep(j,2){
if(dmx2.id[j]!=X){
mx2=dmx2.mx[j];
arg2=dmx2.segid[j];
break;
}
}
dval = D(arg,X,mx,arg2,X,mx2);
}else{
dval = D(arg,X,mx,-1,-1,-1);
}
dval.inc();
dval = dval + D(X);
}
{//go down
D umx=up.calc(X+1,K);
int mx=-2,arg;
rep(j,2){
if(umx.id[j]!=X){
mx=umx.mx[j];
arg=umx.segid[j];
break;
}
}
if(mx>=0){
D umx2 = up.calc(X+1,arg) + up.calc(arg+1,K);
int mx2=-2,arg2;
rep(j,2){
if(umx2.id[j]!=X){
mx2=umx2.mx[j];
arg2=umx2.segid[j];
break;
}
}
uval = D(arg,X,mx,arg2,X,mx2);
}else{
uval = D(arg,X,mx,-1,-1,-1);
}
uval.inc();
uval = uval + D(X);
}
// cout<<"dval"<<endl<<dval<<endl;
// cout<<"uval"<<endl<<uval<<endl;
up.update(X,dval);
down.update(X,uval);
}
int ans=max(up.calc(0,K).mx[0],down.calc(0,K).mx[0]);
if(ans<=2) ans=0;
cout<<ans<<endl;
}
sigma425