E:直接n方模拟一波
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=2e6+5;const ll maxx=1e4+7;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){ if(!b) return a; return gcd(b,a%b);};
/*
i am hengheng
*/
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;vector<ll>v[maxx];
ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};
ll n,m;
ll sum[maxx];
ll a[maxx];
ll mp[maxx];
int main()
{
ll i,j,k;
ll t;
ll id,x,y,l,r,p,q;
cin>>t;
while(t--)
{
ll ans=0;
cin>>n;
mem(mp,0);
rep(i,1,n){
read(a[i]);
mp[a[i]]++;
}
sum[1]=a[1];
rep(i,2,n)
{
sum[i]=sum[i-1]+a[i];
}
rep(i,1,n)
rep(j,i+1,n)
{
ll p=(sum[j]-sum[i-1]);
if(p<=n&&mp[p]>0)
{
ans+=mp[p];
mp[p]=0;
//cout<<p<<endl;
}
}
cout<<ans<<endl;
}
return 0;
}
F 构造,先n0然后n1然后n2,考虑到n0可以直接获得,然后考虑n1,每个1会使得左右的0实现两边,所以只需要对边界处理要不要多加一个1使得n1个数符合即可。
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=2e6+5;const ll maxx=2e6+7;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){ if(!b) return a; return gcd(b,a%b);};
/*
i am hengheng
*/
// head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;vector<ll>v[maxx];
ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};
ll n,m;
ll dp[maxx];
// a[maxx],b[maxx],c[maxx];
map<ll,ll>mp;
ll biaoji[1002];
int main()
{
ll i,j,k;
ll t;
ll id,x,y,l,r,p,q;
cin>>t;
while(t--)
{
ll a,b,c,d;
cin>>a>>b>>c;
d=b;
if(b==0)
{
if(a!=0) rep(i,1,a+1) printf("0");
if(c!=0) rep(i,1,c+1) printf("1");
}
else
{
rep(i,1,a+1) printf("0");
b=(b-1)/2;
rep(i,1,b)
{
printf("10");
}
rep(i,1,c+1) printf("1");
if(!(d&1)) printf("0");
//else printf("1");
}
printf("\n");
}
return 0;
}
G:
直接大力构造,差值要小于等于4大于等于2,那我们就让他等于2和4,前面构造3 1 5然后每次加四,到后面每次建2,就把所有奇数都构造了,末尾是7,然后偶数:4 2 6 8 10...每次加2即可。
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=2e6+5;const ll maxx=2e6+7;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){ if(!b) return a; return gcd(b,a%b);};
/*
i am hengheng
*/
/ head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;vector<ll>v[maxx];
ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};
ll n,m;
ll dp[maxx];
ll a[maxx];
ll b[maxx];
map<ll,ll>mp;
ll biaoji[1002];
int main()
{
ll i,j,k;
ll t;
ll id,x,y,l,r,p,q;
n=1001;
a[1]=3;
a[2]=1;
a[3]=5;
b[1]=4;
b[2]=2;
b[3]=6;
rep(i,4,n) b[i]=b[i-1]+2;
rep(i,4,500)
{
a[i]=a[i-1]+4;
if(a[i]>=999)
{
j=i;
break;
}
}
rep(i,j+1,n)
{
a[i]=a[i-1]-2;
if(a[i]==7) break;
}
// rep(i,1,n) cout<<a[i]<<endl;
cin>>t;
while(t--)
{
cin>>n;
if(n<=3)
{
printf("-1\n");
}
else if(n==6)
{
printf("5 3 6 2 4 1 \n");
}
else
{
mem(biaoji,0);
rep(i,1,1000)
{
if(biaoji[a[i]]==0&&a[i]<=n&&a[i]!=0)
{
printf("%lld ",a[i]);
biaoji[a[i]]=1;
}
}
rep(i,1,1000)
{
if(b[i]<=n&&b[i]!=0) printf("%lld ",b[i]);
}
printf("\n");
}
}
return 0;
}