zoukankan      html  css  js  c++  java
  • 【codeforces 761D】Dasha and Very Difficult Problem

    time limit per test2 seconds
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    Dasha logged into the system and began to solve problems. One of them is as follows:

    Given two sequences a and b of length n each you need to write a sequence c of length n, the i-th element of which is calculated as follows: ci = bi - ai.

    About sequences a and b we know that their elements are in the range from l to r. More formally, elements satisfy the following conditions: l ≤ ai ≤ r and l ≤ bi ≤ r. About sequence c we know that all its elements are distinct.

    Dasha wrote a solution to that problem quickly, but checking her work on the standard test was not so easy. Due to an error in the test system only the sequence a and the compressed sequence of the sequence c were known from that test.

    Let’s give the definition to a compressed sequence. A compressed sequence of sequence c of length n is a sequence p of length n, so that pi equals to the number of integers which are less than or equal to ci in the sequence c. For example, for the sequence c = [250, 200, 300, 100, 50] the compressed sequence will be p = [4, 3, 5, 2, 1]. Pay attention that in c all integers are distinct. Consequently, the compressed sequence contains all integers from 1 to n inclusively.

    Help Dasha to find any sequence b for which the calculated compressed sequence of sequence c is correct.

    Input
    The first line contains three integers n, l, r (1 ≤ n ≤ 105, 1 ≤ l ≤ r ≤ 109) — the length of the sequence and boundaries of the segment where the elements of sequences a and b are.

    The next line contains n integers a1,  a2,  …,  an (l ≤ ai ≤ r) — the elements of the sequence a.

    The next line contains n distinct integers p1,  p2,  …,  pn (1 ≤ pi ≤ n) — the compressed sequence of the sequence c.

    Output
    If there is no the suitable sequence b, then in the only line print “-1”.

    Otherwise, in the only line print n integers — the elements of any suitable sequence b.

    Examples
    input
    5 1 5
    1 1 1 1 1
    3 1 5 4 2
    output
    3 1 5 4 2
    input
    4 2 9
    3 4 8 9
    3 2 1 4
    output
    2 2 2 9
    input
    6 1 5
    1 1 1 1 1 1
    2 3 5 4 1 6
    output
    -1
    Note
    Sequence b which was found in the second sample is suitable, because calculated sequence c = [2 - 3, 2 - 4, 2 - 8, 9 - 9] = [ - 1,  - 2,  - 6, 0] (note that ci = bi - ai) has compressed sequence equals to p = [3, 2, 1, 4].

    【题目链接】:http://codeforces.com/contest/761/problem/D

    【题解】

    因为
    c[i] = b[i]-a[i];
    题目所给的p[i]实际上是c[i]之间的大小关系;
    p[i]=1是最小的,p[i]=2则是第二小…p[i]=n则是最大的;
    这样我们可以让
    c的值从小到大为
    c[1],c[1]+1,c[1]+2,c[1]+3…c[1]+n-1;
    即每个值递增1
    这样能够在满足p[]数组的情况下尽可能地让c[i]小,相应的b[i]也就小了
    但是有可能我们要求c[i]为递增的规律的时候;
    b[i]是根据c[i]求出来的
    某个i会出现
    b[i]< l
    这个时候让b[i]为l(b数组没有说一定要全都不同)
    然后c[i]相应地调整;
    c[i]会变大一点,这样能保证满足p数组,同时b[i]还是最小的l,所以还是能够保证c[i]此时也是最小的
    (但是如果b[i]>r,则直接输出无解;
    因为此前的操作我们已经尽可能的让c数组小了;
    如果还不行(即b[i]还是太大),那么就无解了;)
    然后再从i+1开始

    c[i+1]=c[i]+1
    c[i+2] = c[i]+2

    即此后每个值还是递增1
    然后求出相应的b数组
    (所以这个c数组最后可能中间会有不是c[i]=c[i-1]+1的断层);
    一开始的时候设最小的c的下标为idx
    让b[idx]=l;(这样能保证b数组、c数组一开始是最小的了)
    求出这个时候的c[idx]作为发生器;
    然后做上面的过程就好;
    贪心点就是时刻保证c、b数组是最小的,这样b数组在某个时刻通过c数组获得的时候,如果大于r则肯定无解;
    小于l则可以调整为l,还是保证c、b为最小的;

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%I64d",&x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int MAXN = 1e5+100;
    
    int a[MAXN],n,l,r,cc[MAXN],b[MAXN],c[MAXN];
    
    void wujie()
    {
        puts("-1");
        exit(0);
    }
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        cin >> n >> l >> r;
        rep1(i,1,n)
            rei(a[i]);
        rep1(i,1,n)
        {
            int x;
            rei(x);
            cc[x] = i;
        }
        //c[i] = b[i]-a[i];
        //c[idx]>c[1]
        //b[idx]-a[idx]>b[1]-a[1];
        //c[i]+a[i] = b[i];
        b[cc[1]] = l;
        c[cc[1]] = b[cc[1]]-a[cc[1]];
        int temp = b[cc[1]]-a[cc[1]];
        rep1(i,2,n)
        {
            int idx = cc[i];
            //
            c[idx] = temp+1;
            b[idx] = c[idx]+a[idx];
            temp++;
            if (b[idx]<l)
            {
                b[idx] = l;
                temp = b[idx]-a[idx];
            }
            if (b[idx]>r)
                wujie();
        }
        for (int i = 1;i <= n;i++)
        {
            printf("%d",b[i]);
            if (i==n)
                puts("");
            else
                putchar(' ');
        }
        return 0;
    }
  • 相关阅读:
    输出流
    异常处理
    异常限制
    多个受控异常
    跟踪异常传播
    动手动脑练习2
    动手动脑练习
    文件总结
    程序员修炼之道3
    Shell教程 之printf命令
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626656.html
Copyright © 2011-2022 走看看