NOIP模拟测试28「阴阳·虎·山洞」

写这几个题解我觉得我就像在按照官方题解抄一样

阴阳

题解

将题目中给的阴阳看作黑色和白色

首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减

类似这样

否则不满足这个条件

但合法染色方案必须满足任意两个同颜色格子之间的格子也必须是该颜色。

然后我们分四种情况统计,

1.黑色居于左侧而且分界点单调不降,

2.黑色居于左侧而且分界点单调不升,

3.白色居于左侧而且分界点单调不降,

4.白色居于左侧而且分界点单调不升。

我们发现这样会算重,

dp然后手动容斥,

1,2会算重左面每列全是黑色

类似于

类似的3,4会算重左面全是白色

那么上面全是黑色我们也会算重(2,3)

上面全是白色我们仍然会算重

手动容斥

题解应该都能看懂,实现稍难(不用说了我码力太弱)

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1111
const ll mod=1e9+7;
ll can[A][A][10],f[A][A][2],up[A][A],down[A][A];
//can定义为i行从1--j染成B剩下染成W是否合法
char ch[A][A];
ll n,m,flag1,flag2,ans;
int main(){scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%s",ch[i]+1);for(ll i=1;i<=n;i++){ll maxpos=0;for(ll j=1;j<=m;j++){if(ch[i][j]=='W') break;if(ch[i][j]=='B') maxpos=j;}for(ll j=maxpos+1;j<=m;j++)if(ch[i][j]=='B'){maxpos=m+1;    break;}ll now=maxpos;while(ch[i][now]!='W'&&now<=m)can[i][now][1]=1,now++;}for(ll i=1;i<=n;i++){ll maxpos=m+1;for(ll j=m;j>=1;j--){if(ch[i][j]=='W') break;if(ch[i][j]=='B') maxpos=j;}for(ll j=maxpos-1;j>=1;j--)if(ch[i][j]=='B'){maxpos=-1; break;}ll now=maxpos;while(ch[i][now]!='W'&&now>=0)can[i][m-now+1][2]=1,now--;}for(ll i=0;i<=m;i++)up[0][i]=1,down[0][i]=1;for(ll i=1;i<=n;i++){for(ll j=0;j<=m;j++){if(!can[i][j][1]) continue;f[i][j][0]=up[i-1][j];f[i][j][1]=down[i-1][j];
//            printf("up[%lld][%lld]=%lld down=%lld\n",i-1,j,up[i-1][j],down[i-1][j]);
        }for(ll j=0;j<=m;j++)up[i][j]=(up[i][j-1]+f[i][j][0])%mod/*,printf("f=%lld up=%lld\n",f[i][j][0],up[i][j])*/;for(ll j=m;j>=0;j--)down[i][j]=(down[i][j+1]+f[i][j][1])%mod;
//        printf("up=%lld down=%lld\n",up[n][m],down[n][0]);
    }
/*    for(ll i=1;i<=n;i++,puts("")){for(ll j=1;j<=m;j++){printf("%lld ",can[i][j][1]);}}
*/    memset(f,0,sizeof(f));ans=(ans+up[n][m]+down[n][0]+mod)%mod;
//    printf("ans=%lld\n",ans);for(ll i=1;i<=n;i++){for(ll j=0;j<=m;j++){if(!can[i][j][2]) continue;f[i][j][0]=up[i-1][j];f[i][j][1]=down[i-1][j];}for(ll j=0;j<=m;j++)up[i][j]=(up[i][j-1]+f[i][j][0])%mod;for(ll j=m;j>=0;j--)down[i][j]=(down[i][j+1]+f[i][j][1])%mod;}
//    printf("up=%lld down=%lld\n",up[n][m],down[n][0]);ans=(ans+up[n][m]+down[n][0]+mod)%mod;
//    printf("ans=%lld\n",ans);memset(f,0,sizeof(f));//减去左右重复for(ll i=1;i<m;i++){ll flag=0;for(ll j=1;j<=n;j++)if(!can[j][i][1]){flag=1;break;}if(!flag) ans--;}for(ll i=1;i<m;i++){ll flag=0;for(ll j=1;j<=n;j++)if(!can[j][i][2]){flag=1;break;}if(!flag) ans--;}//减去上下//若上面为B下面只能为Wfor(ll i=1;i<n;i++){ll flag=0;for(ll j=1;j<=i;j++)if(!can[j][m][1]){flag=1;break;}for(ll j=i+1;j<=n;j++)if(!can[j][0][1]){flag=1;break;}if(flag)continue;ans--;}for(ll i=n;i>=2;i--){ll flag=0;for(ll j=1;j<=i-1;j++)if(!can[j][0][1]){flag=1;break;}for(ll j=i;j<=n;j++)if(!can[j][m][1]){flag=1;break;}if(flag)continue;ans--;}for(ll i=1;i<=n;i++){if(!can[i][0][1])    flag1=1;if(!can[i][m][1])    flag2=1;}if(!flag1) ans-=3;if(!flag2) ans-=3;printf("%lld\n",(ans+mod)%mod);
}
View Code

