zoukankan      html  css  js  c++  java
  • Arthur and Questions CodeForces

    大意: 给定序列$a$, 某些位置为'?', 求给'?'赋值使得序列$(a_1+a_2+...+a_k,a_2+a_3+...+a_{k+1},...)$严格递增, 且$sum |a_i| $最小.

    化简一下可以得到$a_1<a_{k+1}<a_{2k+1}<...,a_2<a_{k+2}<a_{2k+2}<...$, 所以每一部分都是独立的, 所以单独考虑k个部分, 贪心使得$sum|a_i|$最小即可.

    #include <iostream>
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <math.h>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    #include <string.h>
    #include <bitset>
    #include <sstream>
    #define REP(i,a,n) for(int i=a;i<=n;++i)
    #define PER(i,a,n) for(int i=n;i>=a;--i)
    #define hr putchar(10)
    #define pb push_back
    #define lc (o<<1)
    #define rc (lc|1)
    #define mid ((l+r)>>1)
    #define ls lc,l,mid
    #define rs rc,mid+1,r
    #define x first
    #define y second
    #define io std::ios::sync_with_stdio(false)
    #define endl '
    '
    #define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int P = 1e9+7, INF = 0x3f3f3f3f;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
    ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
    inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
    //head
    
    
    
    #ifdef ONLINE_JUDGE
    const int N = 1e6+10;
    #else
    const int N = 111;
    #endif
    
    int n, k, a[N];
    
    int main() {
    	scanf("%d%d", &n, &k);
    	REP(i,1,n) { 
    		string s;
    		cin>>s;
    		if (s[0]=='?') a[i]=INF;
    		else {
    			stringstream ss(s);
    			ss>>a[i];
    		}
    	}
    	REP(i,1,k) {
    		for (int j=i; j<=n; j+=k) if (a[j]!=INF) {
    			if (a[j]<=0) { 
    				int now = a[j];
    				for (int ii=j-k; ii>=i; ii-=k) {
    					if (a[ii]==INF) a[ii]=--now;
    					else break;
    				}
    			}
    			if (a[j]>=0) {
    				int now = a[j];
    				for (int ii=j+k; ii<=n; ii+=k) {
    					if (a[ii]==INF) a[ii]=++now;
    					else break;
    				}
    			}
    		}
    		int s = i;
    		while (a[s]!=INF&&s<=n) s+=k;
    		if (s>n) continue;
    		int t = s;
    		while (a[t]==INF&&t<=n) t+=k;
    		t -= k;
    		int d = (s-t)/k/2;
    		if (s-k>=i&&a[s-k]>=d) d=a[s-k]+1;
    		if (t+k<=n&&a[t+k]<=d+(t-s)/k) d=a[t+k]-1-(t-s)/k;
    		for (int j=s; j<=t; ++d,j+=k) a[j]=d;
    	}
    	REP(i,1,n) if (a[i]==INF) return puts("Incorrect sequence"),0;
    	REP(i,1,k) {
    		for (int j=i+k; j<=n; j+=k) if (a[j]<=a[j-k]) return puts("Incorrect sequence"),0;
    	}
    	REP(i,1,n) printf("%d ", a[i]);hr;
    }
    
  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/uid001/p/10774747.html
Copyright © 2011-2022 走看看