12.18 update:补充了 $ F $ 题的题解

A 题:

题目保证一定有解,就可以考虑用 $ 2 $ 和 $ 3 $ 来凑出这个数 $ n $

如果 $ n $ 是偶数,我们用 $ n / 2 $ 个 $ 2 $ 来凑出 $ n $ 即可

如果 $ n $ 是奇数,就用 $ n / 2 - 1 $ 个 $ 2 $ 和 $ 1 $ 个 $ 3 $ 凑出 $ n $ 即可

所以只需输出 $ n / 2 $

B 题:

如果一个字符串重排后一定是回文串,说明这个字符串只有 $ 1 $ 种字符

如果有两种不同字符,就可以把一个放在开头,一个放在结尾,这样形成的一定不是回文串

一个简单一点的写法是 $ sort $ 一下这个字符串,判断回文

C 题:

贪心的想,我们如果要使整个序列非降,那么前面的数字要尽量小,后面的数字要尽量大

首先 $ a[1] = 0,a[n] = b[1] $,然后贪心的扫过去,在满足条件的情况下使得前面的数字尽量小,后面的数字尽量大即可

D 题:

发现每条边的两个端点的数字的奇偶性一定不同

所以我们我们只要做一次 $ bfs $ 染色并判断是否能完成染色即可

假设黑点有 $ a $ 个,白点有 $ b $ 个

如果黑点是奇数,方案数是 $ 2^a $ 种,如果白点是奇数,方案数是 $ 2^b $ 种,总方案数是 $ 2^a + 2^b $ 种

然后发现整个图不一定联通

所以我们对每个联通块做一次 $ bfs $ 染色,然后把答案相乘即可

注意不能用 memset,不然 $ T $ 组数据每次 memset 一次肯定凉

E 题:

用 $ pa[i] $ 表示 $ i $ 这个数在第一个排列中出现的位置,$ pb[i] $ 表示 $ i $ 这个数在第二个排列中出现的位置

假设查询区间为 $ l1,r1,l2,r2 $

如果 $ i $ 这个点对答案造成了贡献,那么 $ l1 \le pa[i] \le r1 $ && $ l2 \le pb[i] \le r2 $

容易发现问题变成了二维数点问题,$ cdq $ 分治离线统计答案即可

F 题:

咕咕咕

补锅完毕

发现 $ len $ 的大小非常大,不能放进状态里,又发现 $ k \le 100 $,所以用 $ f[i][j] $ 表示第 $ i $ 个数是 $ j $ 且满足题目所述条件的方案数

发现不能很好的进行转移,所以再用 $ s[i] $ 表示 $ \sum_{j = 1}^{k} f[i][j] $,然后就是容斥转移一下

注意一下需要容斥的条件

可以根据代码理解一下

#include <bits/stdc++.h>
#define CIOS ios::sync_with_stdio(false);
#define rep(i, a, b) for(register int i = a; i <= b; i++)
#define per(i, a, b) for(register int i = a; i >= b; i--)
#define DEBUG(x) cerr << "DEBUG" << x << " >>> ";
using namespace std; typedef unsigned long long ull;
typedef long long ll; template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') fu = -1; c = getchar(); }
while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
f *= fu;
} template <typename T>
void print(T x) {
if (x < 0) putchar('-'), x = -x;
if (x < 10) putchar(x + 48);
else print(x / 10), putchar(x % 10 + 48);
} template <typename T>
void print(T x, char t) {
print(x); putchar(t);
} const int N = 1e5 + 5, md = 998244353; inline int add(int x, int y) {
x += y;
if(x >= md) x -= md;
return x;
} inline int sub(int x, int y) {
x -= y;
if(x < 0) x += md;
return x;
} int f[N][105], cnt[N][105], s[N], a[N];
int n, k, len; int main() {
read(n); read(k); read(len); if(len == 1) { cout << 0 << endl; return 0; }
for(register int i = 1; i <= n; i++) read(a[i]);
for(register int i = 1; i <= n; i++) {
for(register int j = 1; j <= k; j++) cnt[i][j] = cnt[i - 1][j] + (a[i] == -1 || a[i] == j);
}
s[0] = 1; if(a[1] == -1) { for(register int i = 1; i <= k; i++) f[1][i] = 1; s[1] = k; } else f[1][a[1]] = 1, s[1] = 1;
for(register int i = 2; i <= n; i++) {
for(register int j = 1; j <= k; j++) {
if(~a[i] && a[i] != j) continue;
f[i][j] = s[i - 1];
if(i >= len) {
int l = i - len;
if(cnt[i][j] - cnt[l][j] == len) {
f[i][j] = sub(f[i][j], sub(s[l], f[l][j]));
}
}
s[i] = add(s[i], f[i][j]);
}
}
cout << s[n] << endl;
return 0;
}

