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 ...
随机推荐
- Android 捕捉app系统中未处理的异常
一:为什么要处理? 其实我们都知道,在开发过程中,自己的app系统或许有许多隐藏的异常,自己没有捕捉到,那么关于异常的捕捉,这是相当重要的,如果系统发生崩溃,那么至少也可以让系统挂在系统之内,不会发现 ...
- 如何选择一款适合自己操作系统、Windows、Mac还是Linux?
如何选择一款适合自己操作系统.Windows.Mac还是Linux? 作者:我们都很努力着 简介:电脑已经逐渐离不开我们生活,但是如何选择一个我们最佳,最适合的电脑操作系统就成了一些困难选择人士的一个 ...
- [经验分享]C# 操作Windows系统计划任务
背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每 ...
- C# 创建自定义配置节点1
转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...
- MQTT介绍与使用
物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段.其英文名称是:“Internet of things(IoT)”.顾名思义,物联网就是物物相连的互联网.这有两层意思:其一,物联 ...
- 【原创】(八)Linux内存管理 - zoned page frame allocator - 3
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Yroot of High-Precisions (luogu P2293 [HNOI2004]高精度开根)
Background\text{Background}Background I've accepted\text{I've accepted}I've accepteda very good prob ...
- PowerShell渗透--Empire(二)
权限提升 Bypass UAC usemodule powershell/privesc/bypassuac 设置listener execute list查看 usemodule powershel ...
- C# Halcon混合编程中遇到的问题(一)
目标平台 安装64位的halcon的情况下,目标平台必须使用x64而不能使用x86 目标框架 不能使用.Net Framework Client版本,有一些必须的程序集会缺失,测试使用.Net Fra ...
- oracle中创建用户、角色、权限简单使用
Oracle关于用户.权限.角色简单使用 创建数据库用户(在system用户下)create user 用户名 identified by 密码; 授权grant 权限名 to 用户名; 查看当前用户 ...