NOIP模拟 28
果然昨天和别人合照丢的脸今天都加进RP里了
T3是用了dp快速幂(???),T1,T2考试的时候把想法都写注释了。
T1:
#include<cstdio>
using namespace std;
const int maxn=1e6+;
int n;
int f[maxn];
int head[maxn];
int nx[maxn<<];
int to[maxn<<];
int tp[maxn<<],cnt;
inline void add(int a,int b,int c){
nx[++cnt]=head[a];
head[a]=cnt;
to[cnt]=b;
tp[cnt]=c;
}
void init(){
scanf("%d",&n);
for(int i=;i<=n;++i){
int x,y,z; scanf("%d%d%d",&f[i],&x,&y);
z=y?(x?:):;//must not,must,no lim
add(i,f[i],z); add(f[i],i,z);
}
}
int dp[maxn];
bool g[maxn];
void dfs(int x){
bool leaf=;
for(int i=head[x];i;i=nx[i]){
int t=to[i];
if(t!=f[x]) dfs(t),leaf=;
}
if(leaf) return;
int cntt=;
for(int i=head[x];i;i=nx[i]){
int son=to[i];
if(son==f[x]) continue;
dp[x]+=dp[son];
if(tp[i]==||(!tp[i]&&g[son])){
dp[x]-=g[son];
++cntt;
}
}
dp[x]+=(cntt+)>>;
g[x]=cntt&;
}
int main(){
init(); dfs();
printf("%d\n",dp[]);
return ;
}
/*
边只有三种,必须翻,可以翻,不能翻
是否存在需要翻转不能翻转的边的情况
不会,因为还要把它翻回去,不如两边分开翻
所以遇到不能翻,直接截断翻转链。
dp[n]表示仅考虑一棵子树内的最少翻转次数。
g[n]表示子树是否需要一条从根引出的翻转链。
先把儿子的dp都加上
必须翻的边 减去儿子的g,记录下来作贡献
不能翻的边 不管
可以翻的边 如果儿子有g,当成必须翻的边处理,否则不管
运用了一个贪心的想法,如果可以尽量把问题拖到父亲解决,代价不会更高
*/
(我看你是为难我pang)虎
T2:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e3+;
const int mod=1e9+;
int n,m,ans;
bool have_w,have_b;
char ch[maxn];
short map[maxn][maxn];
void init(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){
scanf("%s",ch+);
for(int j=;j<=m;++j){
if(ch[j]=='W') map[i][j]=,have_w=;
if(ch[j]=='B') map[i][j]=,have_b=;
}
}
}
short tmp[maxn][maxn];
void rotate(){
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
tmp[i][j]=map[i][j];
swap(n,m);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
map[i][j]=tmp[j][n-i+];
}
int dp[][maxn],high[maxn],low[maxn];
void DP(){
for(int i=;i<=m;++i){
high[i]=n;low[i]=;
for(int j=;j<=n;++j){
if(map[j][i]==) low[i]=max(low[i],n-j+);
if(map[j][i]==) high[i]=min(high[i],n-j);
}
}
for(int j=n;j;--j) dp[][j]=; dp[][]=;
for(int i=;i<=m;++i){
bool u=i&;
memset(dp[u],,sizeof(dp[u]));
for(int j=low[i];j<=high[i];++j) dp[u][j]=dp[u^][j];
for(int j=n;~j;--j) (dp[u][j]+=dp[u][j+])%=mod;
}
(ans+=dp[m&][]-dp[m&][n])%=mod;
}
//保证了dp求出的有高度相等,但是没有全选/全不选
//减去高度相等时多算出的贡献,每种都多算了一次
//高于或等于最高的1,低于最低的2时,可以高度相等。
int pos[][];
void uniq(){
pos[][]=pos[][]=n+;
pos[][]=pos[][]=m+;
pos[][]=pos[][]=pos[][]=pos[][]=;
for(int i=;i<=n;++i){
for(int j=;j<=m;++j){
for(int k=;k<=;++k) if(map[i][j]==k){
pos[k][]=min(pos[k][],i);
pos[k][]=max(pos[k][],i);
pos[k][]=min(pos[k][],j);
pos[k][]=max(pos[k][],j);
}
}
}
//have_w&&have_b 包括了0和m
ans-=max(pos[][]-pos[][],);
ans-=max(pos[][]-pos[][],);
ans-=max(pos[][]-pos[][],);
ans-=max(pos[][]-pos[][],);
//减了404m,应为101m
if(!have_w&&!have_b) ans+=;
//减了202m,应为10或1m
if(have_w&&!have_b) ans+=;
if(!have_w&&have_b) ans+=;
ans%=mod;
(ans+=mod)%=mod;
}
int main(){
init(); uniq(); DP();
rotate(); DP();
rotate(); DP();
rotate(); DP();
printf("%d\n",ans);
return ;
}
/*
对于每一行和每一列,要么清一色,要么各占半壁江山,没有夹在中间的情况
所以在整张图上阴阳的分布是各占据一个直角
把阳的直角放在左下角
把区域看成数轴上柱子的高度,则柱子高度单调不增
强制为阳就是最低高度,强制为阴就是最高高度
然后把图旋转90度,dp4次
貌似高度全都相等的情况要特殊考虑
*/
阴阳
T3:
#include<cstdio>
using namespace std;
int main(){
puts("");
return ;
}
山洞(40分)
NOIP模拟 28的更多相关文章
- NOIP 模拟 $28\; \rm 遗忘之祭仪$
题解 \(by\;zj\varphi\) 直接贪心模拟即可,对于每个点,如果它未被覆盖,直接在这覆盖一次. 每个黑点只会被扫一次,所以总复杂度为 \(\mathcal O\rm (nm)\) Code ...
- NOIP 模拟 $28\; \rm 割海成路之日$
题解 \(by\;zj\varphi\) 用两个集合分别表示 \(1\) 边联通块,\(1,2\) 边联通块 . \(\rm son_x\) 表示当前节点通过 \(3\) 类边能到的 \(2\) 联通 ...
- NOIP 模拟 $28\; \rm 客星璀璨之夜$
题解 \(by\;zj\varphi\) 概率与期望,考虑 \(\rm dp\) 设 \(dp_{i,j}\) 为消除 \(i-j\) 这一段行星的期望,转移: 枚举 \(k\) 为当前状态下第一个撞 ...
- NOIP模拟 6.28
NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这 ...
- 2017-9-22 NOIP模拟赛[xxy][数论]
XXY 的 的 NOIP 模拟赛 4 4 —— 数学专场 A Description定义 f(x)表示 x 的约数和,例:f(12)=1+2+3+4+6+12=28给出 x,y,求Σf(i),i∈[x ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- NOIP模拟17.9.21
NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
随机推荐
- 4、pytest 中文文档--pytest-fixtures:明确的、模块化的和可扩展的
目录 1. fixture:作为形参使用 2. fixture:一个典型的依赖注入的实践 3. conftest.py:共享fixture实例 4. 共享测试数据 5. 作用域:在跨类的.模块的或整个 ...
- 确认自己所用的python版本
总结: 目前有两个版本的python处于活跃状态:python2,python3 有多种流行的python运行环境:cpython(应用最广泛的python解释器,如无对解释器有要求,一般用这个,默认 ...
- 588 div2 C. Anadi and Domino
C. Anadi and Domino 题目链接:https://codeforces.com/contest/1230/problem/C Anadi has a set of dominoes. ...
- 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题
1> 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题(处理心得)
- Java中NIO及基础实现
NIO:同步非阻塞IO 来源:BIO是同步阻塞IO操作,当线程在处理任务时,另一方会阻塞着等待该线程的执行完毕,为了提高效率,,JDK1.4后,引入NIO来提升数据的通讯性能 NIO中采用Reacto ...
- C语言入门-结构类型
一.声明结构类型 #include <stdio.h> int main(int argc, char const *argv[]) { // 声明结构类型 struct date { i ...
- JDK8 Optional操作学习
介绍 Optional是JDK8中提供用于包含未知对象的工具类,即可以利用Optional包装对象来避免繁琐的空指针检查,以及NullPointException的处理,在Optional中,用val ...
- git基础命令详解
一些必须要知道的概念 git的三个工作区域:工作目录.暂存区.git仓库. 工作目录:其实就是本地文件磁盘上的文件或目录: 暂存区:是一个文件,保存了下次提交的文件列表信息,一般在git仓库目录中: ...
- VPS虚拟专用服务器
目录 0x00 VPS服务器概述 0x01 VPS工作原理 0x02 VPS用途 0x03 VPS优势 0x04 VPS特点 0x00 VPS服务器概述 VPS服务器(虚拟专用服务器)(" ...
- webshell检测方法归纳
背景 webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB ...