CF1474D - Cleaning
Posted Luowaterbi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1474D - Cleaning相关的知识,希望对你有一定的参考价值。
一开始把这个题想复杂了。
从前往后做一下差分p,从后往前做一下差分s。如果前一次不合法,将这一次也标记上。
交换相邻的a[i],a[i+1],只影响p[i-1],a[i],a[i+1],s[i+2]。
判断p[i-1],a[i+1],a[i],s[i+2]能否满足情况。
不知道std为什么写得那么丑。。。
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define lep(i,a,b) for(int i=(a);i>=(b);i--)
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mp make_pair
#define All(x) x.begin(),x.end()
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define multi int T;scanf("%d",&T);while(T--)
using namespace std;
typedef long long ll;
typedef double db;
const int N=2e5+5;
const int mod=1e9+7;
const db eps=1e-6;
const db pi=acos(-1.0);
int n,m;
ll a[N],p[N],s[N],b[N];
int check(ll* a,int len)
a[0]=0;
rep(i,1,len)
a[i]-=a[i-1];
if(a[i]<0) return 0;
if(a[len]==0) return 1;
return 0;
int main()
#ifndef ONLINE_JUDGE
freopen("D:\\\\work\\\\data.in","r",stdin);
#endif
multi
cin>>n;
rep(i,1,n)
cin>>a[i];
b[i]=a[i];
if(p[i-1]==-1) p[i]=-1;
else
p[i]=a[i]-p[i-1];
if(p[i]<0) p[i]=-1;
s[n+1]=0;
lep(i,n,1)
if(s[i+1]==-1) s[i]=-1;
else
s[i]=a[i]-s[i+1];
if(s[i]<0) s[i]=-1;
int flag=(check(b,n)?1:0);
rep(i,1,n-1)
if(flag) break;
ll c[5]=0,p[i-1],a[i+1],a[i],s[i+2];
if(p[i-1]==-1||s[i+2]==-1) continue;
if(check(c,4)) flag=1;
cout<<(flag?"YES":"NO")<<endl;
以上是关于CF1474D - Cleaning的主要内容,如果未能解决你的问题,请参考以下文章
CF1245F Daniel and Spring Cleaning(等会了更新)
CF1245F Daniel and Spring Cleaning(等会了更新)