NOIP模拟测试22「位运算」

范围n-----$100000$   m $30$

输出方案

这是一个很好的$dp$题

首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$,那么你可以达到任何`一种$n$个$1$的情况

例如

你最后可以达到$3$个$1$

那么你可以达到$11100 $  $ 01110$    $01011$    $01101$等方案

证明:题目里说的操作和优美值都是一的个数相关,只要我们可以达到$n$个一,我们可以通过变换$1$的位置得到多种方案

于是题目里给的$C$我们并不关心,我们只关心$1$的个数,我们把1都放到最右面,另外这也给我们下面dp提供方便

我们先看各个运算意义

假设你$x$和$y$中有$s$个重复的$1$求各个运算之后一的个数,

$\&$后$1$的个数就是$s$,

对于$|$我们如果都加的话重复的多加一次

$|$后$1$的个数就是$x+y-s$

重复变为0

^后$1$的个数就是$x+y-s-s$

然后我们可以尝试列一个$dp$

设$f[x][j]$表示第$x$个操作有$j$个$1$的情况,我们当有这种情况就设为$1$,设最后$C$中一的个数为$x$,我们只需要看$f[n][x]$,若$f[n][x]$为$1$递归找解(后面会说到,其实递归找解是这个题最难的地方),若为$0$就是无解

根据上面得出结论我们可以列出

枚举这次操作后重复个数为w,设这次优美值为$G[i]$,枚举之前1的个数为$j$

若这次操作为$\&$则$f[x][w]=max(f[x-1][j],f[x][w])$

若为$|$ 则$f[x][G[i]+j-w]=max(f[x][G[i]+j-w],f[x-1][j])$

类似的若为^则$f[x][G[i]+j-w*2]=max(f[x][G[i]+j-w*2],f[x-1][j])$

注意一下边界以及循环枚举

            for(ll w=max(0ll,G[i]+j-m);w<=min(j,G[i]);w++)

看这句max,因为当它比m大时一定有重叠部分,且重叠部分至少为$G[i]+j-m$

然后就到了这个题难点记录方案

思考我们已知条件

我们从后往前搜,我们目前知道的是最终值,我们每一次都把前一位的值算出来,再搜前一位

那么我们已知运算符号已知运算前后1的个数,和运算后的值,我们现在要做的就是求出前一位值,且我们知道这一定能找到一组合法解

三个运算符号分开考虑,

假设符号为$|$,我们已知当前1个数(G[i]),和这次操作之后1的个数,这次操作之前1的个数

我们只需要让这次操作之前数,这次操作数二进制下1完美覆盖掉这次操作1的个数即可

因为我们符号$|$,我们只需要一个从前扫,一个从后扫,类似ST重复无所谓

例如操作前$3$个$1$,这次操作$3个1$操作后$11011$,我们一个从前扫得到$11010$另一个得到$01011$

假设符号为$\&$,&只会让数值变小,我们可以断定操作前1的个数和这次操作1一定>=操作后

我们先保证这些操作后上有值的位一定有$1$,然后我们分开放剩下的$1$

例如操作前$4$个$1$,这次操作$3$个$1$,操作后$10001$,我们先得到$10001$   $10001$,再分开放1得到$11101$和$10011$

假设我们当前符号^,思考^运行他会使相同的位置变成0,不同变为1

那么我们重复的地方可以算出是(之前1的个数+这次1的个数-操作后1的个数)/2

然后先给不重复地方赋值,再分别给重复地方赋1

例如操作前$4$个$1$,这次操作$2$个$1$,操作后$11101$,我们先得到重复长度1,然后得到$11100$和$00001$,最后给重复赋值$11110$,$00011$

void dfs(ll pos,ll now)
{if(pos==1){printf("%lld ",now);return ;}ll cnt_1=0;
//    printf("pos=%lld\n",pos);for(ll i=1;i<=m;i++)if(now&(1<<(i-1)))cnt_1++;if(ch[pos][1]=='A'){ll nowk=now,tot=cnt_1,pr=pre[pos][cnt_1],nxtk=now;//知道目前的数,知道目前cnt,知道之前cnt,求之前数//因为是&所以在满足k条件下尽量差开,分开放最优//例如10001//先放11001再放10111for(ll i=1;i<=m;i++){if(tot==G[pos]) break;if(!(now&(1<<(i-1))))nowk|=(1<<(i-1)),tot++;}tot=cnt_1;for(ll i=1;i<=m;i++){if(tot==pr) break;if(!(nowk&(1<<(i-1))))nxtk|=(1<<(i-1)),tot++;}
//        printf("nxtk=%lld nowk=%lld\n",nxtk,nowk);dfs(pos-1,nxtk);printf("%lld ",nowk);}if(ch[pos][1]=='O'){ll nowk=0,tot=0,pr=pre[pos][cnt_1],nxtk=0;//知道目前的数,知道目前cnt,知道之前cnt,求之前数//那么向kmp一样或无所谓for(ll i=1;i<=m;i++){if(tot==G[pos])break;if(now&(1<<(i-1)))nowk|=(1<<(i-1)),tot++;}tot=0;for(ll i=m;i>=1;i--){if(tot==pr)break;if(now&(1<<(i-1)))nxtk|=(1<<(i-1)),tot++;}
//        printf("nx=%lld no=%lld\n",nxtk,nowk);dfs(pos-1,nxtk);printf("%lld ",nowk);}if(ch[pos][1]=='X'){ll nowk=0,tot=0,pr=pre[pos][cnt_1],nxtk=0,lst=0;ll chong=(pr+G[pos]-cnt_1)/2;//计算出重合部分,重合部分就是第一个长度+第二个长度-总1数/2for(ll i=1;i<=m;i++){if(tot==G[pos]-chong)break;if(now&(1<<(i-1)))nowk|=(1<<(i-1)),tot++,lst=i;}tot=0;for(ll i=m;i>=lst+1;i--){if(tot==pr-chong)break;if(now&(1<<(i-1)))nxtk|=(1<<(i-1)),tot++;}tot=0;for(ll i=1;i<=m;i++){if(tot==chong)break;if(!(now&(1<<(i-1))))nowk|=(1<<(i-1)),nxtk|=(1<<(i-1)),tot++;}
//        printf("nxk=%lld nok=%lld\n",nxtk,nowk);dfs(pos-1,nxtk);printf("%lld ",nowk);}
}
求方案代码

总代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
ll f[A][32],pre[A][32],G[A],dl[A];
ll x,n,m,c;
char ch[A][6];
bitset<36> b;
void dfs(ll pos,ll now)
{if(pos==1){printf("%lld ",now);return ;}ll cnt_1=0;
//    printf("pos=%lld\n",pos);for(ll i=1;i<=m;i++)if(now&(1<<(i-1)))cnt_1++;if(ch[pos][1]=='A'){ll nowk=now,tot=cnt_1,pr=pre[pos][cnt_1],nxtk=now;//知道目前的数,知道目前cnt,知道之前cnt,求之前数//因为是&所以在满足k条件下尽量差开,分开放最优//例如10001//先放11001再放10111for(ll i=1;i<=m;i++){if(tot==G[pos]) break;if(!(now&(1<<(i-1))))nowk|=(1<<(i-1)),tot++;}tot=cnt_1;for(ll i=1;i<=m;i++){if(tot==pr) break;if(!(nowk&(1<<(i-1))))nxtk|=(1<<(i-1)),tot++;}
//        printf("nxtk=%lld nowk=%lld\n",nxtk,nowk);dfs(pos-1,nxtk);printf("%lld ",nowk);}if(ch[pos][1]=='O'){ll nowk=0,tot=0,pr=pre[pos][cnt_1],nxtk=0;//知道目前的数,知道目前cnt,知道之前cnt,求之前数//那么向kmp一样或无所谓for(ll i=1;i<=m;i++){if(tot==G[pos])break;if(now&(1<<(i-1)))nowk|=(1<<(i-1)),tot++;}tot=0;for(ll i=m;i>=1;i--){if(tot==pr)break;if(now&(1<<(i-1)))nxtk|=(1<<(i-1)),tot++;}
//        printf("nx=%lld no=%lld\n",nxtk,nowk);dfs(pos-1,nxtk);printf("%lld ",nowk);}if(ch[pos][1]=='X'){ll nowk=0,tot=0,pr=pre[pos][cnt_1],nxtk=0,lst=0;ll chong=(pr+G[pos]-cnt_1)/2;//计算出重合部分,重合部分就是第一个长度+第二个长度-总1数/2for(ll i=1;i<=m;i++){if(tot==G[pos]-chong)break;if(now&(1<<(i-1)))nowk|=(1<<(i-1)),tot++,lst=i;}tot=0;for(ll i=m;i>=lst+1;i--){if(tot==pr-chong)break;if(now&(1<<(i-1)))nxtk|=(1<<(i-1)),tot++;}tot=0;for(ll i=1;i<=m;i++){if(tot==chong)break;if(!(now&(1<<(i-1))))nowk|=(1<<(i-1)),nxtk|=(1<<(i-1)),tot++;}
//        printf("nxk=%lld nok=%lld\n",nxtk,nowk);dfs(pos-1,nxtk);printf("%lld ",nowk);}
}
int main(){scanf("%lld%lld%lld",&n,&m,&c);for(ll i=2;i<=n;i++){scanf("%s",ch[i]+1);}b|=c;x=b.count();
//    printf("x=%lld\n",x);for(ll i=1;i<=n;i++){scanf("%lld",&G[i]);}f[1][G[1]]=1;for(ll i=2;i<=n;i++)for(ll j=0;j<=m;j++){if(!f[i-1][j]) continue;for(ll w=max(0ll,G[i]+j-m);w<=min(j,G[i]);w++){if(ch[i][1]=='A'){if(f[i-1][j]==1)f[i][w]=1,pre[i][w]=j/*,printf("A pos=%lld pre[%lld][%lld]=%lld\n",i,i,w,pre[i][w])*/;}if(ch[i][1]=='O'){if(f[i-1][j]==1)f[i][j+G[i]-w]=1,pre[i][j+G[i]-w]=j/*,printf("O pos=%lld pre[%lld][%lld]=%lld\n",i,i,j+G[i]-w,pre[i][j+G[i]-w])*/;}if(ch[i][1]=='X'){if(f[i-1][j]==1)f[i][j+G[i]-2*w]=1,pre[i][j+G[i]-2*w]=j/*,printf("X pos=%lld pre[%lld][%lld]=%lld\n",i,i,j+G[i]-2*w,pre[i][j+G[i]-2*w])*/;}}}dfs(n,c);
}
View Code

 

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

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

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

相关文章

系统测试集成测试单元测试_等待正确的时刻–集成测试

系统测试集成测试单元测试当您必须测试多线程程序时&#xff0c;总是需要等到系统达到特定状态为止&#xff0c;此时测试可以验证是否已达到正确的状态。 这样做的通常方法是在系统中插入一个“探针”&#xff0c;该探针将向同步原语发出信号 &#xff08;例如Semaphore &…

Apollo的基本概念和集成实战

基本概念 使用场景 是一个分布式的配置中心。适用于微服务&#xff1b; 核心功能 集中管理不同环境&#xff0c;不同集群的配置&#xff1b;配置修改后可以实时推送到应用端&#xff1b;具备规范的权限&#xff0c;流程治理特性&#xff1b;开发技术 服务端使用springboot,spri…

flatMap()和事件顺序– RxJava常见问题解答

正如我们已经发现的&#xff0c; flatMap()不会保留原始流的顺序。 让我们使用上一篇文章的GeoNames API示例进行说明 &#xff1a; public interface GeoNames {Flowable<Long> populationOf(String city);}通过使用flatMap()请求多个城市的人口&#xff0c;我们不能保…

技术管理规划-从哪入手?

前言 最近在学习技术管理课程&#xff0c;对学习的内容做一些笔记&#xff0c;结合当前的工作环境在对应的知识点上做一些思考&#xff0c;慢慢建立自己的团队管理方法论。 学习方法 早上骑单车的时候或者跑步的时候听音频&#xff0c;熟悉课程内容&#xff1b;仔细阅读文字&am…

NOIP模拟测试23「mine·water·gcd」

mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc.h> using namespace std; //无脑dp #define ll long long #define A 2222222 const ll mod1e97; //设f[x][5][2]为当前是第x个格子,当前填什么 0前面填1后面填 ll f[A][5][2]; /…

在AWS中设置Cassandra集群

Apache Cassandra是一个NoSQL数据库&#xff0c;它使用一致的哈希机制可以轻松进行水平扩展。 七年前&#xff0c;我尝试了它&#xff0c;并决定不将其用于我的附带项目&#xff0c;因为它太新了。 现在情况有所不同&#xff0c;Cassandra早已建立起来&#xff0c;背后有一家公…

k8s停止服务_使用 K8S 几年后,这些技术专家有话要说

9 月 7 日下午&#xff0c;在深圳南山软件产业基地&#xff0c;腾讯云 K8S & 云原生技术开放日成功落幕&#xff0c;来自腾讯、灵雀云、超参数科技、虎牙等资深技术专家与现场开发者共同探讨企业落地 K8S 的过程中遇到的难点以及解决问题的方法。K8S 逐渐成为容器编排的标准…

spring的事件机制实战

理论 在分布式场景下&#xff0c;实现同步转异步的方式有三种方式&#xff1a; 1.异步线程池执行&#xff1b;比如借助Asyn注解&#xff0c;放到spring自带的线程池中去执行&#xff1b; 2.放到消息队列中&#xff0c;在消费者的代码中异步的消费&#xff0c;执行相关的逻辑&am…

苹果wifi网速慢怎么办_所以,WiFi和4G到底哪个更耗电?

来源 | 中科院物理所(ID&#xff1a;cas-iop)编辑 | 椒盐猫巨烦现代人行走江湖&#xff0c;必备三件法宝&#xff1a;手机&#xff0c;网络&#xff0c;充电宝。即便在4G基站遍布各个旮旮角角的今天&#xff0c;当你带着心仪的人儿走进一家咖啡店&#xff0c;第一件事仍然是低声…

问题 1073: 弟弟的作业

题目描述你的弟弟刚做完了“100以内数的加减法”这部分的作业&#xff0c;请你帮他检查一下。每道题目&#xff08;包括弟弟的答案&#xff09;的格式为abc或者a-bc&#xff0c;其中a和b是作业中给出的&#xff0c;均为不超过100的非负整数&#xff1b;c是弟弟算出的答案&#…

苹果4怎么越狱_苹果手机如何截屏

很多用过苹果手机的用户对苹果的评价可是非常高对&#xff0c;苹果手机最大的特点便是手感好&#xff0c;并且使用一年以上也不会卡机现象&#xff0c;因此苹果手机才得到了广泛的关注。苹果手机的截屏程序与安卓手机不同&#xff0c;一般情况下&#xff0c;安卓手机是可以设置…

简单的Spring Boot管理员设置

Spring Boot Admin是一个不错的仪表板&#xff0c;用于监视您的Spring Boot应用程序。 但是&#xff0c;设置它并不是一件容易的事。 该文档概述了两个选项 &#xff1a; 在连接到admin应用程序的启动应用程序中包括一个客户端库–这要求将admin应用程序部署在公共位置或至少可…

NOIP模拟测试19「count·dinner·chess」

反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍然认为不可实现 0分 所以T1是什么样的难题呢 即使暴力也有60分,但我楞没想出来暴力怎么打…

react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)

好程序员web前端培训分享React学习笔记(三)&#xff0c;组件的生命周期React中组件也有生命周期&#xff0c;也就是说也有很多钩子函数供我们使用, 组件的生命周期&#xff0c;我们会分为四个阶段&#xff0c;初始化、运行中、销毁、错误处理(16.3之后)初始化在组件初始化阶段会…

静态工厂方法代替构造器实例_静态工厂方法与传统构造方法

静态工厂方法代替构造器实例之前&#xff0c;我已经讨论过一些关于Builder模式的信息 &#xff0c; Builder Pattern是一种有用的模式&#xff0c;用于实例化具有几个&#xff08;可能是可选的&#xff09;属性的类&#xff0c;这些属性可以使读取&#xff0c;编写和维护客户端…

NOIP模拟测试21「折纸·不等式」

折纸 题解 考试时无限接近正解&#xff0c;然而最终也只是接近而已了 考虑模拟会爆炸&#xff0c;拿手折纸条试一试&#xff0c;很简单 考你动手能力 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define A 3100000 ll cj[A],questions[A]; l…

小孔成像总结_科学实践小孔成像

科学实践小孔成像-徐征浩、周永锋耳闻之不如目见之&#xff0c;目见之不如足践之。行是知之始&#xff0c;知是行之成。聪明不仅仅是理论上&#xff0c;它还体现在实践等方面。国庆期间&#xff0c;同学们运用物理课堂上所学的知识制作了小孔成像和土电话这些常见的物理仪器&am…

休眠架构概述

下图提供了Hibernate体系结构的高级视图&#xff1a; 最小的架构 “最小”架构使应用程序可以管理自己的JDBC连接&#xff0c;并提供与Hibernate的连接。 另外&#xff0c;应用程序自行管理交易。 这种方法使用了最少的Hibernate API子集。 综合架构 Hibernate Basic API 这里…

ASP.NET Core MVC 之过滤器(Filter)

ASP.NET MVC 中的过滤器允许在执行管道中的特定阶段之前或之后运行代码。可以对全局&#xff0c;也可以对每个控制器或每个操作配置过滤器。 1.过滤器如何工作 不同的过滤器类型在管道中的不同阶段执行&#xff0c;因此具有各自的与其场景。根据需要执行的任务以及需要执行的请…

.sh文件是什么语言_FastDFS分布式文件系统的搭建安装

FastDFS很久之前&#xff0c;对上传的文件可能是存储在数据库&#xff0c;在数据库中存储路径&#xff0c;保存文件的二进制数据&#xff0c;随着用户上传的文件增加&#xff0c;数据库数据越来越多。这时&#xff0c;可以使用分布式文件系统&#xff0c;将用户上传的文件例如图…