Codeforces Round #293 (Div. 2) E. Arthur and Questions (思维、贪心)

该博客详细解析了Codeforces Round #293 (Div. 2) E题,题名为'Arthur and Questions'。题目要求在给定序列中填充问号,使得满足特定条件的绝对值之和最小。解题策略是首先将中间的问号设为0,然后根据边界条件调整整个序列。博主通过添加负无穷大和正无穷大数值简化问题,并提供了代码实现。
摘要由CSDN通过智能技术生成

题目链接

题面:
在这里插入图片描述

题意:
给你a1----an,k,要求a [ 1 ] + … + a [ k ] < a [ 2 ]+ … + a [ k+1 ] < a [ 3 ] + … + a [ k+2 ]<…,然后这里的 ai 有可能是 ?,要求你填 ? 的数字,使 a1~an 的绝对值之和最小,不可能输出 Incorrect sequence

题解:由上式要求我们可以得到 a [ 1 ] < a [ k+1 ] < a [ 2k+1 ] < …且 a [ 2 ] < a [ k+2 ] < a [ 2k+2 ] < …且…。
要求绝对值最小,我们每次找连续的一连串?,尽可能让中间的位置为0,这样绝对值最小。
我们先按中间赋值0这样去操作,然后再根据左右边界对整个区间进行修正,全加或全减一个数使得符合要求。

为了操作方便,我们可以在开始加上k个负无穷大的数,在最后加上k个正无穷大的数。

终究是变成了我最讨厌的样子?
也不知道之后还能不能看懂我现在的代码。。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<set>
#define ll long long
#define llu unsigned ll
#define ld long double
#define ui unsigned int
#define pr make_pair
#define pb push_back
#define ui unsigned int
#define lc (cnt<<1)
#define rc (cnt<<1|1)
#define len(x)  (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
#define forhead(x) for(int i=head[(x)];i;i=nt[i])
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define one(n) for(int i=1;i<=(n);i++)
#define rone(n) for(int i=(n);i>=1;i--)
#define fone(i,x,n) for(int i=(x);i<=(n);i++)
#define frone(i,n,x) for(int i=(n);i>=(x);i--)
#define fonk(i,x,n,k) for(int i=(x);i<=(n);i+=(k))
#define fronk(i,n,x,k) for(int i=(n);i>=(x);i-=(k))
#define two(n,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++)
#define ftwo(i,n,j,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++)
#define cls(a) memset(a,0,sizeof(a))
#define cls1(a) memset(a,-1,sizeof(a))
#define clsmax(a) memset(a,0x3f,sizeof(a))
#define clsmin(a) memset(a,0x80,sizeof(a))
#define cln(a,num) memset(a,0,sizeof(a[0])*num)
#define cln1(a,num) memset(a,-1,sizeof(a[0])*num)
#define clnmax(a,num) memset(a,0x3f,sizeof(a[0])*num)
#define clnmin(a,num) memset(a,0x80,sizeof(a[0])*num)
#define sc(x) scanf("%d",&x)
#define sc2(x,y) scanf("%d%d",&x,&y)
#define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define scf(x) scanf("%lf",&x)
#define scf2(x,y) scanf("%lf%lf",&x,&y)
#define scf3(x,y,z) scanf("%lf%lf%lf",&x,&y,&z)
#define scs(x) scanf("%s",x+1)
#define scs0(x) scanf("%s",x)
#define scline(x) scanf("%[^\n]%*c",x+1)
#define scline0(x) scanf("%[^\n]%*c",x)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=1e9+7;
const double eps=1e-8;
const double pi=acos(-1.0);
const int maxm=100100;
const int up=100000;
const int hashp=13331;
const int maxn=300100;

ll a[maxn];
int k,n;
char str[maxn];
bool ha[maxn];

bool check(void)
{
    fone(i,1,k)
    {
        int l=i;
        fonk(j,i+k,n,k)
        {
            if(!ha[j])
            {
                if((j-l-1)/k>a[j]-a[l]-1) return false;
                l=j;
            }
        }
    }
    return true;
}

void get(int l,int r)
{
    int sum=(r-l-1)/k;
    if(sum==0) return ;
    int m=(sum+1)/2;
    int ans=0;
    fronk(i,l+m*k,l+1,k) a[i]=ans--;
    ans=0;
    fonk(i,l+m*k,r-1,k) a[i]=ans++;
    int dis=a[l]-a[l+k];
    if(dis>=0)
    {
        dis++;
        fonk(i,l+k,r-1,k) a[i]+=dis;
    }
    dis=a[r-k]-a[r];
    if(dis>=0)
    {
        dis++;
        fonk(i,l+k,r-1,k) a[i]-=dis;
    }
}

int main(void)
{
    sc2(n,k);
    int cnt=0;
    one(k) a[++cnt]=-lnf;
    one(n)
    {
        scs(str);
        if(str[1]=='?') ha[++cnt]=true;
        else sscanf(str+1,"%lld",&a[++cnt]);
    }
    one(k) a[++cnt]=lnf;
    n=cnt;
    if(!check())
    {
        printf("Incorrect sequence\n");
        return 0;
    }
    fone(i,1,k)
    {
        int l=i;
        fonk(j,i,n,k)
        {
            if(!ha[j])
            {
                get(l,j);
                l=j;
            }
        }
    }
    fone(i,k+1,n-k) printf("%lld ",a[i]);
    putchar('\n');
    return 0;
}


