Educational Codeforces Round 11 C hard process_补题——作为司老大的脑残粉

  司老大当时教了一种姿势枚举连续K个0,说实话当时比赛写这题完全蒙了 纵然后来知道思路还是写了一段时间 真的是。。

题目大意  n长度的序列,由0 1构成 我们可以改变 k个0为1 求可以得到的最长连续1序列的长度

既然求连续1 我们贪心连续k个0 枚举端点 左端点0设置为0 右端点0设置为 n+1 中间统计一下 最长长度和改变的0的位置就OK了

 1 #include<cstdio>
 2 #include<map>
 3 //#include<bits/stdc++.h>
 4 #include<vector>
 5 #include<stack>
 6 #include<iostream>
 7 #include<algorithm>
 8 #include<cstring>
 9 #include<cmath>
10 #include<queue>
11 #include<cstdlib>
12 #include<climits>
13 #define INF 0x3f3f3f3f
14 using namespace std;
15 typedef long long ll;
16 typedef __int64 int64;
17 const ll mood=1e9+7;
18 const int64 Mod=998244353;
19 const double eps=1e-9;
20 const int MAXN=100010;
21 const double PI=acos(-1.0);
22 inline void rl(ll&num){
23     num=0;ll f=1;char ch=getchar();
24     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
25     while(ch>=‘0‘&&ch<=‘9‘)num=num*10+ch-‘0‘,ch=getchar();
26     num*=f;
27 }
28 inline void ri(int &num){
29     num=0;int f=1;char ch=getchar();
30     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
31     while(ch>=‘0‘&&ch<=‘9‘)num=num*10+ch-‘0‘,ch=getchar();
32     num*=f;
33 }
34 int getnum()//相邻的个位整数输入 如想分别保存1234 输入连续的1234 a[i]=getnum();就可以实现
35 {
36     char ch=getchar();
37     while((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘)
38         ch=getchar();
39     return (ch-‘0‘);
40 }
41 inline void out(int x){ if(x<0) {putchar(‘-‘);  x*=-1;}if(x>9) out(x/10);  putchar(x%10+‘0‘); }
42 int a[300020],b[300020];
43 int main()
44 {
45     int n,k;
46     ri(n),ri(k);
47     int len=0,tem;
48     for(int i=1;i<=n;i++)
49     {
50         ri(b[i]);
51         if(!b[i]) a[++len]=i;
52     }
53     if(k>=len){
54         out(n);putchar(‘\n‘);
55         for(int i=1;i<=n;i++)
56         {
57             putchar(‘1‘);
58             if(i!=n)putchar(‘ ‘);
59         }
60         putchar(‘\n‘);
61     }
62     else{
63         a[0]=0;a[len+1]=n+1;
64         int mx=-1,l,r;
65         for(int i=1;i-1+k<=len;i++)
66         {
67             if(mx<a[i+k]-a[i-1]-1)
68             {
69                 mx=a[i+k]-a[i-1]-1;
70                 l=a[i-1]+1;
71                 r=a[i+k]-1;
72             }
73         }
74         out(mx);putchar(‘\n‘);
75         for(int i=1;i<=n;i++)
76         {
77             if(i>=l&&i<=r)putchar(‘1‘);
78             else out(b[i]);
79             if(i!=n)putchar(‘ ‘);
80         }
81     }
82     return 0;
83 }

要有思想

至于廷伟菊苣说的dp和线段树姿势还不会。。。

时间: 2024-10-05 17:50:08

Educational Codeforces Round 11 C hard process_补题——作为司老大的脑残粉的相关文章

Educational Codeforces Round 24 CF 818 A-G 补题

6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子,一直坚持刷题,这一个学期刷了200道吧,感觉还是小有收获.特别是Ural和Codeforces上的题,质量很高. 然后4月的校赛,5月的省赛,发挥的也一般,不过也没有太失常. 希望暑假的选拔赛能碰到有趣的队友 蛤蛤. 这两天各种考试,实在是太忙,看了一下edu24的题目,不是很容易,做了一道水题,以

Educational Codeforces Round 11、A B题

A. Co-prime Array 题意:给你一个数列,要求构造两两相邻之间的数互质的数列,可以插入的数的小于10的9次方 思路:其实可以选择靠近10的9次方的最大的三个素数.然后按我下面的方法做就可以了,我这里选的三个素数不是最大的,数据有点水,就水过了 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 const int qq=1005; 5 int num[qq]; 6 int ar[qq<

Codeforces Round #490 (Div. 3)-赛后补题

D. Equalize the Remainders 思维太僵硬了,我从余数入手,嫩是记录不了每个数要操作多少次.但是如果考虑每个数的贡献,即操作多少次能使得满足条件,就好写了,实际上也是暴力. #include<bits/stdc++.h> #define ll long long #define P pair<int,int> #define pb push_back #define lson root << 1 #define INF (int)2e9 + 7 #

Codeforces Round #491 (Div. 2) — 赛后补题

C. Candies PS:大概是又傻了,读题啊. #include<bits/stdc++.h> #define ll long long #define P pair<int,int> #define pb push_back #define lson root << 1 #define INF (int)2e9 + 7 #define maxn (int)1e5 + 7 #define rson root << 1 | 1 #define LINF (

Educational Codeforces Round 74 (Rated for Div. 2)补题

慢慢来. 题目册 题目 A B C D E F G 状态 √ √ √ √ × ? ? //√,×,? 想法 A. Prime Subtraction res tp A 题意:给定\(x,y(x>y)\),问能否将\(x-y\)拆成任意多个质数之和 1.任意大于\(1\)的整数\(k\)都可以用\(2\)与\(3\)的线性表示 证: 若\(k\)是偶数,显然: 若\(k\)是奇数,则\(k\)可以表示成\(k = 3 + 2*k'\),显然: 毕. #include<bits/stdc++.h&

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Educational Codeforces Round 26 D. Round Subset(dp)

题目链接:Educational Codeforces Round 26 D. Round Subset 题意: 给你n个数,让你选其中的k个数,使得这k个数的乘积的末尾的0的个数最大. 题解: 显然,末尾乘积0的个数和因子2和因子5的个数有关. 然后考虑dp[i][j]表示选i个数,当前因子5的个数为j时,能得到因子2最多的为多少. 那么对于每个数,记录一下因子2和5的个数,做一些01背包就行了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) me

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.