区间操作考虑用线段树维护。

建\(n*2\)棵线段树,前\(n\)棵线段树维护每个串的第i位是否是0。

后\(n\)棵线段树维护每个串的第i位是否是1。

如果是问号的话,直接跳过就好(通过1和0能看出是否是问号)。

然后分三种情况统计答案:

1.有1也有0,不可能,\(ans=0\)

2.只有1或0,一种情况,\(ans\)不变。

3.既没有0也没有1,两种情况\(ans*=2\)

像这样这棵线段树。

但是这样会很慢。

考虑状压。

这样只用开两棵线段树,一个存零,一个存一。

把状态压缩成一个\(int\),最多30位,转换成十进制\(int\)能存下。

然后的建树、查询、更改操作其实就是类似一个模板。

建树:

void build(int hao,int l,int r)
{
if(l==r)
{
for(int i=1;i<=n;i++)
{
if(s[l][i]=='?')//问号跳过
{
continue;
}
flag[hao][s[l][i]-'0']|=(1<<(i-1));//状压
}
return;
}
int mid=(l+r)/2;
build(hao<<1,l,mid);
build(hao<<1|1,mid+1,r);
flag[hao][0]=flag[hao<<1][0]|flag[hao<<1|1][0];
flag[hao][1]=flag[hao<<1][1]|flag[hao<<1|1][1];
}

查询:

data query(int hao,int l,int r,int L,int R)
{
if(L<=l&&R>=r)
{
return (data){flag[hao][0],flag[hao][1]};
}
int mid=(l+r)/2;
data kkk=none;
if(L<=mid)
{
kkk=kkk+query(hao<<1,l,mid,L,R);
}
if(R>mid)
{
kkk=kkk+query(hao<<1|1,mid+1,r,L,R);
}
return kkk;
}

我们这里返回一个data的量,以便于后面计算答案。

计算答案的主程序:

    scanf("%d%d",&l,&r);
data ans=query(1,1,m,l,r);
anss=1;
for(int i=1;i<=n;i++)//只有1或0的方案数只有一种
{
if(ans.x&1&&ans.y&1)//第i位既有1又有0,不可能。
{
anss=0;
break;
}
if(!(ans.x&1)&&!(ans.y&1))//都是问号
{
anss*=2;
}
ans.x>>=1;
ans.y>>=1;
}
ansss^=anss;

更改:

void change(int hao,int l,int r,int x)
{
if(l==r)
{
flag[hao][0]=flag[hao][1]=0;//单点修改
for(int i=1;i<=n;i++)
{
if(ch[i]=='?')
{
continue;
}
flag[hao][ch[i]-'0']|=(1<<(i-1));
}
return;
}
int mid=(l+r)/2;
if(x<=mid)
{
change(hao<<1,l,mid,x);
}else{
change(hao<<1|1,mid+1,r,x);
}
flag[hao][0]=flag[hao<<1][0]|flag[hao<<1|1][0];
flag[hao][1]=flag[hao<<1][1]|flag[hao<<1|1][1];
}

最后就把这些函数结合在一起就可以了。

#include<bits/stdc++.h>
#define N 400010
using namespace std;
int flag[N<<2][2],n,m,q,op,ansss,l,r,anss;
char s[N][41],ch[41];
struct data
{
int x,y;
}none;
data operator +(data a,data b)
{
return (data){a.x|b.x,a.y|b.y};
}
void build(int hao,int l,int r)
{
if(l==r)
{
for(int i=1;i<=n;i++)
{
if(s[l][i]=='?')//问号跳过
{
continue;
}
flag[hao][s[l][i]-'0']|=(1<<(i-1));//状压
}
return;
}
int mid=(l+r)/2;
build(hao<<1,l,mid);
build(hao<<1|1,mid+1,r);
flag[hao][0]=flag[hao<<1][0]|flag[hao<<1|1][0];
flag[hao][1]=flag[hao<<1][1]|flag[hao<<1|1][1];
}
data query(int hao,int l,int r,int L,int R)
{
if(L<=l&&R>=r)
{
return (data){flag[hao][0],flag[hao][1]};
}
int mid=(l+r)/2;
data kkk=none;
if(L<=mid)
{
kkk=kkk+query(hao<<1,l,mid,L,R);
}
if(R>mid)
{
kkk=kkk+query(hao<<1|1,mid+1,r,L,R);
}
return kkk;
}
void change(int hao,int l,int r,int x)
{
if(l==r)
{
flag[hao][0]=flag[hao][1]=0;//单点修改
for(int i=1;i<=n;i++)
{
if(ch[i]=='?')
{
continue;
}
flag[hao][ch[i]-'0']|=(1<<(i-1));
}
return;
}
int mid=(l+r)/2;
if(x<=mid)
{
change(hao<<1,l,mid,x);
}else{
change(hao<<1|1,mid+1,r,x);
}
flag[hao][0]=flag[hao<<1][0]|flag[hao<<1|1][0];
flag[hao][1]=flag[hao<<1][1]|flag[hao<<1|1][1];
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;i++)
{
scanf("%s",s[i]+1);
}
build(1,1,m);
for(int i=1;i<=q;i++)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d%d",&l,&r);
data ans=query(1,1,m,l,r);
anss=1;
for(int i=1;i<=n;i++)//只有1或0的方案数只有一种
{
if(ans.x&1&&ans.y&1)//第i位既有1又有0,不可能。
{
anss=0;
break;
}
if(!(ans.x&1)&&!(ans.y&1))//都是问号
{
anss*=2;
}
ans.x>>=1;
ans.y>>=1;
}
ansss^=anss;
}else{
scanf("%d%s",&l,ch+1);
change(1,1,m,l);
}
}
printf("%d\n",ansss);
return 0;
}

