#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
相关文章推荐
- USACO 1.2 Name That Number (查字典)
- 把云装进“BOX”里
- 一个故事讲清楚 NIO
- hdu 1232 畅通工程
- 使用模板获取迭代器所指对象的类型
- 【CCF】网络延时
- javaScript资源
- 在ubuntu9.10下怎么安装Vmware Tools
- 勿忘“9·11”:BCM不能只做表面文章
- Spring数据格式化
- storcli中raid级别之间的转换
- java实体类生成工具
- 范围最大异或值
- 如何在Win10未激活用户添加桌面图标?Win10未激活用户添加桌面图标的方法
- poj2965解题报告
- Nginx性能优化
- Masonry简单使用
- web容器中使用Timer定时器
- Leet Code 21 Merge Two Sorted Lists
- swfit 重载/自定义运算符