Codeforces Round #210 (Div. 2)(构造)

这是不是构造专题,怎么前几个都是构造题

A - Levko and Table 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(j!=1)cout<<" ";
            if(i==j)cout<<k;
            else cout<<0;
        }
        cout<<endl;
    }
    return 0;
}

B - Levko and Permutation 

题意:构造一个序列使得有k个数,满足gcd(i,ai)>1

思路:gcd(n,n+1)=1,gcd(1,n)=1;

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    if(k>=n){cout<<-1<<endl;return 0;}
    else
    {
        if(2+k>n)cout<<1;
        else cout<<2+k;
        for(int i=2;i<2+k;i++)cout<<" "<<i;
        for(int i=k+2;i<=n;i++)
        {
            if(i+1>n)cout<<" "<<(i+1)%n;
            else cout<<" "<<i+1;
        }
    }
    cout<<endl;
    return 0;
}

C - Levko and Array Recovery

先初始化一个很大的数组,然后从最后一次询问开始,如果是1则区间内都减去这个值,如果是2则取最小值,然后验证一遍对不对。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50500;
const long long INF=10000000000000000;
typedef long long LL;
int op[maxn],L[maxn],R[maxn],val[maxn];
LL num[maxn],add[maxn];
int n,m;
int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)scanf("%d%d%d%d",&op[i],&L[i],&R[i],&val[i]);
    for(int i=0;i<=n;i++)num[i]=INF;
    for(int i=m;i>=1;i--)
    {
        if(op[i]==1)
        {
            for(int j=L[i];j<=R[i];j++)num[j]-=val[i];
        }
        else for(int j=L[i];j<=R[i];j++)num[j]=min(num[j],LL(val[i]));
    }
    bool flag1=false,flag2=false;
    for(int i=1;i<=m;i++)
    {
        flag1=flag2=false;
        for(int j=L[i];j<=R[i];j++)
        {
            if(op[i]==1)add[j]+=val[i],flag1=true;
            else if(num[j]+add[j]>val[i])flag2=true;
            else if(num[j]+add[j]==val[i])flag1=true;
        }
        if(!flag1)flag2=true;
        if(flag2)break;
    }
    if(flag2)cout<<"NO"<<endl;
    else
    {
        cout<<"YES"<<endl;
        for(int i=1;i<=n;i++)
        {
            if(num[i]>1e9)num[i]=1e9;
            if(num[i]<-1e9)num[i]=-1e9;
            cout<<num[i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值