Codeforces #504(div1+div2) 1023D Array Restoration(线段树)
题目大意:给你一个数组,数组是经过q次区间覆盖后的结果,第i次覆盖是把区间内的值赋值为i,其中有若干个地方数值未知(就是0),让你判断这个数组是否可以经过覆盖后得到的,如果可以,输出任意一种可行数组。
思路:不合法的情况只有2种。1:两个相同的数字中间出现了比它小的数字,比如: 6 5 6 就不合法,因为覆盖6的时候是覆盖连续的一段区间,而5比6先覆盖,所以这种情况不存在。我赛后看AC代码的时候发现有的人只是判断是否出现谷形的情况,这种是不对的。
比如这种样例:3 3 3 1 2 这种判断方法会输出NO,但实际上却可以覆盖。那么怎么找任意区间内的最小值呢?线段树啊(比赛结束前10分钟才想到。。。)。
2:最大值没出现过而且没有0,因为最大值是最后一次覆盖的,所以肯定有最大值。
那么我们就可以写代码了:
代码:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<iostream>
- #include<string>
- #include<map>
- #include<set>
- #include<bitset>
- #include<vector>
- #include<cmath>
- #include<queue>
- #include<stack>
- #define INF 0x3f3f3f3f
- #define LL long long
- #define mk(a,b) make_pair(a,b)
- #define pii pair<int,int>
- using namespace std;
- const int maxn=200010;
- map<int,int> mp;
- int a[maxn],mi[maxn];
- bool vis[maxn];
- int minv[4*maxn];
- int ql,qr;
- int query(int o,int l,int r){//查询最小值
- int mid=l+(r-l)/2,ans=INF;
- if(ql<=l&&r<=qr)return minv[o];
- if(ql<=mid)ans=min(ans,query(o*2,l,mid));
- if(mid<qr)ans=min(ans,query(o*2+1,mid+1,r));
- return ans;
- }
- void build(int o,int l,int r){
- if(l==r){
- minv[o]=a[l];
- return;
- }
- int mid=l+(r-l)/2;
- build(o*2,l,mid);
- build(o*2+1,mid+1,r);
- minv[o]=min(minv[o*2],minv[o*2+1]);
- }
- int main(){
- int n,m,mi=INF,mx=0,cnt=0;
- bool flag=1;
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++){
- scanf("%d",&a[i]);
- mx=max(mx,a[i]);
- if(a[i]==0){//为了方便建线段树,把0赋值为INF
- a[i]=INF;
- cnt++;
- }
- }
- if(mx<m&&cnt==0){//第二种情况
- printf("NO\n");
- return 0;
- }
- build(1,1,n);//建树
- for(int i=1;i<=n;i++){
- if(a[i]==INF){
- continue;
- }
- if(vis[a[i]]){//如果之前出现过
- ql=mp[a[i]],qr=i;
- if(query(1,1,n)<a[i]){//如果小于a[i]值
- flag=0;
- break;
- }
- }
- vis[a[i]]=1;
- mp[a[i]]=i;
- }
- if(flag==0){//情况1
- printf("NO\n");
- return 0;
- }
- for(int i=1,j;i<=n;i++){//从前往后扫一遍
- if(a[i]!=INF)continue;
- else{
- if(mx<m)a[i]=m;//如果最大值没出现,就赋值为最大值
- else a[i]=a[i-1];//否则赋值为他前面的值
- mx=max(mx,a[i]);
- }
- }
- for(int i=n,j;i>=1;i--){
- if(a[i]!=INF&&a[i]!=0)continue;//防止a[1]为0的情况
- else{
- if(mx<m)a[i]=m;
- else a[i]=a[i+1];
- mx=max(mx,a[i]);
- }
- }
- printf("YES\n");
- for(int i=1;i<=n;i++)
- printf("%d ",a[i]);
- }
Codeforces #504(div1+div2) 1023D Array Restoration(线段树)的更多相关文章
- CF 1023D Array Restoration - 线段树
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...
- CodeForces 266E More Queries to Array...(线段树+式子展开)
开始觉得是规律题的,自以为是的推了一个规律,结果测试数据都没过....看了love神的博客才发现只是把式子展开就找到规律了.不过挺6的是我虽然想错了,但是维护的的东西没有错,只是改改(改了进两个小时好 ...
- codeforces 482B. Interesting Array【线段树区间更新】
题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...
- Codeforces E. Interesting Array(线段树)
题目描述: D. Interesting Arraytime limit per test1 secondmemory limit per test256 megabytesinputstandard ...
- codeforces div2 603 E. Editor(线段树)
题目链接:https://codeforces.com/contest/1263/problem/E 题意:一个编译器,每次输入一些字符,R表示光标右移,L表示光标左移,然后有一些左括号( 和 右括 ...
- Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...
- CodeForces Round #179 (295A) - Greg and Array 一个线段树做两次用
线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l , op.r , op.c= times* ...
- Codeforces 718C. Sasha and Array(线段树)
传送门 解题思路: 这道题给了我们一个崭新的角度来看线段树. 我们常常使用的线段树是维护区间的函数的. 这里呢,提示我们线段树其实还可以维护递推. 美好的矩阵递推性质支持了这一功能. 或者说,对于递推 ...
- CCPC-Wannafly Winter Camp Day1 Div1 - 夺宝奇兵 - [贪心+线段树]
题目链接:https://zhixincode.com/contest/3/problem/J?problem_id=43 样例输入 1 4 1110 11 110 21 210 31 315 415 ...
随机推荐
- android不太常用的控件
AutoCompleteTextView:是一种与EditText类似的视图(实际上他是EditText的子类),只不过它还在用户输入时自动显示完成建议的列表 <AutoCompleteText ...
- 第六次scrum meeting记录
文章负责:刘斯盾 日期:2017年10月30日 会议地点:新主楼F座二楼 各组员工作情况 团队成员 昨日完成任务 明日要完成任务 赵晓宇 评分界面搭建 issue17 课程列表页面搭建 issue20 ...
- c++primer 第三章编程练习答案
3.7.1 #include<iostream> int main() { using namespace std; ; int height,inch,foot; cout <&l ...
- 剑指offer--16.数组中重复的数字
时间限制:1秒 空间限制:32768K 热度指数:198342 本题知识点: 数组 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复 ...
- New Concept English three (54)
打字练习: 27w/m 45errors We have been brought up to fear insects. We regard them as unnecessary creature ...
- idea 创建maven工程(入门)
转:http://blog.csdn.net/qq_32588349/article/details/51461182 1. 下载Maven 官方地址:http://maven.apache.org/ ...
- stack容器
一.stack特性 stack是一种先进后出(first in last out,FILO)的数据结构,它只有一个出口,stack只允许在栈顶新增元素,移除元素,获得顶端元素,但是除了顶端之外,其他地 ...
- HIVE-如何查看执行日志
HIVE既然是运行在hadoop上,最后又被翻译为MapReduce程序,通过yarn来执行.所以我们如果想解决HIVE中出现的错误,需要分成几个过程 HIVE自身翻译成为MR之前的解析错误 Hado ...
- StringBuilder、StringBuffer、String区别
相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天重新把这个概念给大家复习一下,顺便牵出 J2 ...
- Azure CLI的Query
Azure CLI 2.0是基于Python的命令行.其命令直观,使用非常方便. 其输出有四种模式: --output -o : Output format. Allowed values: json ...