C - Manhattan Subarrays 思维
绝对值不等式:
假设有下标i,j,k,i<j<k,会有三种情况:
化简就是
当b[k]>=b[j]&&b[j]>=b[i]||b[k]<=b[j]&&b[j]<=b[i]时成立
第二种是
化简就是
可以证明这是不合法的,利用绝对值不等式可以将式子写成
而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;
}