#1074 : 字体设计

描述

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

现在需要给上图里的黄点做「位置锚固」,然而有些黄点的位置可以由「插值(IUP)」确定,这样就可以减少锚固的数量。

例如,在上图中,#46 #49 #52 #53 的位置可以由 #42 和 #57 插值得到, 我就不需要去锚固它们,只需要固定 #42 和 #57 就可以了。 可以给这个字减少至少 12 字节 ……

抽象一下问题,现在给出输入数组 a

定义 ax 可以被 al 和 ar 插值得到为:

存在 l < x < r

使得 al ≤ ax ≤ ar 或者 al ≥ ax ≥ ar

求最少的「锚固」元素的数目,使得非锚固元素都可以由其左右最靠近它的锚固元素插值得到。并输出锚固元素的下标。

输入

第一行输入一个数 n,表示数组的大小(1 ≤ n ≤ 105)。 接下来的一行,输入一行 n 个整数 a1, a2, ..., an,表示数组中的元素(1 ≤ ai ≤ 109)。所有 a互不相同。

输出

输出的第一行包含一个整数 ans,表示锚固元素的数目。 接下来一行包含 ans 个递增的整数,表示锚固元素的下标。

提示

额外的样例数据:

样例输入 样例输出
7
1 2 3 10 5 6 4
3
1 4 7

样例输入

8
3 4 2 1 8 5 7 6

样例输出

7
1 2 4 5 6 7 8 

首先左右端点是一定要选的,根据这个性质。所以我们可以用solve(l,r)表示处理[l,r]区间,且已经选了l和r。那么我们求出[l,r]的最小值和最大值的位置,如果其中一个位置不符合要求,肯定要选成锚固元素,递归处理即可。

#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;
}

时间: 2024-10-10 08:45:35

#1074 : 字体设计的相关文章

hihocoder 1074 字体设计(线段树)

这题可以把问题转化为,对于一个位置,限制的位置必然是,递增时候,小于他本身,或者递减时候,大于他本身的位置,然后在这个区间中,寻找最大(小)值的位置,这样利用线段树维护即可,对于一个限制位置,可以先把数字离散化掉,然后用权值做节点很容易就处理出来了,然后第二个问题就是普通的rmq问题 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N

最新版苹果字体设计的秘密和改变

iOS 9发布后,可能很多用户都没有察觉到界面视觉中那些产生了变化,今日这里介绍的是IOS 9中界面字体的细微变化带来的影响.OS 9的系统字体变成了苹果新推出的旧金山字体,代替了之前用的Helvetica Neue. Helvetica(上),旧金山字体(下) 旧金山字体其实很早的时候已经使用在Apple Watch中,如今苹果更多这种字体运用起来,现在我们市面上使用的一些常见的苹果设备都是用了这种字体,例如:Apple Watch.iPhone.iPad和Mac. Apple Watch 从

logo字体设计入门案例

如果我作为一个ui设计初学来说,我会选择临摹别人的作品来对自己做UI培训. 首先我开始临摹的对象是APP store上排行榜前排的APP的logo,这样的好处是有几个的: 1.可以知道市场哪些图标是更容易吸引到用户的点击 2.锻炼自身在色彩敏感度,对比与原作品的差距 3.学习别人的图形形状的构思方式 下面是APP STORE 上排行榜靠前的的logo, 我们可以去临摹,也可以在理解后,加上自己的设计创意,设计出一个有差别的图标. 今天我们主要来讲一讲logo上的字体的设计. 首先我们要确定好移动

分享20个新颖的字体设计草图,带给你灵感

通常我们对最终设计至关重要,但在幕后有很多流程,例如草图. 草图是是把想法作为一种思想框架描绘出来. 有时客户需要一个独特的品牌新标识或字体更方便画在纸上,之后扫描到 Photoshop 和 Illustrator.这里分享20个新颖的字体设计草图,带给你灵感. 您可能感兴趣的相关文章 让人惊叹的的创意404错误页面设计 20幅精美绝伦的光涂鸦摄影作品欣赏 25个别出心裁的简历设计作品欣赏 25个令人惊叹的国外手工纸艺术品 30幅美得令人窒息的风景倒影照片 1. Typography (Crea

一些字体设计的练习

一些字体练习 一些字体设计的练习

西方字体设计与排版基础知识

在css中有个叫line-height的样式,该样式是设置行高用的,在查阅一些文档后发现对于字体而言存在着base-line的概念,而且都没具体讲清楚它的由来等,然后我捉摸着浏览器的排版规则应该是基于早期的文字排印来的,然后整理了下该方面的内容,供后面的学习参考,首先来看下以下这张图片: 1,baseline:基线,指的是多数字母排列的基准线.如图所示,大多数字母都是沿着红色基线排列,唯有"p"向下延伸超过基线,超过的部分称为"将部". 基线准则: -- 大写字母位

【字体设计】如何更好的吸引人?不满意不要钱!

(提供专业.高效的字体设计服务,不满意不收费,联系QQ:3168579596) 字体设计,点击查看!>> 在视觉设计工作中,几乎每项任务都会使用到字体.字体具有非常多的风格,不同风格类型所表达的感情是不一样的.但是通过一些简单的字体改造就能够让字体风格符合我们的需求.下面一品威客网小编告诉您最基础字体设计改造方法,如何让字体活泼起来. 字体是最基础的设计元素,也是设计中必不可少的表达工具.在恰当的环境下使用合适的字体,可以让设计更生动严谨.在运营活动.海报.书籍.包装等诸多媒介中,文字部分作为

源码时代UI干货 | 只用5步教会你制作《这就是街舞》风格的字体设计

PS技巧分享: 5步教你快速学会制作<这就是街舞>风格的字体设计 1.首先用潮字社凌渡鲲鹏简打出一个基础字体 2.再字上面新建一层,给他剪切进去 我们在新建的这一层上,用画笔在笔画上,涂上紫色到蓝色的渐变(颜色比例自定)3.然后ctrl+e,将他们合并成一个图层选择涂抹工具4.然后右键弹出的画笔窗口,再选择画笔窗口右上角的设置选择旧版画笔5.然后在画笔库里找到旧版画笔的默认画笔文件夹,选择喷枪画笔笔刷强度可调整成80去涂抹文字涂的时候尽量跟着笔画来涂,这样效果会更好用这种办法就能做出类似这种字

字体设计的术语

字干(stem) 字母的主要笔画,通常指直线部分的笔画. ? 字碗(bowl) 曲线笔画. ? 字怀(counter) 字母所包含的内部空间,无论是否封闭. ? 极细线(hairline) ? 衬线(serif) 笔画末端带有爪状或直线形状的部分. 括弧型衬线(bracket serif) :带有缓和柔软曲线的衬线. 极细型衬线(hairline serif) :具有细笔画的衬线. 粗衬线(slab serif):正方形粗重衬线. ? 花笔(swash) 字母起笔或末笔处特别伸长的笔画,带有装饰