首页 > 其他分享 >CF1040B Shashlik Cooking 题解

CF1040B Shashlik Cooking 题解

时间:2024-04-10 21:48:19浏览次数:15  
标签:ch 题解 Cooking CF1040B len p1 include buf block

题面

看到这道题的第一眼,就想到用分块思想来解决。

思路

我们知道,当对任意一个 \(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

相关文章

  • CF158C Cd and pwd commands 题解
    题面。大模拟,但是有坑点。思路依照题意模拟。用一个字符串\(out\)记录在进行了\(i\)次操作后如果要输出输出的东西,字符串\(in\)和\(s\)来分别记录输入的操作及操作类型。由于输出的第一个字符一定是/,所以可以直接将\(out\)的初始化定为out="/"。这样子可以省去......
  • CF875B Sorting the Coins 题解
    题面。算是比较简单的题目了,自己多手出几个样例就可以发现规律了。强烈建议多读几遍题目!!!!思路设0表示硬币朝上,1表示硬币朝下,则第\(0\)次与第\(n\)操作一定输出\(1\)。因为没有可以操作的对象,前者是由于全部硬币朝上,后者是由于全部硬币朝下,即使没有操作也要遍历一遍。注......
  • CF121A Lucky Sum 题解
    题面。不好意思,又双把通过率拉低了。在CF上交了22次才过。这里给出不同的写法。思路规律其他题解写得都很好,这里不需要再讲述如何推出规律。预处理出前\(5000\)个符合要求的数(其实我也不知道处理多少个刚好够,就随便写了一个数)。接下来借用到一点分块思想,将整个\([l,r]\)......
  • CF1670B Dorms War 题解
    题面。不好意思,把这道题的通过率拉低了,但坑点确实有。思路多出几个数据,我们可以发现,在不报警的前提下,最多可以操作数量是两个特殊字符间的最长距离。解释对于不报警的定义是:每次删除操作进行前,当前的字符串中的所有特殊字符的前一个位置必须不是特殊字符。换句话说,只要当前......
  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......
  • CF1737C Ela and Crickets 题解
    题面。原先大佬的题解写的很好,但这里想讲一下不同做法。思路题目中说的\(L\)型有四种情况,很容易就可以想到特殊情况,那就是\(L\)型恰好贴在棋盘的四个角上,这时我们发现,这样子棋子只能在棋盘的其中两条边上移动。对于四个角我们进行四次特判。看普通情况,在手动模拟完样例后......
  • CF1162B Double Matrix 题解
    传送门说句实话,如果不是先写了Showstopper这道题的话,我应该会在这里卡很久,因为做Showstopper我就卡了很久QwQ。思路太像了,实在是太像了,与Showstopper想比,仅仅就是换成二维数组,求最大值变为找递增矩阵,处理方法一模一样:将数组\(a\)和\(b\)中较小的值存在一个数组里,较......
  • 【华为笔试题汇总】2024-04-10-华为春招笔试题-三语言题解(Python/Java/Cpp)
    ......
  • 关于淘宝镜像过期问题解决方案
    问题:将项目拷贝到另一台电脑启动时报错Error:Theprojectseemstorequireyarnbutit'snotinstalled解决方法:1.删除项目中的yarn.lock文件2.终端执行npminstall-gyarn再次启动项目npmrunserve就可以了......
  • Codeforces Round 938 (Div. 3) A-H 题解
    A-YogurtSaleSolution当\(2a>b\)时,显然用\(a\)来买两个比较好,否则就用\(b\)来买两个比较好Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;inta,b;cin>>a>>b;b=min(b,a*2);int......