zoukankan      html  css  js  c++  java
  • [BZOJ]4810: [Ynoi2017]由乃的玉米田

    Time Limit: 30 Sec  Memory Limit: 256 MB

    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维护权值,操作一直接右移再与一下,操作二多维护一个-ai的bitset就变成操作一了,操作三$O(sqrt{x})$暴力相信大家都会,总复杂度$O(nsqrt{n}+n^2/32)$。

    Code

    #include<cstdio>
    #include<algorithm>
    #include<bitset>
    using namespace std;
    inline int read()
    {
        int x;char c;
        while((c=getchar())<'0'||c>'9');
        for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=x*10+c-'0';
        return x;
    }
    #define MN 100000
    #define K 350
    struct query{int k,l,r,x,t;}q[MN+5];
    bool cmp(query a,query b){return a.l/K==b.l/K?a.r<b.r:a.l<b.l;}
    bitset<MN+1> s1,s2;
    int a[MN+5],u[MN+5],t[MN+5],ans[MN+5];
    void change(int x)
    {
        if(u[x]^=1){if(!t[a[x]]++)s1[a[x]]=s2[MN-a[x]]=1;}
        else if(!--t[a[x]])s1[a[x]]=s2[MN-a[x]]=0;
    }
    int main()
    {
        int n,m,i,j,l=1,r=0;
        n=read();m=read();
        for(i=1;i<=n;++i)a[i]=read();
        for(i=1;i<=m;++i)q[i].k=read(),q[i].l=read(),q[i].r=read(),q[i].x=read(),q[i].t=i;
        sort(q+1,q+m+1,cmp);
        for(i=1;i<=m;++i)
        {
            while(l<q[i].l)change(l++);
            while(l>q[i].l)change(--l);
            while(r<q[i].r)change(++r);
            while(r>q[i].r)change(r--);
            if(q[i].k==1)ans[q[i].t]=(s1&(s1<<q[i].x)).count();
            if(q[i].k==2)ans[q[i].t]=(s2&(s1<<MN-q[i].x)).count();
            if(q[i].k==3)for(j=1;j*j<=MN;++j)ans[q[i].t]|=q[i].x%j==0&&s1[j]&&s1[q[i].x/j];
        }
        for(i=1;i<=m;++i)puts(ans[i]?"yuno":"yumi");
    }
  • 相关阅读:
    Backtrader中文笔记之CSV Data Feed Development-General
    Backtrader中文笔记之CSV Data Feed Filters
    Backtrader中文笔记之CSV Data Feed Development
    Backtrader中文笔记之Extending a Datafeed
    Backtrader中文笔记之Data Feeds
    discuz功能列表
    phpcms功能列表
    empireCMS 帝国cms功能总结
    ecshop功能目录
    织梦所有功能导航列表介绍
  • 原文地址:https://www.cnblogs.com/ditoly/p/BZOJ4810.html
Copyright © 2011-2022 走看看