[JOI2018] Snake Escaping
首先暴力是考虑对每个询问枚举问号填 1 还是 0,然后把每种可能统计到答案中,复杂度是 \(O(2^n \times q)\) 的。
然后我们可以观察出一些性质:
比如 1?1,他可能的情况是 111 或者 101,他们在数值上是不连续的,如果能把他们转化成连续的就好做了。
这里就有一个非常巧妙地转化:
还是以 1?1 为例,我们把它看成一个坐标 \((1,?,1)\),那么可能的情况就是 \((1,1,1)\) 和 \((1,0,1)\)。
画出坐标系,不难发现他们在立方体中是连续的一段。
我们可以把它推广到多维,记 \(sum_{(x_1,x_2,\cdots,x_n)}=\displaystyle \sum_{i_1=0}^{x_1} \sum_{i_2=0}^{x_2} \cdots \sum_{i_n=0}^{x_n} a_{(i_1,i_2,\cdots,i_n)}\)。
这个东西就是一个高维前缀和,可以预处理,我们记录 \(S\) 中 1 和 ? 的位置,枚举 1 构成的集合的子集,然后容斥原理计算答案。
同理,我们也可以记录 0 出现的位置,进行容斥计算答案。
因为 1,0,? 的个数至少有一个小于等于 \(\lfloor \dfrac{n}{3} \rfloor\),所以我们统计个数,寻找对应的做法即可。
时间复杂度 \(O(2^{\lfloor \frac{n}{3} \rfloor} \times q)\)。
#include <bits/stdc++.h>
#define reg register
#define fi first
#define se second
#define mp std::make_pair
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int rd()
{
reg int x=0,f=0;
reg char ch=getchar();
while(!isdigit(ch)) (ch=='-')&&(f=1),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int MAXN=1100000;
int n,q;
int pre[MAXN],suf[MAXN],bit[MAXN],val[MAXN];
char s[MAXN];
void work()
{
n=rd(),q=rd();
scanf("%s",s);
for(reg int i=1;i<=(1<<n)-1;++i) bit[i]=bit[i>>1]+(i&1);
for(reg int i=0;i<=(1<<n)-1;++i) val[i]=pre[i]=suf[i]=s[i]-'0';
for(reg int i=1;i<=(1<<n)-1;i<<=1) for(reg int j=i;j<=(1<<n)-1;j=(j+1)|i)
pre[j]+=pre[j^i],suf[j^i]+=suf[j];
while(q--)
{
scanf("%s",s);
int ans=0,cnt1=0,cnt2=0,cnt3=0,bit1=0,bit2=0,bit3=0;
for(reg int i=0;i<n;++i)
{
if(s[i]=='0') ++cnt1,bit1|=1<<(n-i-1);
if(s[i]=='1') ++cnt2,bit2|=1<<(n-i-1);
if(s[i]=='?') ++cnt3,bit3|=1<<(n-i-1);
}
if(cnt1<=cnt2&&cnt1<=cnt3)
{
int tmp=bit1;
do
{
if(bit[tmp]&1) ans-=suf[tmp|bit2];
else ans+=suf[tmp|bit2];
tmp=(tmp-1)&bit1;
} while(tmp!=bit1);
}
else if(cnt2<=cnt1&&cnt2<=cnt3)
{
int tmp=bit2;
do
{
if(bit[tmp^bit2]&1) ans-=pre[tmp|bit3];
else ans+=pre[tmp|bit3];
tmp=(tmp-1)&bit2;
} while(tmp!=bit2);
}
else
{
int tmp=bit3;
do
{
ans+=val[tmp|bit2];
tmp=(tmp-1)&bit3;
} while(tmp!=bit3);
}
printf("%d\n",ans);
}
}
int main()
{
int _=1;
// _=rd();
while(_--) work();
return 0;
}
[JOI2018] Snake Escaping的更多相关文章
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- Leetcode: Design Snake Game
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- 2101 Problem A Snake Filled
题目描述 “What a boring world!”Julyed felt so bored that she began to write numbers on the coordinate pa ...
- 图像分割之(五)活动轮廓模型之Snake模型简介
在"图像分割之(一)概述"中咱们简单了解了目前主流的图像分割方法.下面咱们主要学习下基于能量泛函的分割方法.这里学习下Snake模型简单的知识,Level Set(水平集)模型会在 ...
- Epic - Snake Sequence
You are given a grid of numbers. A snakes equence is made up of adjacent numbers such that for each ...
- Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...
- 图像切割之(五)活动轮廓模型之Snake模型简单介绍
图像切割之(五)活动轮廓模型之Snake模型简单介绍 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了 ...
- 353. Design Snake Game
贪食蛇. GAME OVER有2种情况,1是咬到自己,2是出界. 1)用QUEUE来保留占据的格子,每走一格就添加1个,然后POll()最后一个. 做一个一样的SET来check要走的格子是不是已经在 ...
- 切割图像(五)主动轮廓模型Snake简要模型
切割图像(五)主动轮廓模型Snake简要模型 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了解了眼下 ...
- [Swift]LeetCode353. 设计贪吃蛇游戏 $ Design Snake Game
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
随机推荐
- 智能语音备忘录:SpeechRecognition与gTTS的奇妙融合
引言:智能语音备忘录的时代已经到来 在这个信息爆炸的时代,我们每天需要处理大量的事务和信息.传统的文字记录方式虽然可靠,但在效率上往往难以满足快节奏生活的需求.想象一下,如果你能在驾车.散步或是灵感突 ...
- vue报错:Property or method "xxx" is not defined on the instance but referenced during render.
vue报错:Property or method "attendanceDetaill" is not defined on the instance but referenced ...
- lighttools batchmode 批处理vb程序代码
完成后的图示,选择需要模拟的lighttools后,直接进行运行,点击开始模拟,即可逐个模拟完成 lighttools 连接代码: 1 Private m_ltServer As LTAPI 2 3 ...
- .net6 中间件
参照资料: ASP.NET Core 中间件 | Microsoft Learn ASP.NET Core端点路由 作用原理 - 知乎 (zhihu.com) 一.概念 中间件是一种装配到应用管道以处 ...
- Spring--IOC注解用法初探
创建一个UserDao接口,和一个UserDaoImp的实现类 UserDao接口 package com.zjw.spring.demo1; public interface UserDao { p ...
- C#实现ModbusTCP从站(三)
C#实现ModbusTCP从站(三) 前言 [作者]:编程笔记in [原文]:mp.weixin.qq.com/s/EerOuTF2HK72ykNHJS1duQ 本文描述如何使用C#原生的Socket ...
- Linux内核中断irq.h头文件找不到的问题
头文件 在vscode中,进行tasklet和work中断实验的时候,对于包含的头文件如下两个一直爆红: #include <linux/irq.h> #include <linux ...
- WPF 的 await Application.Current.Dispatcher.InvokeAsync,Func 如果是Task , 等待赋值可能存在没有等待执行完成的问题
最近在检查我们组内的代码,发现好多用到 await Application.Current.Dispatcher.InvokeAsync 相信好多WPF的开发都会用到 该方法做UI线程切换.但是细看里 ...
- 腾讯IMA VS 飞书知识问答:谁才是2025最强AI知识库?
AI创业失败,可私聊经验教训分享... 前几天小伙伴在讨论我开发的一套社群运营AI分身,其本质其实是一套个人知识库的AI产品,其依赖的就是我过往发布的文章. 这类AI聊天分身,最简单.不考虑" ...
- 洛谷 P5066 [Ynoi2014] 人人本着正义之名
洛谷 P5066 [Ynoi2014] 人人本着正义之名 Problem 对一个01序列进行以下\(m\)个操作: 区间覆盖为0 区间覆盖为1 将区间\([l,r-1]\)中的数\(a_i\)同时变为 ...