• 至于为什么是 \(\text{Part A}\) 而不是 \(\text{Day 1}\)
  • 那是因为 Day1 T3 还没改
  • (那这六题的 \(\text{solution}\) 就按难度顺序写吧)
  • 感觉今年的画风和 \(\text{NOIP 2016}\) 有点像?

D1T1 code

Solution

  • 直接模拟
  • 如果 \(k<2^{n-1}\) 就输出 \(0\)
  • 否则输出 \(1\) 并把 \(k\) 变成 \(2^n-1-k\)
  • 然后 \(n\) 减掉 \(1\) 继续进行下去直到 \(n=0\) 为止
  • 注意 \(k\) 要开 \(\text{unsigned long long}\)
  • \(O(n)\)

Code

#include <bits/stdc++.h>

typedef unsigned long long ull;

int n;
ull k; void solve(int n, ull k)
{
if (!n) return;
ull mid = 1ull << n - 1;
if (k < mid) putchar('0'), solve(n - 1, k);
else putchar('1'), solve(n - 1, mid - 1 - (k - mid));
} int main()
{
std::cin >> n >> k;
solve(n, k);
return puts(""), 0;
}

D1T2 brackets

Solution

  • 令 \(cnt_u\) 表示根到 \(u\) 的路径组成的括号序列,以 \(u\) 为右端点的合法括号序列个数
  • 那么 \(k_u\) 就等于根到 \(u\) 的路径上所有点的 \(cnt\) 之和
  • 易得如果存在 \(u\) 的一个深度最大的祖先 \(v\) 使得 \(v\) 到 \(u\) 的路径组成的括号序列是合法括号序列
  • 那么 \(cnt_u=cnt_{fa_v}+1\)
  • 对于求这个 \(v\) ,可以维护一个栈
  • 从根到 \(u\) ,如果是左括号则直接加入,如果是右括号且栈不空则弹栈
  • 那么如果 \(u\) 为右括号,那么 \(v\) 为这次弹出的括号对应的点
  • 而对于求出所有的 \(u\) ,可以在对树 \(\text{DFS}\) 的过程中维护这个栈,在 \(\text{DFS}\) 回溯时把栈操作也退回即可
  • \(O(n)\)

Code

#include <bits/stdc++.h>

template <class T>
inline void read(T &res)
{
res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
if (bo) res = ~res + 1;
} typedef long long ll; const int N = 5e5 + 5; int n, fa[N], ecnt, nxt[N], adj[N], go[N], stk[N], top, cnt[N];
char s[N];
ll sum[N], ans; void add_edge(int u, int v)
{
nxt[++ecnt] = adj[u]; adj[u] = ecnt; go[ecnt] = v;
} void dfs(int u)
{
int tf = 0;
if (s[u] == '(') stk[++top] = u;
else if (top) cnt[u] = cnt[fa[tf = stk[top--]]] + 1;
sum[u] = sum[fa[u]] + cnt[u];
ans ^= sum[u] * u;
for (int e = adj[u], v = go[e]; e; e = nxt[e], v = go[e])
dfs(v);
if (s[u] == '(') top--;
else if (tf) stk[++top] = tf;
} int main()
{
int x;
read(n);
scanf("%s", s + 1); n = strlen(s + 1);
for (int i = 2; i <= n; i++) read(x), add_edge(fa[i] = x, i);
dfs(1);
return std::cout << ans << std::endl, 0;
}

D2T1 meal

Solution

  • 如果没有一半的限制,那么答案为
  • \[\prod_{i=1}^n(1+\sum_{j=1}^ma_{i,j})-1
    \]

  • 而出现次数超过一半的主要食材最多 \(1\) 种
  • 故可以枚举超过一半的主要食材是哪种,并把对应的方案数从上式种扣掉即可
  • 假设确定了一种食材 \(x\) ,考虑如何求这种食材出现超过一半的方案数
  • 设 \(u_i=a_{i,x}\) , \(v_i=\sum_{j=1,j\ne x}^ma_{i,j}\)
  • 问题就转化成了有 \(n\) 个变量,对于第 \(i\) 个变量有 \(u_i\) 种方法使其为 \(1\) , \(v_i\) 种方法使其为 \(-1\) ,\(1\) 种方法使其为 \(0\),求有多少种方案使得 \(1\) 的个数严格大于 \(-1\) (所有变量的和严格大于 \(0\) )
  • 于是可以 \(\text{DP}\) :设 \(f[i][j]\) 表示前 \(i\) 个变量和为 \(j\) 的方案数(\(j\) 可以为负),转移时枚举下一个变量的取值
  • \(O(mn^2)\)

Code

#include <bits/stdc++.h>

