C:即要使前一部分为白色后一部分为黑色,枚举分割点前缀和计算答案取min即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N],s[N][2],ans=N;
char S[N];
signed main()
{
n=read();
scanf("%s",S+1);
for (int i=1;i<=n;i++) if (S[i]=='#') a[i]=1;else a[i]=0;
for (int i=1;i<=n;i++)
{
s[i][0]=s[i-1][0],s[i][1]=s[i-1][1];
if (a[i]==1) s[i][1]++;else s[i][0]++;
}
for (int i=0;i<=n;i++) ans=min(ans,s[i][1]+s[n][0]-s[i][0]);
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  D:即要求最大的一组和小于总和一半的方案数。容易想到设f[i][j]为前i个数最大一组(不是当前最大的一组,而是我们期望所有数分配完之后其成为最大的一组)和为j时的方案数。为保证第二维中的是最大的一组,做一个补集转化。dp时如果不将该数放进最大的一组就将方案数*2,因为剩下两组可以任选。最后有一个小问题就是如果总和是偶数,分成两组且每组恰好分得一半的方案数会被重复扣减,重新背包一下加回来即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 310
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,s,a[N],f[N*N],g[N*N];
signed main()
{
n=read();
for (int i=1;i<=n;i++) m+=a[i]=read();
s=(m-1)/2;
f[0]=1;
for (int i=1;i<=n;i++)
{
for (int j=m;j>=a[i];j--)
f[j]=(2ll*f[j]+f[j-a[i]])%P;
for (int j=a[i]-1;j>=0;j--) f[j]=2ll*f[j]%P;
}
int ans=1;for (int i=1;i<=n;i++) ans=3ll*ans%P;
for (int i=s+1;i<=m;i++) ans=(ans-3ll*f[i]%P+P)%P;
if (m%2==0)
{
g[0]=1;
for (int i=1;i<=n;i++)
{
for (int j=m;j>=a[i];j--)
g[j]=(g[j]+g[j-a[i]])%P;
}
ans=(ans+3ll*g[m/2]%P+P)%P;
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
//2max(a,b,c)<a+b+c

  E、F:准备打猝死场,咕着先睡了。(woc闹钟没听见睡过了自闭了

  E:完全无法理解为啥枚举a0的每个质因子p暴力将x=0~p-1代入都会wa。

  F:小清新水题。首先枚举一下0的个数转化成只有1和2的情况。考虑找到第一个前缀和>x的位置i,这样区间[1,i]的和是x+1。容易发现此时1和i位置都必须是2,否则将区间缩小一点和就变为x。然后考虑第i+1位,可以发现也只能是2,否则区间[2,i+1]不合法。以此类推,[i,n]和[1,n-i+1]都必须是2。枚举i算算组合数即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 3010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,C[N<<1][N<<1],ans;
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
signed main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
n=read(),m=read();
C[0][0]=1;
for (int i=1;i<=max(n,m);i++)
{
C[i][0]=1;
for (int j=1;j<=i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
}
for (int i=0;i<=n;i++)
{
int s=0;
for (int j=0;j<=m-1-i;j++) inc(s,C[i][j]);
for (int j=1;j<=i;j++) //j是第一个前缀和>m的位置 j~i均为2 1~i-j+1均为2
if (j*2>m&&(i-j+1<j?(i-j+1)*2+(j-(i-j+1)+1):j*2)<=m+1)
if (i-j+1<j) inc(s,C[j-(i-j+1)-1][m+1-((i-j+1)*2+(j-(i-j+1)+1))]);
else if (j*2==m+1) inc(s,1);
inc(ans,1ll*s*C[n][n-i]%P);
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
//先把0去掉 则要考虑求长度为0~n的满足条件的序列数量
//找到第一个前缀和>x的位置 然后若当前不是后缀 下一位必须是2 首位也必须是2
//即第一个前缀和>x的位置及之后全都是2

  result:rank 119 rating +42

Tenka1 Programmer Contest 2019的更多相关文章

  1. 【AtCoder】Tenka1 Programmer Contest 2019

    Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...

  2. Atcoder Tenka1 Programmer Contest 2019

    C 签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然. #include<bits/stdc++.h> using namespace std; ; ]; char ...

  3. Atcoder Tenka1 Programmer Contest 2019 题解

    link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...

  4. Atcoder Tenka1 Programmer Contest 2019 E - Polynomial Divisors

    题意: 给出一个多项式,问有多少个质数\(p\)使得\(p\;|\;f(x)\),不管\(x\)取何值 思路: 首先所有系数的\(gcd\)的质因子都是可以的. 再考虑一个结论,如果在\(\bmod ...

  5. Atcoder Tenka1 Programmer Contest 2019 D Three Colors

    题意: 有\(n\)个石头,每个石头有权值,可以给它们染'R', 'G', 'B'三种颜色,如下定义一种染色方案为合法方案: 所有石头都染上了一种颜色 令\(R, G, B\)为染了'R', 染了'G ...

  6. Atcoder Tenka1 Programmer Contest 2019题解

    传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...

  7. Tenka1 Programmer Contest 2019 D - Three Colors

    Three Colors 思路:dp 设sum为所有边的总和 不能组成三角形的情况:某条边长度>=ceil(sum/2),可以用dp求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意 ...

  8. Tenka1 Programmer Contest D - Crossing

    链接 Tenka1 Programmer Contest D - Crossing 给定\(n\),要求构造\(k\)个集合\({S_k}\),使得\(1\)到\(n\)中每个元素均在集合中出现两次, ...

  9. Tenka1 Programmer Contest C - Align

    链接 Tenka1 Programmer Contest C - Align 给定一个序列,要求重新排列最大化\(\sum_{i=2}^{i=n} |a_i-a_{i-1}|\),\(n\leq 10 ...

随机推荐

  1. Nginx实现负载均衡功能

    一.什么是Nginx? Nginx是一款轻量级的Web 服务器.反向代理服务器.电子邮件(IMAP/POP3)代理服务器. 二.Nginx的优点: 高并发连接:官方测试Nginx能够支撑5万并发连接, ...

  2. 在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用

    问题描述 在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用: # 启动默认文本编辑器打开 helloworld.txt Process.Star ...

  3. 第八课 表格 html5学习3

    表格用来处理表格式数据的,不是用来布局的. 一.基本语法格式 <table> <tr> 行标签 <td></td> 单元格标签 </tr> ...

  4. 转int啥啥啥的

    1.String转int类型的话.需要用Double.valueof("这写String类型的数据").intValue(); 2.保留小数点: float scale = (fl ...

  5. 客户端传值里面包含URL特殊字符的应对方法

    URL传递值的时候参数里面含有%2f等URL转义问题可通过URLDecoder.decode(字符串,“utf-8”);的方法去转义为"/". 此外:URLEncoder是将字符串 ...

  6. selenium-webdriver的二次封装(十)

    接着上篇随笔 selenium-配置文件定位元素 ,进行了配置文件设置后,将配置文件运用到定位元素中 思路:拿到定位的 key 和 value 后,对 webdrvier 中定位进行封装,使可以直接运 ...

  7. 【原】无脑操作:HTML5 + CSS + JavaScript实现比赛排程

    1.背景:朋友请帮忙做一个比赛排程软件 2.需求: ① 比赛人数未知,可以通过文本文件读取参赛人员名称: ② 对参赛人员随机分组,一组两人,两两PK,如果是奇数人数,某一个参赛人员成为幸运儿自动晋级: ...

  8. CG-CTF simple-machine

    运行一下,输入flag: 用ida打开: input_length和input_byte_804B0C0为重命名的变量:现在一个个看调用的函数. sub_8048526(): 这个函数使用了mmap分 ...

  9. 我的Windows日常——炫酷的windows组件命令行打开方式

    regedit -------注册表编辑器 gpedit.msc-------组策略编辑器 secpol.msc--------本地安全策略 control ----------控制面板 cmd--- ...

  10. PHP 函数漏洞总结

    1.MD5 compare漏洞 PHP在处理哈希字符串时,会利用"!="或"=="来对哈希值进行比较,它把每一个以"0E"开头的哈希值都解释 ...