G 题:

习惯性的把曼哈顿距离的绝对值拆出来,用二进制表示

$ 31 $ 的二进制表示是 $ 11111 $,表示 $ 5 $ 维的一个点的坐标加入的正负情况都为正(即 $ x[1] - y[1] + x[2] - y[2] + x[3] - y[3] + x[4] - y[4] + x[5] - y[5] $

$ 29 $ 的二进制表示是 $ 11101 $,表示 $ x[1] - y[1] + x[2] - y[2] + x[3] - y[3] - x[4] + y[4] + x[5] - y[5] $ (注意 $ x[4] $ 和 $ y[4] $ 的符号变化

那么我们要求的就是 max{f[0] + f[31], f[1] + f[30], f[2] + f[29]...}

用线段树维护即可

codeforces 1093 题解的更多相关文章

  1. Codeforces 1093 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 GGG题手速慢了没有在比赛的时候码出来233,FFF题居然没想出来? 五道题滚粗. 先谈谈其他几道题. A题 传送门 不小心看错题 直接看奇 ...

  2. codeforces#536题解

    CodeForces#536 A. Lunar New Year and Cross Counting Description: Lunar New Year is approaching, and ...

  3. Codeforces Numbers 题解

    这题只需要会10转P进制就行了. PS:答案需要约分,可以直接用c++自带函数__gcd(x,y). 洛谷网址 Codeforces网址 Code(C++): #include<bits/std ...

  4. Codeforces 691E题解 DP+矩阵快速幂

    题面 传送门:http://codeforces.com/problemset/problem/691/E E. Xor-sequences time limit per test3 seconds ...

  5. Codeforces 833B 题解(DP+线段树)

    题面 传送门:http://codeforces.com/problemset/problem/833/B B. The Bakery time limit per test2.5 seconds m ...

  6. Codeforces 840C 题解(DP+组合数学)

    题面 传送门:http://codeforces.com/problemset/problem/840/C C. On the Bench time limit per test2 seconds m ...

  7. Codeforces 515C 题解(贪心+数论)(思维题)

    题面 传送门:http://codeforces.com/problemset/problem/515/C Drazil is playing a math game with Varda. Let’ ...

  8. Codeforces 475D 题解(二分查找+ST表)

    题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q ...

  9. CodeForces CF875C题解

    题解 非常有意思的\(2-SAT\)的题. 听学长讲完之后感觉确实容易想到\(2-SAT\),顺理成章. 显然,对于两个串,对咱们来说有意义的显然是两个串中第一个不同的数字.那么,我们假设两个串分别是 ...

随机推荐

  1. google-gson库下的gson的基本使用

    public class Users { private String username; private String password; private Integer age; public S ...

  2. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  3. 更改FP SYSTEM密码

    1 Please create a new account and set a new password 2 backup table ABPPMGR.USER_PROFILE , ABPPMGR . ...

  4. 配置ssh免密登录后,仍需要密码才能登陆其中某台机器

    提示:如果是三台机器A.B.C配置了ssh免密登录,从A和B上登录C需要密码,则需要修改C的配置 修改配置文件如下: sudo vi /etc/ssh/sshd_config #禁用root账户登录, ...

  5. Thread.yield()的简单理解

    Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择. 也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说 ...

  6. 切线空间(Tangent Space)

    http://download.autodesk.com/global/docs/maya2012/zh-cn/index.html?url=files/Polygons_nodes_Tangent_ ...

  7. DataTable记录

    DataTable dt2 = dt.Copy();//复制结构和数据 //复制结构,不要数据 DataTable dt2 = new DataTable(); for (int i = 0; i & ...

  8. Java 设计模式系列(一)单例模式

    Java 设计模式系列(一)单例模式 保证一个类只有一个实例,并且提供一个访可该实例的全局访问点. 一.懒汉式单例 /** * 懒汉式单例类:在第一次调用的时候实例化自己 * 1. 构造器私有化,避免 ...

  9. kaggle-泰坦尼克号Titanic-2

    下面我们再来看看各种舱级别情况下各性别的获救情况 fig = plt.figure() fig.set(alpha=0.5) plt.title(u"根据舱等级和性别的获救情况", ...

  10. 测试用数据库表设计和SessionFactory

    本篇为struts-2.5.2和spring-3.2.0以及hibernate-4.2.21的整合开篇. 一.测试的数据库表. 用户.角色和权限关系表.数据库是Mysql5.6.为了考虑到一些特殊数据 ...