题解

我们发现一条性质我们子树内两个点要变成黑色我们同时经过树外的边不会使次数变优(除了直接与lca相连的边)

然后根据这条性质,我们发现我们一定存在一种最优方案使任意两条染色路径互不相交

然后我们进行贪心

首先题目中给的无要求的边我们进行缩边

我们统计到当前子树都已经全部染成黑色了,那么我们只用考虑与它相连就行

拿下面这个图举例(假设全部为白边)

你考虑3时你6的子树都处理完了,然后你遇到两个白色边(3,6)(3,7)你贪心直接染色就行,那么如果最后剩下一个没有染色怎么办,显然我们不用管,我们发现与3相连的边(1,3)这条边是必定被染色的,2本来要和3进行染色让(1,2)(1,3)进行染色,我们现在把这个边拉过来变成(2,8)进行染色就行了

那么依据上文说的,我们只需要让与3相连白边个数(除了父亲与它相连边)/2就行了

推广到所有点统计白边个数/2即可

然后这样做对于根来说会出错,特判一下就AC了(对于根来说没有办法再让自己父亲拉边过来)

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define R register
#define ll long long
inline ll read()//-------
{ll aa=0;char cc=getchar();while(cc<'0'||cc>'9') cc=getchar();while(cc<='9'&&cc>='0'){aa=(aa<<3)+(aa<<1)+(cc^48);cc=getchar();}return aa;
}
const int N=1000005;
struct tree{int v,last;
}tr[N<<1];
int tot,first[N];
inline void add(int x,int y)
{tr[++tot]=(tree){y,first[x]};first[x]=tot;return;
}
int n,ans,mp[N],vi[N];
int dfs(int x,int fa)
{int sum=0;vi[x]=1;for(R int i=first[x],v;i;i=tr[i].last){v=tr[i].v;if(v==fa)continue;dfs(v,x);sum^=1;if(!sum)++ans;}return sum;
}
int main()
{//freopen("tight.in","r",stdin);//freopen("tight.out","w",stdout);n=read();mp[1]=++mp[0];for(R int i=2,x,y,z;i<=n;++i){x=read();y=read();z=read();if(!z){if(mp[i])mp[x]=mp[i];else if(mp[x])mp[i]=mp[x];else mp[i]=mp[x]=++mp[0];continue;}if(!mp[i])mp[i]=++mp[0];if(!mp[x])mp[x]=++mp[0];if(y)continue;add(mp[i],mp[x]);add(mp[x],mp[i]);}for(R int i=1;i<=mp[0];++i)if(!vi[i])if(dfs(i,i))++ans;printf("%d",ans);return 0;
}
View Code

 

转载于:https://www.cnblogs.com/znsbc-13/p/11424317.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux设置环境变量_什么是linux环境变量

