Data Structure

题目描述

将一个非负整数序列划分为 \(K\) 段,分别计算出各段中的整数按位或的结果,然后再把这些结果按位与起来得到一个最终结果,把这个最终结果定义为这个序列的一个 \(K−or−and\) 值。

比如序列为 \([1,5,9,2],K=2\),如果划分为 \([1,5],[9,2]\),那么 \(K−or−and\) 值为 \((1or5)and(9or2)=1\)。当然划分可能不止一种,所以 \(K−or−and\) 值也可能不止一个。

给定一个长度为 \(N\) 的非负整数序列 \(A_1A_2A_3\dots A_N\),一个整数 \(K\) 和以下三种操作:

  1. 给定一个整数 \(x\) ,把序列中的所有数字按位或上 \(x\)。即\(\forall i\in [1,N],A_i=A_i \ or \ x\)。

  2. 给定一个整数 \(x\),把序列中的所有数字按位与上 \(x\)。即\(\forall i\in [1,N],A_i=A_i \ and \ x\)。

  3. 查询当前序列最大的 \(K−or−and\) 值。

lililalala太菜了,他希望你来帮他解决这个问题。

输入描述:

第一行两个整数 \(N,K(1\le K\le N\times 2\times 10^5)\) -序列长度和划分的段数。

第二行 \(N\)个整数 \(A_1A_2A_3\dots A_N( 0\le A_1,A_2,A_3\dots A_N<2^{31})\)。

第三行一个整数 \(Q(1\le Q\le 2\times 10^5)\)--操作的数量。

然后 \(Q\) 行其中第 \(i\)行为以下三种格式之一:

\(1x_i\)--把序列中的所有数字按位或上 \(x_i(0\le x_i<2^{31})\)。

\(2x_i\)--把序列中的所有数字按位与上 \(x_i(0\le x_i<2^{31})\)。

\(3\)--查询当前序列最大的 \(K−or−and\) 值。

输出描述:

对于每次查询(操作 \(3\) )输出一行一个整数作为查询结果。


昨天晚上云做题,看了看C和D

然后成功嘴巴出做法,但是一直wa,今天顺手改一改,C比较简单,不管了

先不管修改,我们直接看看怎么求原序列的答案

显然可以按位贪心

如果我们可以确定高\(i\)位的答案为\(ans\),那么考虑\(i+1\)位是否可以取\(1\),可以直接贪心考虑

从左到右扫\(A\)数组,如果当前前缀异或值\(x\)可以拼出高\(i+1\)位的所有\(1\),就搞一个分割。

这样显然可以最大化分割。

然后复杂度\(n \log A_i\)

考虑操作每次会把所有的某一位取\(0\)或者\(1\),如果某一维被取过,这一位就不用管了。

发现这样最多有\(\log A_i\)个位被第一次全部取\(0\)或者\(1\)

那么直接每次暴力就好了

复杂度\(O(n\log^2 A)\)


Code:

#include <cstdio>
#include <cctype>
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
const int N=2e5+10;
int yuy[32],a[N];
int n,k,Q,ans;
void getans()
{
ans=0;
for(int j=30;~j;j--)
{
if(yuy[j]!=-1) continue;
int cnt=0,x=0;
ans|=1<<j;
for(int i=1;i<=n;i++)
{
x|=a[i];
if((ans&x)==ans) ++cnt,x=0;
}
if(cnt<k) ans^=1<<j;
}
for(int j=0;j<=30;j++)
{
if(yuy[j]==1)
ans|=1<<j;
else if(yuy[j]==0)
ans&=~(1<<j);
}
}
int main()
{
read(n),read(k);
for(int i=1;i<=n;i++) read(a[i]);
for(int j=0;j<=30;j++) yuy[j]=-1;
getans();
read(Q);
for(int op,x,i=1;i<=Q;i++)
{
read(op);
int flag=0;
if(op==1)
{
read(x);
for(int j=30;~j;j--)
if(x>>j&1)
{
if(yuy[j]==-1) flag=1;
yuy[j]=1;
}
if(flag) getans();
}
else if(op==2)
{
read(x);
for(int j=30;~j;j--)
if(!(x>>j&1))
{
if(yuy[j]==-1) flag=1;
yuy[j]=0;
}
if(flag) getans();
}
else
printf("%d\n",ans);
for(int j=0;j<=30;j++)
{
if(yuy[j]==1)
ans|=1<<j;
else if(yuy[j]==0)
ans&=~(1<<j);
}
}
return 0;
}

