串
背景
形貌昳丽的西克是風子国王嫡系军队的 general, 同时也兼任風子王国驻绿鸟国的外交官。
西克喜欢在蕉含流群里与其它王国的使者蕉含流, 但前段时间由于说怪话被来自绿鸟国意识形态不完全的国王驱含逐出境。
西克非常愤怒, 想要说出一句最怪的话, 但他却忙于敢览求社的训练。
于是, 他找到了你, 无上尼特, 想让你帮助解决他的问题。
题目描述
在風子王国, 一句话由 \(n\) 个词组成, 其中恰好有 \(k\) 个词是怪的, 其它的词都不是怪的。
众所周知, 负负得正, 我们定义一句话的一个区间是怪的, 当且仅当其中含有奇数个怪词。
请构造一句符合条件的话, 使得其中怪的区间数量最多。
输入格式
一行两个整数 \(n,k\) 。
输出格式
第一行一个整数 \(ans\), 表示至多可以有的怪的区间个数。
第二行一个长度为 \(n\) 的 \(01\) 串, 表示构造方案, 若一个单词是怪的, 输出 \(1\), 否则输出 \(0\) , 字符间用空格隔开。
本题使用自定义校验器检验你的答案是否正确, 因此若有多种满足条件的方案, 你只需要输出任意一种。
巨离谱的思维题,怎么都想不到。
将原始数组 \(a_1,a_2,a_3,\dots,a_n\) 转换成前缀和 \(sum_1,sum_2,sum_3,...,sum_n\) 。
令 \(S = sum_r - sum_l\) ,很容易知道,若 \(S\) 为奇数,则 \([l,r]\) 为怪区间。
因为我们只关心 \(S\) 的奇偶性,
若 \(sum_r,sum_l\) 一奇一偶,则 \(S\) 为奇数。
所以答案为 \(sum\) 中奇数个数 \(\times\) 偶数个数。
于是我们需要令 \(sum\) 中奇偶数相等,根据均值不等式,方案数最大。
有一种构造方案(大概是这样):
\(\huge \mathscr{Code}\)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+100;
int n,m;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
if(m==0){
cout<<0<<'\n';
for(int i=1;i<=n;i++) cout<<0<<' ';
return 0;
}
if(n&1) cout<<(n+1)*(n+1)/4<<'\n';
else cout<<n*(n+2)/4<<'\n';
for(int i=1;i<m;i++) cout<<1<<' ';
for(int i=1;i<=n-m-n/2+m/2;i++) cout<<0<<' ';
cout<<1<<' ';
for(int i=1;i<=n/2-m/2;i++) cout<<0<<' ';
return 0;
}

浙公网安备 33010602011771号