本来这篇文章好几天之前就写好了&#xff0c;但是媳妇儿跟我说工作日就不要发了&#xff0c;大家都在上班&#xff0c;哪有闲心思看你的文章。哎&#xff0c;可能大家用头条都是在放松刷娱乐&#xff0c;看小姐姐。所以就一直拖到现在。周末了&#xff0c;更是放松的好时候&…

理科卷math·english·chinese·biology·chemistry·physics

一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 $n^2$枚举两两$gcd$ $80\%$ 我考试时思路 找到每一个数和$mod$的$gcd$,发现只要是任一$gcd$倍数…

cad卸载_怎么把CAD卸载干净,老司机来教你

CAD经常出现文件丢失啊、这样那样的提示&#xff0c;要是身边有个大神级朋友还好&#xff0c;没有的小盆友只能乖乖的卸载&#xff0c;重新安装了&#xff0c;那么又有个问题拦住我们了——怎么把CAD卸载干净呢&#xff1f;由于卸载不干净&#xff0c;再次安装CAD时&#xff0c…

什么是JavaServer Faces(JSF)–(第2部分)

Facelets声明语言 在第1部分中&#xff0c;我介绍了JavaServer Pages&#xff08;JSF&#xff09;背后的基本思想 。 在本文中&#xff0c;我想介绍Facelets声明语言 。 HTML标签 我们遇到的第一个标签是代表HTML元素HTML标签。 这些实际上只是HTML标记&#xff08;例如输入&a…

问题 1076: 内部收益率

问题 1076: 内部收益率 时间限制: 1Sec 内存限制: 128MB 提交: 418 解决: 169 题目描述在金融中&#xff0c;我们有时会用内部收益率IRR来评价项目的投资财务效益&#xff0c;它等于使得投资净现值NPV等于0的贴现率。换句话说&#xff0c;给定项目的期数T、初始现金流CF0和项目…

路由器上的usb接口有什么用_路由器的USB接口,非常强大的功能,教您轻轻松松玩转,太实用了...

新一代出来的路由器后面基本上都会有一个或者是两个以上的有USB接口。居然还有很多人都不知道这些&#xff0c;要是比接口的用处。只是把它当做普通的无线路由器用。这样子太可惜了。其实路由器后面的usb接口呀&#xff0c;它有非常强大的功能&#xff0c;好处多多。接下来就请…

关于全局缓存的一种简单实现方法

缓存&#xff0c;在.Net系统开发中&#xff0c;经常使用到。如果&#xff0c;让你自己去实现&#xff0c;你会怎么做呢。 开始编码前思考&#xff1a; 1、肯定 是要 根据 key 去查询对应value&#xff0c;so 应该是List<KeyValuePair> 这类集合做缓存载体&#xff1b; 2、…

Lombok–您绝对应该尝试一下

Lombok在Java生态系统中并不是什么新鲜事物&#xff0c;但是我必须承认&#xff0c;直到我尝试使用它或被“确信”尝试它之前&#xff0c;我总是低估了它的价值。 我发现添加一个库来生成代码的价值并不高&#xff0c;这些库可以被当今的任何现代IDE轻松生成。 因此&#xff0c…

苹果手机透明桌面_原来苹果手机辨别真假这么简单!查看桌面1个图标,就能轻松分辨...

要说哪个品牌的手机贵&#xff0c;大家想到的肯定是苹果手机啦&#xff0c;所以说很多朋友都害怕自己买到假货。其实分辨苹果手机是不是正品很简单&#xff0c;只需学会这两个方法&#xff0c;就能辨别出手机的真假哦。一、从细节入手1.桌面时钟不知道大家发现没&#xff0c;iP…

NOIP模拟测试34「次芝麻·呵呵呵·长寿花」

次芝麻 题解 大力打表,发现快速幂, 例如初始$5$ $6$,那么第一次就是$5*2\%1110$,$6*2\%111$. 代码 #include<bits/stdc.h> using namespace std; #define ll long long ll n,m,k,d; ll g(ll x,ll k,ll s1){for(;k;k>>1,xx*x%d)if(k&1) ss*x%d;return s; } int …

Java Bean验证基础