2019.5.4

牛客 某练习赛 Data Structure的更多相关文章

  1. 牛客网练习赛23 F 托米的游戏

    链接:https://www.nowcoder.com/acm/contest/156/F 来源:牛客网 题目描述 题目背景编不下去了 托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一 ...

  2. 牛客网练习赛28A

    题目链接:https://www.nowcoder.com/acm/contest/200/A 链接:https://www.nowcoder.com/acm/contest/200/A来源:牛客网 ...

  3. 牛客网练习赛18 A 【数论/整数划分得到乘积最大/快速乘】

    链接:https://www.nowcoder.com/acm/contest/110/A 来源:牛客网 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积 ...

  4. 牛客网练习赛26B(简单的dp)

    题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B来源:牛客网 ...

  5. 牛客网练习赛34-D-little w and Exchange(思维题)

    链接:https://ac.nowcoder.com/acm/contest/297/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 牛客网练习赛25 C 再编号

    链接:https://www.nowcoder.com/acm/contest/158/C来源:牛客网 定义对 a 的再编号为 a' ,满足 . 现在有 m 次询问,每次给定 x,t ,表示询问经过 ...

  7. 牛客网练习赛t2(线段树)

    题解: 好像因为他说了 数据范围全部在ll以内 所以直接暴力就可以过了 比较正常是用线段树来维护 洛谷上有道模板题是支持加,乘,区间和 而这题还多了区间平方和的操作 按照那题的操作 我们维护的时候保证 ...

  8. 牛客网练习赛7-B-购物

    在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元. 现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖 ...

  9. 牛客网练习赛7-D-无向图(bfs,链式前向星)

    题意:中文题: 思路:就是找某个点距离其他点的距离,他给你很多点也无所谓.用一个dist[]数组,这个数组保存的是他给你的点到其他点的最短距离且标记的作用,然后bfs搜索就行了. 代码: #inclu ...

随机推荐

  1. 【Http】队头阻塞(Head of line blocking)多路复用(Multiplexing)

        图中第一种请求方式,就是单次发送request请求,收到response后再进行下一次请求,显示是很低效的. 于是http1.1提出了管线化(pipelining)技术,就是如图中第二中请求方 ...

  2. TopCoder - 15135 LongPalindromes

    https://vjudge.net/problem/TopCoder-15135 之前做过:本质不同的回文子序列个数 本题:位置不同即为不同. 如果还是设$f[l][r]$表示$l$,$r$结尾,就 ...

  3. objective-c: Functions and static keyword

    Functions function is a concept for C programming language, objective-c is entirely relies on C. To ...

  4. Mosaic

    Mosaic 是最古老的WEB浏览器,这是个套件FOR WINDOWS(包括TCP/IP,拨号,EMAIL等).

  5. NIO浅析(一)

    一:NIO与IO的区别 1.NIO面对的是缓冲区,IO面对的是流 2.NIO是非阻塞的,IO是阻塞的 3.NIO中引入了选择器 二:既然NIO面对的是缓冲区,那就先来了解缓冲区 1.NIO中Buffe ...

  6. python3_列表排序简介

    说明:以下是以整数排列为例,其它数据类型读者自行思考即可知. 1.使用方法sort()对列表排序 使用格式:(注:说到方法,在列表中都是列表名.方法名()的使用格式,之后不在赘述.) 列表名.sort ...

  7. ZJUT11 多校赛补题记录

    牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...

  8. java多线程学习笔记(三)

    java多线程下的对象及变量的并发访问 上一节讲到,并发访问的时候,因为是多线程,变量如果不加锁的话,会出现“脏读”的现象,这个时候需要“临界区”的出现去解决多线程的安全的并发访问.(这个“脏读”的现 ...

  9. HBase优化——读写优化

    Hbase2.0查询优化 1)设置scan缓存 HBase中Scan查询可以设置缓存,方法是setCaching(),这样可以有效的减少服务端与客户端的交互,更有效的提升扫描查询的性能. Scan s ...

  10. Neo4j高级应用技术专题系列 - APOC存储过程库-【1】概述

    Neo4j高级应用技术专题系列 - APOC存储过程库-[1]概述 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://bl ...