题面。
看到这道题的第一眼,就想到用分块思想来解决。
思路
我们知道,当对任意一个 \(i\) 进行翻转时,区间 \([i-k,i+k]\) 内的所有元素都会翻转,每次翻转的总个数为 \(2 \times k+1\)。
因此,我们可以将所有烤串分成长度为 \(len=2 \times k+1\) 的 \(block=n \div len\) 块,用数组 \(L\) 与 \(R\) 来记录每一块的左右值,并像分块操作一样对他进行补块操作。此时需要翻转的次数就是 \(block\)。
接下来进行判断,当 \(n\) 恰好分成长度为 \(len\) 的 \(block\) 块时,直接输出每个 \(L_i\) 即可。此时第一块与最后一块只翻转了长度为 \(k+1\) 的烤串,中间的 \(block-2\) 个块充分翻转了中间所有的烤串一次。
当 \(n\) 没有被恰好分成长度为 \(len\) 的 \(block\) 块时,最后一块的长度 \(R_i-L_i+1 \ne len\),其实就是 \(n \bmod len\)。此时将所有的块向右移动 \(\frac{n \bmod len}{2}\) 个单位长度在输出 \(L_i\) 即可。这里每个烤串只翻一遍,需要注意。
代码
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#define ll long long
#define inf 0x3f3f3f3f
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
#pragma comment(linker , "/stack : 200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
inline char gchar()
{
static char buf[1000000] , *p1 = buf , *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 1000000 , stdin) , p1 == p2) ? EOF : *p1++;
}
inline ll read()
{
ll x = 0 , f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')
{
f = -1;
}
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
ll n , k;
ll L[1005] , R[1005];
signed main()
{
n = read();
k = read();
if(k == 0)//特判
{
printf("%lld\n" , n);
fr(i , 1 , n)
{
printf("%lld ", i);
}
system("pause");
return 0;
}
ll len = 2 * k + 1;
ll block = n / len;
fr(i , 1 , block)
{
L[i] = R[i - 1] + 1;
R[i] = len * i;
}
if(R[block] < n)
{
block++;
L[block] = R[block - 1] + 1;
R[block] = n;
}
printf("%lld\n" , block);
if(n % len != 0)
{
ll kkk = n % len;
fr(i , 1 , block)
{
printf("%lld " , L[i] + kkk / 2);
}
}
else
{
fr(i , 1 , block)
{
printf("%lld " , (L[i] + R[i]) / 2);
}
}
system("pause");
return 0;
}
标签:ch,题解,Cooking,CF1040B,len,p1,include,buf,block
From: https://www.cnblogs.com/xhqdmmz/p/18127529