首页 > 其他分享 >Codeforces Round #713 (Div. 3) E. Permutation by Sum(贪心)

Codeforces Round #713 (Div. 3) E. Permutation by Sum(贪心)

时间:2023-01-12 23:01:04浏览次数:80  
标签:typedef const int Sum 713 Codeforces init LL

本来手痒想自己开把div3练手来着,佬儿叫住我组队打,就换了这场,听说除了G数学,F也是模拟,其它的都是大模拟:)
模拟人可以狠狠冲,注意细节即可

https://codeforces.com/contest/1512/problem/E

题目大意:

给定四个整数n,l,r (1≤l≤r≤n)和s (1≤s≤n(n+1)2 ),要求找出一个满足下列条件的从1到n的数的排列p:

s=pl+pl+1+…+pr。

如果有几个合适的排列,打印其中任何一个;否则输出-1。 
input 
5
5 2 3 5
5 3 4 1
3 1 2 4
2 2 2 2
2 1 1 3
output 
1 2 3 4 5 
-1
1 3 2 
1 2 
-1

详解见代码内注释部分

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1000200,M=2002;
//unordered_map<LL,LL> a[N];
//priority_queue<LL> pq;
//priority_queue<LL,vector<LL>,greater<LL>> pq2;
LL n,l,r,s;
LL a[N],sum[N];
void init()
{
    for(int i=1;i<=500;i++)
        sum[i]=sum[i-1]+i;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    init();
    while(T--)
    {
        cin>>n>>l>>r>>s;
        memset(a,0,sizeof a);
        bool flag=true;
        //cout<<n-(r-l)-1<<" "<<r-l+1<<endl;
        LL maxn=sum[n]-sum[n-(r-l)-1],minn=sum[r-l+1];
        if(maxn<s) flag=false;
        else if(minn>s) flag=false;
        else
        {
            //先把a[l-r]从1-n填满为止
            for(int i=l;i<=r;i++)
                a[i]=i-l+1;
            //for(int i=l;i<=r;i++)
            //    cout<<a[i]<<" ";
            //cout<<endl;
            map<LL,LL> mp;
            LL minn2=minn;
            for(int i=r;i>=l;i--)
            {
                LL need=min(s-minn2,n-a[i]-(r-i));
                //避免出界n-r+i-a[i]
                //a[i]到达n为最大距离,在仍需较大数时要保证后面已经填好的数依旧比自己大,即r-i为边长(一个一个依次递减)
                //cout<<s-minn2<<" "<<n-r+i-a[i]<<endl;
                a[i]+=need;
                minn2+=need;
                mp[a[i]]++;
            }
            //两边填满
            LL j=1;
            for(int i=1;i<l;i++)
            {
                while(j<=n&&mp[j]!=0) j++;
                if(j<=n)
                {
                    a[i]=j++;
                    mp[a[i]]++;
                }
            }
            for(int i=r+1;i<=n;i++)
            {
                while(j<=n&&mp[j]!=0) j++;
                if(j<=n)
                {
                    a[i]=j++;
                    mp[a[i]]++;
                }
            }
            for(int i=1;i<=n;i++)
                cout<<a[i]<<" ";
            cout<<endl;
            mp.clear();
        }
        if(flag==false) cout<<"-1"<<endl;
    }
    return 0;
}

标签:typedef,const,int,Sum,713,Codeforces,init,LL
From: https://www.cnblogs.com/Vivian-0918/p/17048204.html

相关文章

  • Educational Codeforces Round 141 (Rated for Div. 2)(持续更新)
    Preface打的跟shi一样竟然还能上分的说,C一开始写的跟shi一样WA了好几发然后D看一眼没思路就只能去肝E了,结果写了半天还是TLE第14个点,直接心态爆炸A.MakeitBeautiful......
  • Codeforces Round #843 (Div. 2)解题报告
    第一篇文章\ovo/AProblem:把只含有ab的字符串分成三份,使中间的字符串字典序是并列最大或最小,求一种方案Solution:假设前两个字符相同,让前两个字符串长度均为1,这两个字符......
  • Codeforces Round #809 (Div. 2)
    题目链接A核心思路就是一个简单的模拟,没什么好说的,居然做了我十五分钟。还是太菜了。//Problem:A.AnotherStringMinimizationProblem//Contest:Codeforces-......
  • Codeforces Round #763 (Div. 2)C
    CodeforcesRound#763(Div.2)C这个D实在是不会,只能先补了CCC这个题是我们可以选择从3到n我们可以选择一个d(d>=0&&d<=ai/3),可以把2d给ai-2,那么ai-2+=2d,把d给ai-......
  • Summernote 图片上传
    Summernote默认是插入Base64格式的图片,图片并没有上传到服务器。可以通过API自行实现,官方文档:https://summernote.org/deep-dive/#insertnode插入图片://@param{......
  • CodeForces 1733E Conveyor
    洛谷传送门CodeForces传送门考虑差分,如果\(t-1\)时刻经过\((x,y)\)的史莱姆个数等于\(t\)时刻经过\((x,y)\)的史莱姆个数,答案为NO,否则为YES。发现两只史莱姆......
  • Codeforces Round #843 (Div. 2)(B,C,D,E)
    CodeforcesRound#843(Div.2)(B,C,D,E)23年的第一场比赛(现场的),结果还是只是做出了两个题B想起这道题就好笑,我又又又看错题了,这个题里面讲的一直是或,我在比赛全程都以为是......
  • Codeforces Round #843 (Div. 2)ACE 补D
    A.GardenerandtheCapybaras题意:给定一个由ab串,将该字符串拆分成3个部分,使中间部分的字典序最大或者最小。分析:考虑简单的最小情况:中间只有一个a,两边总会\(......
  • Codeforces Edu Round 106 Div2
    解题A.DominoonWindowsill这个题给一个2xn的方格,一个行有k1个白块,第二行有k2个白块,那么现在有w个2x1的白块和b个2x1黑块,白对白,黑对黑,问能不能全放下这个就是判断下白......
  • [Codeforces Round #822 (Div. 2)](https://codeforces.com/contest/1734)
    CodeforcesRound#822(Div.2)ProblemF.ZerosandOnes解法定义:\(f(x)\)为在\(S\)串中位置为\(x\)的值。显然\(f(x)\in0,1\)有一重要性质:若\(f(x)\)为1,那么二进制......