4810: [Ynoi2017]由乃的玉米田

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 1090  Solved: 524
[Submit][Status][Discuss]

Description

由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美。这排玉米一共有N株,它们的高度参差不齐。
由乃认为玉米田不美,所以她决定出个数据结构题
 
这个题是这样的:
给你一个序列a,长度为n,有m次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是
否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别为操作1,2,3选出的这两个数可以是同一个位置的数

Input

第一行两个数n,m
后面一行n个数表示ai
后面m行每行四个数opt l r x
opt表示这个是第几种操作,l,r表示操作的区间,x表示这次操作的x
定义c为每次的x和ai中的最大值,ai >= 0,每次的x>=2n,m,c <= 100000

Output

对于每个询问,如果可以,输出yuno,否则输出yumi

Sample Input

5 5

1 1 2 3 4

2 1 1 2

1 1 2 2

3 1 1 1

3 5 5 16

1 2 3 4

Sample Output

yuno

yumi

yuno

yuno

yumi

HINT

 

Source

[Submit][Status][Discuss]

题解:
         //对于bitset来说,空间大一倍一意味着时间打一倍;
         //所以能小尽量小,(感谢bzoj的老爷机让我发现了这一点)
         对于一个区间,

bitset维护x和最大值-x,可以通过左移和右移查询x+y和x-y

根号枚举因子可以查询x*y;
         多个区间由于空间问题所以使用莫队优化空间,时间要付出一个根号;
         //注意bitset右移长度为负数的话似乎会出事。。。。。。
         $O(M\sqrt{M} + \frac{CM}{64} )$
         20181101

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<bitset>
#define il inline
#define rg register
#define Run(i,l,r) for(rg int i=l;i<=r;i++)
#define Don(i,l,r) for(rg int i=l;i>=r;i--)
#define ll long long
#define ld long double
#define inf 0x3f3f3f3f
using namespace std;
const int N= ;//, mx=100000;
il char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=; char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
int n,m,a[N],num[N],ans[N],bl[N],mx;
struct data{
int l,r,op,x; int id;
il bool operator <(const data&A)const{
return bl[l]==bl[A.l]?r<A.r:l<A.l;
}
}Q[N];
bitset<N>f1,f2;
il void upd(int x,int y){
if(!num[x]&&y==)f1.set(x),f2.set(mx-x);//f1[x]=f2[mx-x]=1;
num[x]+=y;
if(!num[x]&&y==-)f1.reset(x),f2.reset(mx-x);//f1[x]=f2[mx-x]=0;
}
il bool ask(int op,int x){
if(op==){
return ((f1>>x)&f1).count();
}else if(op==){
return (f1&(f2>>(mx-x))).count();
}else {
for(int i=;i*i<=x;i++){
if(x%i==&&f1.test(i)&&f1.test(x/i)){
return true;
}
}
return false;
}
}
int main(){
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
n=rd(); m=rd();
int u=*sqrt(n+0.5);
Run(i,,n)a[i]=rd(),bl[i]=i/u+,mx=max(mx,a[i]);
Run(i,,m){
Q[i].op=rd(); Q[i].l=rd(); Q[i].r=rd(); Q[i].x=rd(); Q[i].id=i;
mx = max(Q[i].x,mx);
}
sort(Q+,Q+m+);
for(rg int i=,l=,r=;i<=m;i++){
while(l>Q[i].l)upd(a[--l],);
while(r<Q[i].r)upd(a[++r],);
while(l<Q[i].l)upd(a[l++],-);
while(r>Q[i].r)upd(a[r--],-);
ans[Q[i].id] = ask(Q[i].op,Q[i].x);
}
for(rg int i=;i<=m;i++){
puts(ans[i]?"yuno":"yumi");
}
return ;
}//by tkys_Austin;

