C - Manhattan Subarrays 思维,E - The League of Sequence Designers 构造

142 篇文章 1 订阅
92 篇文章 0 订阅

C - Manhattan Subarrays 思维

绝对值不等式:||a|-|b||<=|a-b|<=|a|+|b|

假设有下标i,j,k,i<j<k,会有三种情况:

|b[k]-b[i]|+k-i=|b[j]-b[i]|+j-i+|b[k]-b[j]|+k-j

化简就是

|b[k]-b[i]|=|b[k]-b[j]|-|b[j]-b[i]|

当b[k]>=b[j]&&b[j]>=b[i]||b[k]<=b[j]&&b[j]<=b[i]时成立

第二种是

|b[j]-b[i]|+j-i=|b[k]-b[j]|+k-j+|b[k]-b[i]|+k-i

化简就是

|b[j]-b[i]|=|b[k]-b[j]|+|b[k]-b[i]|+2k-2j

可以证明这是不合法的,利用绝对值不等式可以将式子写成

|b[j]-b[i]|=|(b[k]-b[i])-(b[k]-b[j])|<=|b[k]-b[i]|+|b[k]-b[j]|

而2k-2j>0,所以等式是不会成立的,所以只有b[i],b[j],b[k]单增或单减的时候才会是坏数组,而又可以证明当数组长度为5时一定是坏的,因为总可以找出3个是单增或单减,所以只需要看3和4的情况就可以了,1和2是一定可以的分别是n和n-1种情况

#include<bits/stdc++.h>
//#pragma-GCC-optimize("-Ofast");
#define int long long
#define ll __int128
#define lowbit(x) ((x)&(-x))
#define endl '\n'
#define pause system("pause")
using namespace std;
const int N=1e6+5;
const int mod=1e9+7;
const int inf=1e18;
int qpow(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int getinv(int a){return qpow(a,mod-2);}
int t,n,a[N];
bool check(int x,int y,int z)
{
    return (x<=y&&y<=z||x>=y&&y>=z);
}
signed main()
{
    //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int ans=n+n-1;
        for(int i=1;i+2<=n;i++)
        {
            if(!check(a[i],a[i+1],a[i+2]))
            {
                ans++;
                if(i+3<=n&&!check(a[i],a[i+1],a[i+3])&&!check(a[i],a[i+2],a[i+3])&&!check(a[i+1],a[i+2],a[i+3]))
                    ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

E - The League of Sequence Designers 构造

 

#include<bits/stdc++.h>
//#pragma-GCC-optimize("-Ofast");
#define int long long
#define ll __int128
#define lowbit(x) ((x)&(-x))
#define endl '\n'
#define pause system("pause")
using namespace std;
const int N=1e6+5;
const int mod=1e9+7;
const int inf=1e18;
const int up=1e6;
int qpow(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int getinv(int a){return qpow(a,mod-2);}
int a[N],t;
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--)
    {
        int k,L;
        cin>>k>>L;
        if(L>=2000){cout<<"-1\n";continue;}
        int x=k+1999;
        a[1]=-1;
        for(int i=2;i<=1999;i++)
        {
            if(x>up) a[i]=up,x-=up;
            else a[i]=x,x=0;
        }
        cout<<"1999\n";
        for(int i=1;i<=1999;i++) cout<<a[i]<<" ";cout<<endl;
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

killer_queen4804

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值