您的位置:首页 > 其它

#1074 : 字体设计

2015-09-12 11:09 323 查看

描述

你正在协助某人开发某种新的 Linux 下的中文字体。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=100010;
int A[maxn],cnt,ans[maxn];
int mx[maxn][20],mn[maxn][20],Log[maxn];
void init(int n) {
Log[0]=-1;
rep(i,1,n) Log[i]=Log[i>>1]+1;
rep(i,1,n) mx[i][0]=mn[i][0]=i;
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++) {
int v1=mx[i][j-1],v2=mx[i+(1<<j-1)][j-1];
mx[i][j]=A[v1]>A[v2]?v1:v2;
v1=mn[i][j-1],v2=mn[i+(1<<j-1)][j-1];
mn[i][j]=A[v1]<A[v2]?v1:v2;
}
}
void query(int l,int r,int& p1,int& p2) {
int k=Log[r-l+1];
p1=A[mx[l][k]]>A[mx[r-(1<<k)+1][k]]?mx[l][k]:mx[r-(1<<k)+1][k];
p2=A[mn[l][k]]<A[mn[r-(1<<k)+1][k]]?mn[l][k]:mn[r-(1<<k)+1][k];
}
void solve(int l,int r) {
if(l+1>=r) return;
int p1,p2;query(l+1,r-1,p1,p2);
if(A[p2]<min(A[l],A[r])) ans[++cnt]=p2,solve(l,p2),solve(p2,r);
else if(A[p1]>max(A[l],A[r])) ans[++cnt]=p1,solve(l,p1),solve(p1,r);
}
int main() {
int n=read();
rep(i,1,n) A[i]=read();
init(n);
ans[++cnt]=1;ans[++cnt]=n;
solve(1,n);
printf("%d\n",cnt);
sort(ans+1,ans+cnt+1);
printf("%d",ans[1]);rep(i,2,cnt) printf(" %d",ans[i]);
return 0;
}


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