洛谷P5522 【[yLOI2019] 棠梨煎雪】的更多相关文章

  1. P5522 [yLOI2019] 棠梨煎雪

    updata on 2020.3.19 今天把博客从洛谷往博客园搬,图炸了 其实早就发现了,懒得管 那图其实就是一个用dev自带的调试功能调试时,RE了的报错 当时觉得很奇怪看不出是啥,现在再看已经觉 ...

  2. 【线段树】【P5522】[yLOI2019] 棠梨煎雪

    C [yLOI2019] 棠梨煎雪 Background 岁岁花藻檐下共将棠梨煎雪 自总角至你我某日辗转天边 天淡天青 宿雨沾襟 一年一会信笺却只见寥寥数言 --银临<棠梨煎雪> Desc ...

  3. 【6.24校内test】T3 棠梨煎雪

    [题目背景] 岁岁花藻檐下共将棠梨煎雪. 自总角至你我某日辗转天边. 天淡天青,宿雨沾襟. 一年一会信笺却只见寥寥数言. ——银临<棠梨煎雪> [问题描述] 扶苏正在听<棠梨煎雪&g ...

  4. 6.25考试整理:江城唱晚&&不老梦&&棠梨煎雪——题解

    按照旧例,先安利一下主要作者:一扶苏一 以及扶苏一直挂念的——银临姐姐:银临_百度百科 (滑稽) 好哒,现在步入正题: 先看第一题: 题解: 在NOIP范围内,看到“求方案数”,就说明这个题是一个计数 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. 大家久等了,改造版阿里巴巴 sentinel 控制台终于开源了

    前言 最近几天,好几个小伙伴在后台询问,改造后的 sentinel-dashboard 什么时候开源.讲真,不是不想给大家放出来,是因为一些地方还没有完善好,怕误导了大家,在经过了一个星期业余时间的努 ...

  2. 怎样实现给DEDE5.7的栏目增加栏目图片

    前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自己实际做的时候的方法,下面详细描述下具体的实现方式(只测试了V5.7版本,对低版本是否适用 ...

  3. _self.$scopedSlots.default is not a function报错

    问题: 当同一页面有elementUI的多个table表格时,如果用到v-if来动态展示表格,切换时出现如下报错: 原因: 是因为表格是element-ui通过循环产生的,而vue在dom重新渲染时有 ...

  4. JavaSE----01.Java简介

    01.Java简介 1.java介绍     Java是于1995年由Sun公司推出的一种跨平台.面向对象的高级程序设计语言.Java最初的名字叫OAK.Java是一种通过解释方式来执行的语言,其语法 ...

  5. XCTF-Misc

    最近无聊在做一下杂项,随便总结一下关于杂项的知识. 一. xcaliflag 这个直接拖进stegsolve里面,大约是在Blue的第3位左右就很清楚了 二.

  6. [JLOI2014]天天酷跑

    请允许我对记忆化搜索进行一个总结,我认为所有的搜索只要数据范围允许,都可以转化为记忆化搜索, 只是,用处的多与少的关系,其本身是求出设出状态之后,为求出当前状态进行递推(搜索),推到 已知状态,之后再 ...

  7. UVA - 12099 The Bookcase

    No wonder the old bookcase caved under the massive piles of books Tom had stacked on it. He had bett ...

  8. 尹吉峰:使用 OpenResty 搭建高性能 Web 应用

    2019 年 8 月 31 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·成都站,原贝壳找房基础架构部工程师尹吉峰在活动上做了<使用 O ...

  9. Django中CKEditor富文本编译器的使用

    CKEditor富文本编辑器 1. 安装 pip install django-ckeditor 2. 添加应用 在INSTALLED_APPS中添加 INSTALLED_APPS = [ ... ' ...

  10. JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记

    2018年5月份开始在JZ2440上陆续移植了u-boot-2016.11.u-boot-spl-2016.11.linux-4.17和busybox-1.28.4,其中linux-4.17和busy ...