zoukankan      html  css  js  c++  java
  • BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)

    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

    Solution

    先莫个队,然后对值域开个$bitset$。

    差相等就是$f$并上$f$右移$x$不为$0$。

    和相等就是$f$并上翻转的$f$右移$N-x$位不为$0$。

    积的话就$sqrt$枚举$x$的的因子然后查询存在性就好了。

    Code

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<bitset>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define N (100000)
     8 using namespace std;
     9 
    10 struct Que{int opt,l,r,x,id;}Q[N+1];
    11 int n,m,unit,opt,l,r,x,a[N+1],ID[N+1];
    12 int ans[N+9],Keg[N+9];
    13 bitset<N+1>f,g;
    14 
    15 inline int read()
    16 {
    17     int x=0,w=1; char c=getchar();
    18     while (!isdigit(c)) {if (c=='-') w=-1; c=getchar();}
    19     while (isdigit(c)) x=x*10+c-'0', c=getchar();
    20     return x*w;
    21     
    22 }
    23 
    24 void Ins(int p)
    25 {
    26     if (!Keg[a[p]]) f[a[p]]=1, g[N-a[p]]=1;
    27     ++Keg[a[p]];
    28 }
    29 
    30 void Del(int p)
    31 {
    32     --Keg[a[p]];
    33     if (!Keg[a[p]]) f[a[p]]=0, g[N-a[p]]=0;
    34 }
    35 
    36 bool check(int opt,int x)
    37 {
    38     if (opt==1) return (f&(f>>x)).any();
    39     if (opt==2) return (f&(g>>(N-x))).any();
    40     if (opt==3)
    41     {
    42         for (int i=1; i<=sqrt(x); ++i)
    43             if (x%i==0 && f[i] && f[x/i]) return 1;
    44         return 0;
    45     }
    46 }
    47 
    48 bool cmp(Que a,Que b)
    49 {
    50     if (ID[a.l]==ID[b.l]) return a.r<b.r;
    51     return ID[a.l]<ID[b.l];
    52 }
    53 
    54 int main()
    55 {
    56     n=read(); m=read(); unit=sqrt(n);
    57     for (int i=1; i<=n; ++i) ID[i]=i/unit;
    58     for (int i=1; i<=n; ++i) a[i]=read();
    59     for (int i=1; i<=m; ++i)
    60     {
    61         opt=read(); l=read(); r=read(); x=read();
    62         Q[i]=(Que){opt,l,r,x,i};
    63     }
    64     sort(Q+1,Q+m+1,cmp);
    65     int l=1,r=0;
    66     for (int i=1; i<=m; ++i)
    67     {
    68         while (l<Q[i].l) Del(l++);
    69         while (l>Q[i].l) Ins(--l);
    70         while (r<Q[i].r) Ins(++r);
    71         while (r>Q[i].r) Del(r--);
    72         ans[Q[i].id]=check(Q[i].opt,Q[i].x);
    73     }
    74     for (int i=1; i<=m; ++i) puts(ans[i]?"yuno":"yumi");
    75 }
  • 相关阅读:
    图片轮播插件比较(jquerySlide与superSlide)
    footer贴底的纯css实现方法
    input line-height 兼容解决方案
    HBuilder js 自定义代码块
    HBuilder HTML 自定义代码块
    HBuilder CSS 自定义代码块
    Element-ui el-cascader不触发prop?
    css水平垂直居中
    本地存储时注意的问题
    银行卡号,每四位添加空格
  • 原文地址:https://www.cnblogs.com/refun/p/10453209.html
Copyright © 2011-2022 走看看