Internet of Lights and Switches(MAP记录+二分) 2015年湖南省赛第 I 题

2024-05-12 20:18

本文主要是介绍Internet of Lights and Switches(MAP记录+二分) 2015年湖南省赛第 I 题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

You are a fan of "Internet of Things"(IoT, 物联网), so you build a nice Internet of Lights and Switches in your huge mansion. Formally, there are n lights and m switches, each switch controls one or more lights, i.e. pressing that switch flips the status of those lights (on->off, off->on).

blob.png

Initially, all the lights are on. Your task is to count the number of ways to turn off all the lights by pressing some consecutive switches. Each switch should not be pressed more than once. There is only one restriction: the number of switches you pressed should be between a and b (inclusive).


输入描述

There will be at most 20 test cases. Each test case begins with a line containing four integers n, m, a, b (2<=n<=50, 1<=a<=b<=m<=300000). Each of the following m lines contains a 01 string of length n. The i-th character is 1 if and only if that switch controls the i-th light. The size of the whole input file does not exceed 8MB.


输出描述

For each test case, print the case number, and the number of ways to turn off all the lights.


输入样例
2 4 1 4
01
10
11
00
2 4 3 3
01
10
11
00
6 3 1 3
101001
010110
101001

输出样例

Case 1: 3 Case 2: 0 Case 3: 2

题意:有n个灯最初是亮的,现在要通过连续的操作使得灯全灭,现在m个操作,可以连续的操作个数为a~b,问有多少种情况使得灯全灭。

解题:用map<long long , vector<int> >记录每种灯的状态所对应第 i 个操作(第i个操作的状态为:输入的前i个操作的异或状态) + 二分.

#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<vector>
using namespace std;
const int N = 300010 ;
#define ll long long
ll num[N] ;
map<ll, vector<int> >mp;
void two(ll tnum , int n , int& L , int& R )
{int l=0,r=mp[tnum].size()-1 , mid;while(l<=r){mid = (l+r)>>1;if(mp[tnum][mid]>=L)r = mid - 1 ;elsel = mid + 1;}L  = l ;if(L==mp[tnum].size()){L = -1 ;R =  L - 1 ;return ;}l = 0 , r = mp[tnum].size()-1 ;while(l<=r){mid = (l+r)>>1;if(mp[tnum][mid]>=R)r = mid - 1 ;elsel = mid + 1;}if(l==mp[tnum].size())R = l-1;else if(mp[tnum][l]>R)R = l-1 ;elseR = l ;
}int main()
{int n,m,a,b , ans , T = 0;char s[100] ;while(scanf("%d%d%d%d",&n,&m,&a,&b)>0){mp[0].push_back(0);num[0]=0;for(int i=1; i<=m; i++){scanf("%s",s);num[i] = 0 ;for(int j=0; j<n; j++)if(s[j]=='1'&& !(num[i-1]&(1LL<<j)) || s[j]=='0'&&(num[i-1]&(1LL<<j))==(1LL<<j))num[i] |= 1LL<<j ;mp[ num[i] ].push_back(i) ;// printf("size = %d\n",mp[num[i]].size());}ans = 0 ;for(int i=1; i<=m; i++){ll tnum = 0 ;for(int j=0; j<n; j++)if((num[i]&(1LL<<j))==0)tnum |= 1LL<<j;int L = i-b , R = i-a ;two(tnum , n , L , R );if(R>=L)ans += R-L+1 ;// printf("[ %d , %d ] num = %lld ,tnum = %lld size = %d\n",L,R,num[i],tnum,mp[tnum].size());}for(int i=0; i<=m; i++)mp[num[i]].clear() ;printf("Case %d: %d\n",++T , ans ) ;}
}

这篇关于Internet of Lights and Switches(MAP记录+二分) 2015年湖南省赛第 I 题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983635

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和