ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) D. Array Restoration (贪心,

2021-04-26 17:34:05  阅读:158  来源: 互联网

标签:rated based int ll mx ok Div rep define


  • 题意:刚开始有一长度为\(n\),空白的空数组,有\(q\)次询问,每次询问都会选一个区间\([l,r]\)将其全部涂成颜色i,现在给你一个数组,问你能否得到所给的数组,\(0\)表示任何颜色都可以.

  • 题解:首先这题有一个坑点,数组中必须要有颜色\(q\),然后,易知两个相同颜色之间一定不能有比它小的颜色出现,那么对于\(0\)我们就很容易构造了,如果数组中没有颜色\(q\),就先让一个\(0\)变成\(q\),其他情况只要正反递推让\(0\)等于相邻位置的颜色就好了,因为这样就可以将\(0\)合到一个连续的区间去,一定是最优合法的,剩下的只要用线段树求区间最小值判断是否合法即可.

  • 代码:

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    #define rep(a,b,c) for(int a=b;a<=c;++a)
    #define per(a,b,c) for(int a=b;a>=c;--a)
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
     
    int a[N];
    vector<int> v[N];
     
    struct misaka{
    	int l,r;
    	int mi=INF;
    }tr[N<<2];
     
    void push_up(int u){
    	tr[u].mi=min(tr[u<<1].mi,tr[u<<1|1].mi);
    }
     
    void build(int u,int l,int r){
    	if(l==r) tr[u]={l,r,a[r]};
    	else{
    		tr[u]={l,r,INF};
    		int mid=(l+r)>>1;
    		build(u<<1,l,mid);
    		build(u<<1|1,mid+1,r);
    		push_up(u);
    	}
    }
     
     
    int query(int u,int l,int r){
    	if(tr[u].l>=l && tr[u].r<=r) return tr[u].mi;
     
    	int mid=(tr[u].l+tr[u].r)>>1;
     
    	int res1=INF,res2=INF;
    	if(l<=mid) res1=query(u<<1,l,r);
    	if(r>mid) res2=query(u<<1|1,l,r);
    	return min(res1,res2);
    }
     
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	int n,q;
    	cin>>n>>q;
    	int mx=0;
    	rep(i,1,n){
    		cin>>a[i];
    		v[a[i]].pb(i);
    		mx=max(mx,a[i]);
    	}
     
     
    	bool flag=true;
    	bool ok=false;
    	if(mx==q) ok=true;
    	rep(i,1,n){
    		if(a[i]==0){
    			if(!ok){
    				a[i]=q;
    				ok=true;
    			}
    			else{
    				a[i]=max(a[i-1],a[i+1]);
    			}
    		}
    	}
    	per(i,n,1){
    		if(a[i]==0){
    			a[i]=max(a[i-1],a[i+1]);
    		}
    	}
    	
    	build(1,1,n);
     
    	rep(i,1,q){
    		if(v[i].empty()) continue;
    		int n=(int)v[i].size();
    		int res=query(1,v[i][0],v[i][n-1]);
    		if(res<i) flag=false;
    		if(!flag) break;
    	}
     
    	mx=0;
    	rep(i,1,n){
    		mx=max(mx,a[i]);
    	}
    	if(mx!=q) flag=false;
     
    	if(flag){
    		cout<<"YES\n";
    		rep(i,1,n){
    			cout<<a[i]<<' ';
    		}
    	}
    	else{
    		cout<<"NO\n";
    	}
     
     
        return 0;
    }
    

标签:rated,based,int,ll,mx,ok,Div,rep,define
来源: https://www.cnblogs.com/lr599909928/p/14705657.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有