【bzoj4810】【ynoi2018】由乃的玉米田的更多相关文章

  1. bzoj4810 [Ynoi2017]由乃的玉米田

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题   这个题是这样的: 给你一 ...

  2. LuoguP3674 小清新人渣的本愿 && BZOJ4810: [Ynoi2017]由乃的玉米田

    题目地址 小清新人渣的本愿 [Ynoi2017]由乃的玉米田 所以这两题也就输出不一样而已 题解 这种lxl的题还是没修改操作的题基本就是莫队 分开考虑每个询问 1.减法 \(a-b=x⇒a=b+x\ ...

  3. BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题   这个题是这样的: 给你一 ...

  4. bzoj4810 [Ynoi2017]由乃的玉米田 bitset优化+暴力+莫队

    [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 917  Solved: 447[Submit][Status][Di ...

  5. BZOJ4810 Ynoi2017由乃的玉米田(莫队+bitset)

    多组询问不强制在线,那么考虑莫队.bitset维护当前区间出现了哪些数,数组记录每个数的出现次数以维护bitset.对于乘法,显然应有一个根号范围内的因子,暴力枚举即可.对于减法,a[i]-a[j]= ...

  6. 【bzoj4810】由乃的玉米田

    lxl丧心病狂-- 首先允许离线的区间询问一看就是莫队.那么我们看下怎么莫队? 不会. "由乃题多半是不可做的."于是我看了下题解--好吧果然是bitset 用bitset维护当前 ...

  7. bzoj4810 [Ynoi2017]由乃的玉米田 莫队+bitset(+数论)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4810 题解 看数据范围和题目名字应该是根号算法. 因为询问除了区间外,还有第 \(3\) 个参 ...

  8. 【BZOJ4810】[Ynoi2017]由乃的玉米田 bitset+莫队

    [BZOJ4810][Ynoi2017]由乃的玉米田 Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.由乃认为玉米田不美,所 ...

  9. 【bzoj4810】[Ynoi2017]由乃的玉米田 莫队算法+STL-bitset

    题目描述 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n ...

随机推荐

  1. java.lang.Boolean.valueOf(String s)

    简单说,就是s为true(这四个字母大小写任意)时,返回值为true,否则为false public class one { public static void main(String[] args ...

  2. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  3. Qt 链接报错 version `Qt_5' not found

    问题: 在Ubuntu 上发布软件包的时候,复制链接库的时候出现Qt 版本找不到的情况: ./libqxcb.so: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so ...

  4. Java跨平台的实现原理

    不同操作系统支持的指令集有所差异,只要在不同操作系统上安装对应的jvm,jvm负责把Java字节码翻译成对应机器的二进制码,从而实现java语言的跨平台.

  5. Focalprice李培亮:梦想让人在我店里排队

    [亿邦动力网讯]4月3日消息,外贸B2C平台Focalprice总裁李培亮日前亮相亿邦动力网联合河南省商务厅举办的“第九届中国中小企业电子商务大会暨2014中国(河南)跨境贸易电子商务峰会”,表达自己 ...

  6. 遗传算法框架GAFT优化小记

    前言 前段时间一直在用自己写的遗传算法框架测试算法在优化力场参数的效果,但是跑起来效率很慢,因为适应度函数需要调用多次力场程序计算能量,但是还是比我预想中的慢我也没有及时对程序进行profiling和 ...

  7. java 不同数据类型的相互转化

    在工作中经常会遇到需要将数据类型转化的情况,今天抽出时间总结一下. date——string Date date = new Date(); DateFormat dateformat = new S ...

  8. JDK,JRE,JVM之间的关系

    JDK包括JRE包括JVM http://java-mzd.iteye.com/blog/838514

  9. resx文件引用

    应用场景: 自己在编写双语界面的时候,用到两种语言表. 引用如下: LocRM = new ResourceManager("TMI_E.words_" + lang.ToLowe ...

  10. flask验证登录学习过程(1)---实践flask_jwt

    flask_jwt应用代码: from flask import Flask from flask_jwt import JWT,jwt_required,current_identity from ...