【Codeforces】Gym 101608G WiFi Password 二分+线段树
题意
给定$n$个数,求有最长的区间长度使得区间内数的按位或小于等于给定$v$
二分区间长度,线段树处理出区间或,对每一位区间判断
时间复杂度$O(n\log n \log n)$
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
int t,n,v,a[100005],ans;
int lch[4*N],rch[4*N];
LL seg_or[4*N];
void pushup(int x) {seg_or[x]=seg_or[x<<1]|seg_or[x<<1|1];}
void build(int x,int l,int r) {
lch[x]=l;rch[x]=r;seg_or[x]=0;
if(l==r) {
seg_or[x]=a[l];return;
}
int mid=(l+r)/2;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
int query(int x, int l, int r) {
if(l<=lch[x]&&r>=rch[x]) {return seg_or[x];}
int mid = (lch[x]+rch[x])/2;
if(r<=mid) return query(x<<1,l,r);
else if(l>mid) return query(x<<1|1,l,r);
else return query(x<<1,l,mid)|query(x<<1|1,mid+1,r);
}
bool check(int x) {
for(int i=1;i<=n;++i) {
if(i+x-1<=n&&query(1,i,i+x-1)<=v) { return true; }
}
return false;
}
int main() {
freopen("wifi.in","r",stdin);
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&v);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
build(1,1,n);
int L=1,R=n;ans=0;
while(L<=R) {
int mid=(L+R)/2;
if(check(mid)) {
ans=mid;L=mid+1;
}else {
R=mid-1;
}
}
cout<<ans<<endl;
}
return 0;
}
【Codeforces】Gym 101608G WiFi Password 二分+线段树的更多相关文章
- Codeforces Gym 100513F F. Ilya Muromets 线段树
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
- Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)
Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...
- codeforces 609F. Frogs and mosquitoes 二分+线段树
题目链接 F. Frogs and mosquitoes time limit per test 2 seconds memory limit per test 512 megabytes input ...
- Educational Codeforces Round 61 D 二分 + 线段树
https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...
- J - Joseph and Tests Gym - 102020J (二分+线段树)
题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高 ...
- HDU4614 Vases and Flowers 二分+线段树
分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- hdu6070 Dirt Ratio 二分+线段树
/** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
随机推荐
- 撸代码--linux进程通信(基于共享内存)
1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候 ...
- C++一元多项式相加
实验名称:一元多项式相加 // multiply.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream& ...
- C++中全局变量如何使用
运行文件的小技巧:包含2个.CPP和一个.H文件,必须一个.CPP一个.H一一对应.且C++中,只能运行一个项目,要想在多个文件中(.cpp)运行一个.cpp必须建立多个项目,或者将不允许运行的文件从 ...
- 应用程序之TableView简单总结1
UITableView的代理方法 修改Cell的状态 UITableView常见方法 一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableVi ...
- java GC(Garbage Collector) | System.gc()
http://win.sy.blog.163.com/blog/static/94197186201151093543556/ Java垃圾回收调优
- 循环时的dom操作
<body> <div id="resText"></div> <div id="reshtml"></d ...
- dm8148 videoM3 link源代码解析
样例:从A8送一帧jpeg图片到videoM3解码,然后在将解码的数据传递到A8, 这个流程涉及的link源代码例如以下: dm8148 link之间数据传递 1)在A8上调用IpcBitsOutLi ...
- 六种基本DCDC变换器拓扑结构
1.SEPIC电路 2.
- Atom 编辑器使用和学习
事先准备:下载 Github 开源文本编辑器 Atom,并安装Atom 官网 | 搜索 “Atom下载” 常用快捷键:http://blog.csdn.net/hunyxv/article/detai ...
- js 组合键监听ctrl + enter
$(window).keydown(function (event) { // 监听esc键退出全屏 if (event.keyCode == 27) { } // 监听 Ctrl + Enter 可 ...