题目地址:https://nanti.jisuanke.com/t/41303

题目:


简而言之,题目最终转化为求距a[i] 长度为k的范围内小于a[i]的最大值,然后递推求答案

解题思路:


方法1: set

遍历数组,动态得到以a[i]为中心的区间[i-k,i+k],用set查询这个区间内第一个大于等于a[i]的值,它的前一个就是小于a[i]的最大值(如果有的话),代码简单好写。

方法2:线段树

读入时记录i所在的下标pos[i],先建一个空线段树,i从1开始遍历到n,找到以i为中心的区间[pos[i]-k,pos[i]+k],查询区间最大值,得到的这个最大值一定是小于i的,且是以i为中心的区间内的最大值,就是我们要找的值,然后把i插入线段树中。

注意:区间的左右边界不要越界!

ac代码:


set:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+50;
int t,n,k,a[maxn],ans[maxn],pre[maxn];
set<int> s;
int main()
{scanf("%d", &t);while(t--){s.clear();scanf("%d %d", &n, &k);for(int i = 1; i <= n; i++)scanf("%d", &a[i]);int l = 1, r = min(k+1, n);for(int i = 1; i <= r; i++)s.insert(a[i]);for(int i = 1; i <= n; i++)//a[i]左右两边小于a[i]的最大值{//扩右边while(r-i<k && r+1<=n) s.insert(a[++r]);//除左边while(i-l>k) s.erase(a[l++]);auto it = s.lower_bound(a[i]);if(it != s.begin()) pre[a[i]] = *(--it);else pre[a[i]] = 0;//没有找到比自己小的}ans[1] = 1, ans[0] = 0;for(int i = 2; i <= n; i++)ans[i] = ans[pre[i]] + 1;for(int i = 1; i <= n; i++){if(i!=1) printf(" ");printf("%d",ans[i]);}printf("\n");}return 0;
}

线段树:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int val[maxn*4], a[maxn], pos[maxn], ans[maxn];
int t, n, k;
void push_up(int id)
{val[id] =  max(val[id<<1], val[id<<1|1]);
}
void build(int id, int l, int r)
{if(l == r){val[id] = 0;return ;}int mid = (l+r) >> 1;build(id << 1, l, mid);build(id << 1 | 1, mid+1, r);push_up(id);
}
int query(int id, int l, int r, int x, int y)
{if(x <= l && r <= y)return val[id];int mid = (l+r) >> 1, ans = 0;if(x <= mid) ans = max(ans, query(id << 1, l, mid, x, y));if(y > mid) ans = max(ans, query(id << 1 | 1, mid+1, r, x, y));return ans;
}
void change(int id, int l, int r, int pos, int v)
{if(l == r){val[id] = v;return ;}int mid = (l+r) >> 1;if(pos <= mid) change(id << 1, l, mid, pos, v);if(pos > mid) change(id << 1 | 1, mid+1, r, pos, v);push_up(id);
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d", &t);while(t--){scanf("%d %d", &n, &k);for(int i = 1; i <= n; i++){scanf("%d", &a[i]);pos[a[i]] = i;ans[i] = 0;}build(1, 1, n);for(int i = 1; i <= n; i++){int l = max(1, pos[i]-k), r = min(n, pos[i]+k);int pre = query(1, 1, n, l, r);//cout << i << "  " << pre << endl;ans[i] = ans[pre] + 1;change(1, 1, n, pos[i], i);}for(int i = 1; i <= n; i++){if(i!=1) printf(" ");printf("%d", ans[i]);}printf("\n");}return 0;
}

【2019南京网络赛:F】Greedy Sequence(set/线段树 + 思维)相关推荐

  1. 2019 ICPC 南京网络赛 F Greedy Sequence

    You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], c ...

  2. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  3. 【2019.09.01】2019南京网络赛

    补题地址:https://www.jisuanke.com/contest/3004?view=challenges A: B: C: D: E: F:✅ G: H:✅ I: 转载于:https:// ...

  4. The beautiful values of the palace(2019南京网络赛)

    题目链接:https://nanti.jisuanke.com/t/41298 题意:给一个n * n的螺旋矩阵,n保证是奇数,取一些点使其.获得价值,价值为数位和,然后再给q次查询,求矩阵中的价值总 ...

  5. Holy Grail 2019南京网络赛

    https://nanti.jisuanke.com/t/41305 给定一个有向无负环图,然后告诉你要依次加6条边,要保证每次加边后无负环,求依次加边时保证当前边最小. 由于题目保证有解,所以s-& ...

  6. 2019 南京 网络赛 B (二维偏序,树状数组离线)

    题意: 给出一N*N的蛇形矩阵,具体位置元素值不给你,自己找规律,然后给你M个 有效位置,P次查询,每次查询一个子矩阵中有效元素的权值和,该权值和等于对于 每个有效元素,模10拆分后相加得到的和.(注 ...

  7. The Preliminary Contest for ICPC Asia Nanjing 2019ICPC南京网络赛

    B.super_log (欧拉降幂) •题意 定一个一个运算log*,迭代表达式为 给定一个a,b计算直到迭代结果>=b时,最小的x,输出对m取余后的值 •思路 $log*_{a}(a^{a}) ...

  8. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)

    2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...

  9. 2018 ACM-ICPC南京网络赛 Magical Girl Haze(分层最短路)

    2018 ACM-ICPC南京网络赛 Magical Girl Haze There are NN cities in the country, and MM directional roads fr ...

  10. 2019ICPC亚洲区域赛南京网络赛

    Problem F Greedy Sequence 题目链接:https://nanti.jisuanke.com/t/41303 题意: 给出n个整数,构造s1,s2,s3-sns1,s2,s3-s ...