把代码展开之后:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<set>
#define ll long long
#define llu unsigned ll
#define ld long double
#define ui unsigned int
#define pr make_pair
#define pb push_back
#define ui unsigned int
#define lc (cnt<<1)
#define rc (cnt<<1|1)
#define len(x)  (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
#define forhead(x) for(int i=head[(x)];i;i=nt[i])
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define one(n) for(int i=1;i<=(n);i++)
#define rone(n) for(int i=(n);i>=1;i--)
#define fone(i,x,n) for(int i=(x);i<=(n);i++)
#define frone(i,n,x) for(int i=(n);i>=(x);i--)
#define fonk(i,x,n,k) for(int i=(x);i<=(n);i+=(k))
#define fronk(i,n,x,k) for(int i=(n);i>=(x);i-=(k))
#define two(n,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++)
#define ftwo(i,n,j,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++)
#define cls(a) memset(a,0,sizeof(a))
#define cls1(a) memset(a,-1,sizeof(a))
#define clsmax(a) memset(a,0x3f,sizeof(a))
#define clsmin(a) memset(a,0x80,sizeof(a))
#define cln(a,num) memset(a,0,sizeof(a[0])*num)
#define cln1(a,num) memset(a,-1,sizeof(a[0])*num)
#define clnmax(a,num) memset(a,0x3f,sizeof(a[0])*num)
#define clnmin(a,num) memset(a,0x80,sizeof(a[0])*num)
#define sc(x) scanf("%d",&x)
#define sc2(x,y) scanf("%d%d",&x,&y)
#define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define scf(x) scanf("%lf",&x)
#define scf2(x,y) scanf("%lf%lf",&x,&y)
#define scf3(x,y,z) scanf("%lf%lf%lf",&x,&y,&z)
#define scs(x) scanf("%s",x+1)
#define scs0(x) scanf("%s",x)
#define scline(x) scanf("%[^\n]%*c",x+1)
#define scline0(x) scanf("%[^\n]%*c",x)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=1e9+7;
const double eps=1e-8;
const double pi=acos(-1.0);
const int maxm=100100;
const int up=100000;
const int hashp=13331;
const int maxn=300100;

ll a[maxn];
int k,n;
char str[maxn];
bool ha[maxn];

bool check(void)
{
    for(int i=1;i<=k;i++)
    {
        int l=i;
        for(int j=i+k;j<=n;j+=k)
        {
            if(!ha[j])
            {
                if((j-l-1)/k>a[j]-a[l]-1) return false;
                l=j;
            }
        }
    }
    return true;
}

void get(int l,int r)
{
    int sum=(r-l-1)/k;
    if(sum==0) return ;

    int m=(sum+1)/2;
    int ans=0;
    for(int i=l+m*k;i>=l+1;i-=k) a[i]=ans--;
    ans=0;
    for(int i=l+m*k;i<=r-1;i+=k) a[i]=ans++;

    int dis=a[l]-a[l+k];
    if(dis>=0)
    {
        dis++;
        for(int i=l+k;i<=r-1;i+=k) a[i]+=dis;
    }
    dis=a[r-k]-a[r];
    if(dis>=0)
    {
        dis++;
        for(int i=l+k;i<=r-1;i+=k) a[i]-=dis;
    }
}

int main(void)
{
    scanf("%d%d",&n,&k);
    int cnt=0;
    for(int i=1;i<=k;i++) a[++cnt]=-lnf;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",str+1);
        if(str[1]=='?') ha[++cnt]=true;
        else sscanf(str+1,"%lld",&a[++cnt]);
    }
    for(int i=1;i<=k;i++) a[++cnt]=lnf;
    n=cnt;
    if(!check())
    {
        printf("Incorrect sequence\n");
        return 0;
    }
    for(int i=1;i<=k;i++)
    {
        int l=i;
        for(int j=i+k;j<=n;j+=k)
        {
            if(!ha[j])
            {
                get(l,j);
                l=j;
            }
        }
    }
    for(int i=k+1;i<=n-k;i++) printf("%lld ",a[i]);
    putchar('\n');
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水利改革发展 中国政府高度重视水利建设,将水利作为国家基础设施建设的优先领域。政策文件强调了防洪抗旱、水资源管理、水环境保护和水生态修复等方面的全面要求,推动了水利信息化的发展。 智慧水利建设目标 智慧水利的建设目标是通过数据共享、应用惠民、应急预警等手段,打破信息孤岛,提升应急抢险协作能力,加强水利数据在惠民信息化方面的应用。同时,提出了共享联动化、解决信息安全问题、提高水利信息科技创新能力等目标。 智慧水利建设模式 智慧水利的建设模式包括构建统一平台、数据中心、信息整合平台、决策支持系统等,以实现水利、海洋、环保等政府部门和公众的信息共享和服务。此外,还包括了云计算虚拟化、网络传输、采集工程等多个方面的技术应用。 智慧水利应用实例 智慧水利的应用实例包括视频水文工程监控、多要素一体化检测设备、汛情预警智能联动、三防决策指挥、河长综合信息展示等。这些应用通过集成GIS、互联网地图服务、物联网设备等技术,实现了对水利设施的实时监控、数据分析和应急响应。 成功案例与展望 智慧水利的成功案例展示了通过视频监控、预警信息发布、移动办公信息APP等技术,有效提升了灾害应对能力、水资源管理和河长制的实施效果。这些案例表明,智慧水利的建设不仅提高了水利管理的效率和水平,也为未来的水利信息化发展提供了方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值