这篇文章总结了一些简单易用的示例&#xff0c;这些示例说明了您想使用Java Beans Validation API&#xff08;JSR 349&#xff0c;JSR 303&#xff09;进行的最常见操作。 记住&#xff0c;Beans Validation独立于Java EE。 尽管它是作为Java EE兼容服务器的一部分内置的&…

NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

简单的区间 $update$ 终于$AC$了 找到$(sum[r]sum[l](sum表示以中间点为基准的sum)-mx)\%k0$的点 注意这里$sum$表示是以$mid$为基准点,(即$sum[l]$为后缀和,$sum[r]$为前缀和) 回忆$(sum[r]-sum[l])\%k0$这个经典问题做法(入阵曲简化版),开桶,桶里维护$sum[l]\%k$,那么$r$贡献…

苹果手机变卡了怎么解决_iOS 变卡怎么解决?一招搞定!无需刷机

iOSiOS 因为其优秀的底层交互逻辑&#xff0c;能让一部 iPhone 在不跨版本更新系统的前提下&#xff0c;至少保证 2 年内如新机般流畅。两年之后呢&#xff1f;你是否为手中的老将渐衰而苦恼过&#xff1f;本人对手机的流畅度十分敏感&#xff0c;可以说到了极致。付款时&#…

NOIP模拟测试38「金·斯诺·赤」

金 辗转相减见祖宗 高精 #include<bits/stdc.h> using namespace std; #define A 2000 #define P 1 #define N 10 #define ll long long ll n,T; char sjdfj[A]; struct bignum {ll n[A],l;bignum(){l1,memset(n,0,sizeof(n));}void clear(){while(l>1&&!n[l-…

什么是JSON处理(JSON-P API)?

Java EE中的JSON-P简介 JSON处理1.0&#xff08; JSR 353 &#xff09;的Java API是一个低级&#xff0c;轻量级的JSON解析器和生成器&#xff0c;它提供了在属性和值级别上操作JSON数据的能力。 JSR 353提供了两种JSON处理模型&#xff1a; 对象模型和流模型。 两种模型都可以…

电视机原理图_电工电气,如何看电气原理图和接线图,如何设计图纸?

电气图纸一般可分为两大类&#xff0c;一类为电力电气图&#xff0c;它主要是表述电能的传输、分配和转换&#xff0c;如电网电气图、电厂电气控制图等。另一类为电子电气图&#xff0c;它主要表述电子信息的传递、处理&#xff1b;如电视机电气原理图。本文主要谈电力电气图的…

NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define A 6666666 #define mod 998244353 ll jie[A],ni[A],acnt[A],bcnt[A]; ll fheng[A],fshu[A]; ll n,m,a,b; ll meng(ll x,ll k){ll ans1;for(;k;k>>…

ubuntu 如何登录远程服务器_VSCode远程登录云服务器、树莓派实现在线调试代码...

在PyCon2019大会上&#xff0c;微软发布了VSCode Remote&#xff0c;开启了远程开发的新时代&#xff01;Remote可以帮助开发者在容器、物理机器或虚拟机&#xff0c;以及WSL上实现无缝的远程开发。通过安装Remote Development Extension Pack&#xff0c;开发者可以快速上手远…

macosx jdk_MacOSX环境上的多个Java JDK

macosx jdk同样&#xff0c;这是在Mac&#xff08;OSX 10.8.x &#xff09;上配置Java开发环境的一个小技巧。 如果您现在真的开始&#xff0c;我建议您阅读我以前的文章之一 &#xff0c;这是一种快速干净的方法&#xff08;我想&#xff09;来设置环境变量并开始Java编码。 今…

屏幕方向读取与锁定:Screen Orientation API(转)

什么是 Screen Orientation API Screen Orientation API 为 Web 应用提供了读取设备当前屏幕方向、旋转角度、锁定旋转方向、获取方向改变事件的能力。使得特定应用在屏幕方向方面增强用户体验&#xff0c;如视频和游戏。该标准目前处于工作组草案状态&#xff0c;最近一个修改…