最新文章

  1. OpenCV+python:膨胀和腐蚀
  2. Java知识点总结(Java容器-EnumSet)
  3. C++ 中 const和define的区别
  4. oracle 查询每组条数,Oracle SQL查询:根据时间检索每组的最新值
  5. Java float类型怎么把小数位数限制为2位
  6. dbref java_java – Spring Data REST MongoDB:检索DBRef的对...
  7. expdp导出 schema_记录一则expdp任务异常处理案例
  8. SpringCloud(三)之Feign实现负载均衡的使用
  9. PostgreSQL 12系统表(10)pg_locks
  10. 腾讯优图开源深度学习推理框架 TNN,助力 AI 开发降本增效
  11. php简历程序模板,PHP程序员工作简历模板下载word格式
  12. 国家航天局:中国将论证建立月球科研基地
  13. 对于拉格朗日乘数法的个人理解
  14. nexmo发送成功,但没有收到短信
  15. 基于EasyNVR实现RTSP_Onvif监控摄像头Web无插件化直播监控之视频直播网络占用率大如何解决的问题分析
  16. Norgen痰液液化缓冲液解决方案
  17. linux nginx连接memcache和ngx_http_consistent_hash负载均衡算法
  18. 国庆节放假调休安排来了!共7天,中疾控:不提倡聚集聚会
  19. POJ 3164 Command Network(朱刘算法)
  20. 计算机辅助开发方法的优缺点,高校计算机辅助教学应用的利弊分析

热门文章

  1. 用Winhex软件定位NTFS文件系统的不明白之处
  2. 下十页分页php,织梦二次开发实现栏目分页前十页后十页功能
  3. session的简单理解和使用
  4. 从键盘录入10个整数,统计有多少个奇数,Java基础轻松实现
  5. python 动态加载代码_python 动态网页爬取?(不是加载更多页的动态网页哟)?...
  6. 信息网络传播中的服务器标准,信息网络传播权的服务器标准与实质替代标准之争...
  7. python控制语句字符串截取_python字符串截取如何操作
  8. Apache JMeter 5.1.1 发布,压力测试工具
  9. 数字信号处理实验(六)——FIR滤波器的设计
  10. 选择播放器你需要知道什么?