template <class T>
inline void read(T &res)
{
res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
if (bo) res = ~res + 1;
} const int N = 105, E = 205, M = 2005, rqy = 998244353; int n, m, a[N][M], f[N][E], sum[N], tmp[N], ans = 1; inline void add(int &a, const int &b)
{
a += b; if (a >= rqy) a -= rqy;
} inline void sub(int &a, const int &b)
{
a -= b; if (a < 0) a += rqy;
} int main()
{
read(n); read(m);
for (int i = 1; i <= n; i++) sum[i] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
read(a[i][j]), add(sum[i], a[i][j]);
for (int i = 1; i <= n; i++) ans = 1ll * ans * sum[i] % rqy;
sub(ans, 1);
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++) tmp[j] = sum[j], sub(tmp[j], a[j][i]), sub(tmp[j], 1);
for (int j = -n; j <= n; j++)
for (int k = 0; k <= n; k++)
f[k][j + n] = 0;
f[0][n] = 1;
for (int j = 1; j <= n; j++)
for (int k = -n; k <= n; k++)
{
add(f[j][k + n], f[j - 1][k + n]);
if (k > -n) add(f[j][k + n], 1ll * f[j - 1][k - 1 + n] * a[j][i] % rqy);
if (k < n) add(f[j][k + n], 1ll * f[j - 1][k + 1 + n] * tmp[j] % rqy);
}
for (int j = 1; j <= n; j++) sub(ans, f[n][j + n]);
}
return std::cout << ans << std::endl, 0;
}

[题解]CSP2019 Solution - Part A的更多相关文章

  1. [题解]CSP2019 Solution - Part B

    \(\text{orz}\) 一波现场 \(\text{A}\) 掉 \(\text{D1T3}\) 的神仙 D2T3 centroid Solution 考虑每个点 \(u\) 作为重心的贡献 假设 ...

  2. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

  3. 【ZROI 537】贪心题 题解

    [ZROI 537]贪心题 题解 Link Solution 最大的一边直接放到一起贪心即可 着重讲小的一边 已知对于二分图匹配,其答案即为最大流 令时间集合为 \(T = {1,2,3,\dots, ...

  4. 【题解】「CF363A」Soroban

    哎呀呀,咕值要掉光了,赶快水篇题解( solution 这题就是个纯模拟,首先我们根据输出样例看一下输出算盘的规则. 看数最大的 720 ,我们发现,输出的算盘张这样(之所以我不用代码框而用 \(\K ...

  5. 题解 洛谷 P5279 【[ZJOI2019]麻将】

    这题非常的神啊...蒟蒻来写一篇题解. Solution 首先考虑如何判定一副牌是否是 "胡" 的. 不要想着统计个几个值 \(O(1)\) 算,可以考虑复杂度大一点的. 首先先把 ...

  6. 洛谷 P7541 DOBRA 题解

    hhh... 我又来写题解了 solution 题意简化 一个字符串,将所有的 _ 替换成大写字母,使结果字符串符合要求: 1.不包含三个连续 元音 或 辅音 字母: 2.字符串中至少有一个 L . ...

  7. 2018 Multi-University Training Contest 3 - HDU Contest

    题解: solution Code: A. Ascending Rating #include<cstdio> const int N=10000010; int T,n,m,k,P,Q, ...

  8. leecode第四题(寻找两个有序数组的中位数)

    题解: class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<i ...

  9. codeforces round#509

    博主水平不高, 只能打完$4$题, QAQ什么时候才能变强啊嘤嘤嘤 订正完6题了,  还想打今天下午的CF , 只能迟十分钟了, 掉分预定 A. Heist 输出 $max - min + n - 1 ...

随机推荐

  1. es6笔记 day2---函数默认参数、箭头函数、剩余参数

    函数变化: 1.函数默认参数 2.函数参数默认是已经定义了,不能再使用let.const声明 3.扩展运算符.rest运算符 ...就是扩展运算符,它的作用就是把数组给展开 结合函数使用传参,也可以将 ...

  2. <QluOJ2018NewCode>计算几何(寄蒜几盒)

    题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...

  3. ArcGIS-PictureMarkerSymbol-向地图添加图片标记

    1.基于4.13 版本 <link rel="stylesheet" href="https://js.arcgis.com/4.13/esri/themes/li ...

  4. 使用Pandas加载数据

    1.dataframe对象简述: dataframe为pandas中一种有行列索引的二维数据结构,可以看成在普通二维结构上加上行列id标记 示例为创建一个2X3的dataframe: import s ...

  5. [NLP自然语言处理]谷歌BERT模型深度解析

    我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅~ 任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主 ...

  6. BeetleX之XRPC使用详解

    XRPC是基于BeetleX扩展一个远程接口调用组件,它提供基于接口的方式来实现远程服务调用,在应用上非常简便.组件提供.NETCore2.1和.NETStandard2.0的client版本,因此即 ...

  7. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

  8. Python中三大框架各自的应用场景(DJango,flask,Tornado)

    django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实 ...

  9. final阶段20191121-5 Scrum立会报告+燃尽图 01

    此作业要求参见:http://edu.cnblogs.com/campus/nenu/2019fall/homework/10065 一: 组名:组长组 组长:杨天宇 组员:魏新  罗杨美慧   王歆 ...

  10. 【题解】P1373 小a和uim之大逃离

    [题解]P1373 小a和uim之大逃离 考虑到可能会MLE,考虑状态压缩一下 由于只要得到他们的差就行了,所以直接少记录一维就好了 \(dp(i,j,r,1/0)\)表示在\(i,j\)点,当前ui ...