描述

你正在协助某人开发某种新的 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;
}

View Code

转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/4802709.html

#1074 : 字体设计相关推荐

  1. 零基础ui设计培训一定要知道字体设计规则

    作为一名UI设计师,最最重要的就是字体设计这方面,很多UI设计工作中,字体是必不可缺的,下面小编就为大家详细的介绍一下零基础ui设计培训一定要知道字体设计规则. 零基础ui设计培训一定要知道字体设计规 ...

  2. 【UI设计培训】字体设计-偏旁部首变形

    UI设计培训中字体设计也是非常重要的一节课,字体在UI设计岗位中可以说用到的频率是非常高的,是设计师必须学会并且要有娴熟运用的一项必备技能,在进行汉字设计的时候,可以把汉字拆分成几个偏旁部首的形式进行 ...

  3. 原始样式增加标题_好看又实用! 10个标题字体设计技巧

    很多新手设计师刚做海报设计的时候,经常直接使用字库的字体,觉得字体设计很难,所以很少自己去设计字体,其实字体设计有很多种形式,今天我们分享10种常见适用于标题的字体设计技巧,好看又实用,足够让你设计出 ...

  4. Illustrator+FontLab 进行字体设计教程

    2019独角兽企业重金招聘Python工程师标准>>> Illustrator 提供了强悍的绘图工具以及丰富的笔刷,让你简单高效的绘制字体形状.但当你在 Illustrator 中完 ...

  5. X4扭曲字体或图形 coreldraw_20种字体设计与创意方法(超全,超实用)

    是不是曾经为字体设计而烦恼?福利来了~ 字体均由人工设计.我们常用的各类字体是由各个字体设计师设计,即绘制或构建而成.这些设计师通常默默无闻地劳动,但其作品却被我们每天使用.就像各种书法字体一样,一个 ...

  6. 如何给字体添加底色indesign_“美哉汉字”2020字体设计专家工作坊预告+报名

    中文标点如何处理? 什么是标点挤压? 段落处理的规则是什么? 中文的网格如何形成? 这个周末让我们一起聆听...... ▼ "美哉汉字"2020字体设计专家工作坊于12月06日在上 ...

  7. 矩形法_字体设计 | 新手必学,超简单的矩形造字法!!

    点击蓝字关注,创智助你长姿势 作为一个刚刚踏入设计界的"萌新"来说,字体设计可能是除了版式设计之外最简单的功课了,那么今天教学内容就是最简单的字体设计:矩形造字法. 矩形造字法是以 ...

  8. 字体设计灵感|浓墨重彩!代表“墨”字设计案例

    做中国风海报字体不好看? 如今越来越多国潮崛起, 中国风设计也越来越受到关注 而将传统中国风字体运用到现代平面设计中 不仅可以丰富设计的视觉效果 增加设计的文化韵味,还能体现设计的民族性. 集设网 w ...

  9. 字体设计灵感合集|字体决定了设计

    字体设计合集 这是集设网收集的一系列美丽的,鼓舞人心的字体和字体集合. 惊艳的海报字体,装饰脚本和一切之间! 为你的下一个设计项目找到完美的字体,不妨先到集设网 www.ijishe.com 看看收集 ...

最新文章

  1. python多线程同步与互斥_Python之多线程:线程互斥与线程同步
  2. 【树莓派】首发树莓派4原型机接口参数曝光
  3. PHP获取表单值--同时获取下拉框的Value和Text值
  4. 给asp.net mvc小白扫盲用的
  5. 我的BERT!改改字典,让BERT安全提速不掉分(已开源)
  6. 【Docker】Docker容器和主机如何互相拷贝传输文件
  7. 安装过mysql和p_MAC下安装与配置MySQL
  8. linux网络子系统分析(三)—— INET连接建立API分析之bind listen
  9. 华硕aura完全卸载_这把键盘,或是顶级光轴键盘!华硕TUF GAMING K7光轴机械键盘...
  10. 数据分析在银行业应用之欺诈检测
  11. Excel--Vlookup与match、index函数
  12. Vue下拉列表el-select二级联动效果
  13. 学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化
  14. Threejs实现模拟河流,水面水流,水管水流,海面
  15. AnyDesk 未连接到服务器。请检查您的互联网连接
  16. CentOS7.2(单网卡iptables)做DNAT访问弹性IP地址端口转发到后端无公网IP的服务器不同端口
  17. todo清单项目开发,todo清单不止是简单的勾选,还能做更多事情
  18. 内核调试番外篇 - KDB的介绍与简单使用
  19. 概率论与数理统计 —— 概率论的基本概念
  20. Oracle clean out.,Oracle(block clean out)的块清除

热门文章

  1. Delphi 的消息机制浅探三
  2. wpf 绘制rectangle 代码
  3. 通过timer控件和窗体的opacity属性,轻松实现窗体的淡入淡出
  4. 5.5.4 函数内部属性
  5. windows powershell
  6. (转)linux基本变量学习:位置变量$0 、$1 shift轮替、本地变量、环境变量、特殊变量...
  7. 当谈论设备指纹时,我们到底在说什么?(转)
  8. 汇编语言:实验一 查看CPU和内存,用汇编指令和机器指令编程
  9. 利用svn自动同步更新到网站服务器 -- 网摘
  10. 设计模式05-建造者模式