您的位置:首页 > 其它

套题 Codeforces Round #277 (Div. 2)

2015-10-25 13:19 274 查看
A. Calculating Function

水题,分奇数偶数处理一下就好了

#include<iostream>
#include<stdio.h>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100005
int b[maxn];
int a[maxn];
void add(int x,int val)
{
while(x<=100000)
{
b[x] = max(b[x],val);
x += x & (-x);
}
}
int get(int x)
{
int ans = 0;
while(x)
{
ans = max(ans,b[x]);
x -= x & (-x);
}
return ans;
}
int dp1[maxn];
int dp2[maxn];
int ans[maxn];
map<int,int> H;
int main()
{
int n;scanf("%d",&n);
int LIS = 0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp1[i] = 1 + get(a[i]-1);
add(a[i],dp1[i]);
LIS = max(LIS,dp1[i]);
}
reverse(a+1,a+1+n);
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
a[i] = 100000 - a[i] + 1;
dp2[i] = 1 + get(a[i] - 1);
add(a[i],dp2[i]);
}
reverse(dp2+1,dp2+1+n);
for(int i=1;i<=n;i++)
{
if(dp1[i]+dp2[i]-1!=LIS)ans[i]=1;
else H[dp1[i]]++;
}
for(int i=1;i<=n;i++)
{
if(ans[i]!=1&&H[dp1[i]]==1)
{
ans[i]=3;
}
}
for(int i=1;i<=n;i++)
if(ans[i]==1)
cout<<"1";
else if(ans[i]==0)
cout<<"2";
else if(ans[i]==3)
cout<<"3";
}
/*
10
2 2 2 17 8 9 10 17 10 5
*/


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: