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 ...
随机推荐
- 品Spring:关于@Scheduled定时任务的思考与探索,结果尴尬了
非Spring风格的代码与Spring的结合 现在的开发都是基于Spring的,所有的依赖都有Spring管理,这没有问题. 但是要突然写一些非Spring风格的代码时,可能会很不习惯,如果还要和Sp ...
- GoLang 获取两个时间相差多少小时
package main import ( "fmt" "time" ) func main() { fmt.Println(getHourDiffer(&qu ...
- 启动一个Activity的几种方式
在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动,而非 启动模式!!分为显示启动和隐式启动! 1. 显式启动:通过包名来启动,写法如下: ①最常见的: st ...
- PCIE DMA实现
基于Spartan-6, Virtex-5/Virtex-6/Virtex-7/7 Series FPGA PCI Express Block Endpoint模块设计PCI Express Endp ...
- .NET Core使用gRPC打造服务间通信基础设施
一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...
- SystemVerilog Assertion 设计、调试、测试总结(2)
上一篇博客主要写了SVA的基本语法(详细),这一篇主要写SVA语法总结,以及如何查看SVA波形等. 断言assertion被放在verilog设计中,方便在仿真时查看异常情况.当异常出现时,断言会报警 ...
- samba文件共享服务部署
1.安装samaba服务程序 yum install -y samba 2.查看smaba文件,由于注释空行较多,选择过滤 egrep -v "#|;|^$" /etc/samba ...
- thinkphp5框架之请求
又看到请求这一部分,个人认为这部分是算重要的一部分 单独记一篇笔记. 0x01 request请求对象 如果要获取当前的请求信息,可以使用\think\Request类,完全开发手册中也有提到,继承系 ...
- Circle Problem From 3Blue1Brown (分圆问题)
Background\text{Background}Background Last night, lots of students from primary school came to our c ...
- java初始化与清理
初始化与清理 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 1.用构造器确保初始化 java中通过提供构造器,可以 ...