2017-2018 ACM-ICPC Latin American Regional Programming Contest
时间:2019-10-03
本文章向大家介绍2017-2018 ACM-ICPC Latin American Regional Programming Contest,主要包括2017-2018 ACM-ICPC Latin American Regional Programming Contest使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
https://codeforces.com/gym/101889
C - Complete Naebbirac's sequence
昨天做的毛子场的C,玛雅信息,直接给抄了?复制粘贴结果还错一发,又说不准前导零,结果又说不准最左侧零,连“0”本身都不准了。
G - Gates of uncertainty
给一棵二叉树,每个节点是一个与非门,其中有些是正常工作,有些是坏的,坏的会恒输出1或者恒输出0,你可以在所有的叶子上填入输出,求有多少种填法使得根节点的输出和正常的时候不一致。
一开始乱dp,用dp[x][0/1]表示被污染的x子树的输出0和1的方案的方法数,然后用fp[x][0/1]表示没有被污染的方案的方法数,gp[x][0/1]表示正常的方案数。但其实题目要求的是不一致的方法数,一开始方向就有问题。
其实设置dp[x][s1][s2]表示x子树输出应为s1,实为s2的方法数,答案就是dp[1][0][1]+dp[1][1][0],考虑转移,实际上应输出以及正常门的实输出就直接按异或门的正常转移就行了,很显然这俩是互相独立的。
问题是那种坏的门,这种就直接让他强制转移就可以了。
直接4重循环,好写好调。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
int n;
int val[MAXN];
int ls[MAXN];
int rs[MAXN];
const int MOD = 1e9 + 7;
ll dp[MAXN][2][2];
bool output(bool input1, bool input2) {
return !(input1 && input2);
}
void dfs(int u) {
if(u == 0)
return;
dfs(ls[u]);
dfs(rs[u]);
if(val[u] == -1) {
for(int ls1 = 0; ls1 <= 1; ++ls1) {
for(int rs1 = 0; rs1 <= 1; ++rs1) {
int id1 = output(ls1, rs1);
for(int ls2 = 0; ls2 <= 1; ++ls2) {
for(int rs2 = 0; rs2 <= 1; ++rs2) {
int id2 = output(ls2, rs2);
dp[u][id1][id2] = (dp[u][id1][id2] + dp[ls[u]][ls1][ls2] * dp[rs[u]][rs1][rs2]) % MOD;
}
}
}
}
} else if(val[u] == 0) {
for(int ls1 = 0; ls1 <= 1; ++ls1) {
for(int rs1 = 0; rs1 <= 1; ++rs1) {
int id1 = output(ls1, rs1);
for(int ls2 = 0; ls2 <= 1; ++ls2) {
for(int rs2 = 0; rs2 <= 1; ++rs2) {
int id2 = 0;
dp[u][id1][id2] = (dp[u][id1][id2] + dp[ls[u]][ls1][ls2] * dp[rs[u]][rs1][rs2]) % MOD;
}
}
}
}
} else if(val[u] == 1) {
for(int ls1 = 0; ls1 <= 1; ++ls1) {
for(int rs1 = 0; rs1 <= 1; ++rs1) {
int id1 = output(ls1, rs1);
for(int ls2 = 0; ls2 <= 1; ++ls2) {
for(int rs2 = 0; rs2 <= 1; ++rs2) {
int id2 = 1;
dp[u][id1][id2] = (dp[u][id1][id2] + dp[ls[u]][ls1][ls2] * dp[rs[u]][rs1][rs2]) % MOD;
}
}
}
}
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; ++i) {
scanf("%d", &ls[i]);
scanf("%d", &rs[i]);
scanf("%d", &val[i]);
}
memset(dp, 0, sizeof(dp));
dp[0][0][0] = 1;
dp[0][1][1] = 1;
dfs(1);
printf("%lld\n", (dp[1][0][1] + dp[1][1][0]) % MOD);
}
}
原文地址:https://www.cnblogs.com/Inko/p/11619911.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- llvm 对 copy 属性的优化(1)
- Zookeeper 分布式技术入门
- llvm 对 copy 属性的优化(2)
- 为什么 Linux 默认页大小是 “4KB”?
- Swift Module Interfaces
- Swift 的 MemoryLayout 是如何工作的(1)
- Redis - NoSQL 和 Jedis 入门
- cargo manifest规则使用介绍
- 小程序bindinput和bindblur赋值延迟问题解决
- 小程序监听屏幕滑动事件
- 使用GithubActions发布Vue网站到GithubPage
- 3.QOpenGLWidget-通过着色器来渲染渐变三角形
- 特斯拉大半夜「见鬼」!空无一人的路上,它却看见「幽灵」秒刹车
- .NET 异步详解
- 他被导师半夜敲门叫醒:你得诺贝尔奖了!还曾为5G频谱拍卖设计方案,担任谷歌IPO咨询顾问