zoukankan      html  css  js  c++  java
  • HDU 6183 Color it

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6183

    题意:让你在一个棋盘上涂色,有4种操作

    0:将棋盘清空

    1:在(x,y)点涂上c的颜色

    2:求(1,y1)到(x,y2)上颜色的种类数目

    3:退出

    因为在同一位置的颜色不会相互覆盖,所以考虑建立51棵线段树来维护各种颜色

    之后发现求区间时 有一个x一定为1

    那么如果按y坐标建立线段树,就只需要维护x的最小值就能够判断是否有颜色

    如果区间内最小的x位置都比查询的区间的x大,那一定没有,否则一定有

    因为51棵线段树的空间太大而修改次数不多,所以需要动态开点

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    using namespace std;
    const int N=1e6+5;
    int tree[55],ls[N<<2],rs[N<<2],minn[N<<2],cnt;
    void add(int &i,int l,int r,int k,int val)
    {
        if (i==0)
        {
            i=++cnt;
            minn[i]=val;
        }
        else minn[i]=min(minn[i],val);
        if (l==r) return;
        int mid=(l+r)>>1;
        if (k>mid) add(rs[i],mid+1,r,k,val);
        else add(ls[i],l,mid,k,val);
    }
    int flag;
    void query(int i,int l,int r,int L,int R,int x)
    {
        if (flag||i==0) return;
        if (L<=l&&r<=R)
        {
            if (minn[i]<=x)
                flag=1;
            return;
        }
        int mid=(l+r)>>1;
        if (L<=mid) query(ls[i],l,mid,L,R,x);
        if (R>mid) query(rs[i],mid+1,r,L,R,x);
    }
    int main()
    {
        while(1)
        {
            int opt;
            scanf("%d",&opt);
            int x,y,z;
            int ans;
            switch (opt)
            {
                case 0:
                    memset(tree,0,sizeof(tree));
                    memset(ls,0,sizeof(ls));
                    memset(rs,0,sizeof(rs));
                    cnt=0;
                    break;
                case 1:
                    scanf("%d%d%d",&x,&y,&z);
                    add(tree[z],1,N-5,y,x);
                    break;
                case 2:
                    scanf("%d%d%d",&x,&y,&z);
                    if (y>z) swap(y,z);
                    ans=0;
                    for(int i=0;i<=50;i++)
                    {
                        flag=0;
                        query(tree[i],1,N-5,y,z,x);
                        ans+=flag;
                    }
                    printf("%d
    ",ans);
                    break;
                case 3:
                    return 0;
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    aa
    https php
    字节转换(转载)
    mysql和mariadb中字段拼接类型有两个或多个字段或者一个字段和一个固定字符串拼接
    Qt检测显示器的个数
    QWebEngine自动添加麦克风和摄像头权限
    Qt开启和关闭蓝牙
    cef关闭主窗口并调用CefQuitMessageLoop()后,仍然在后台运行的问题(linux)
    windows安装jq
    Allure2环境准备
  • 原文地址:https://www.cnblogs.com/bk-201/p/7479540.html
Copyright © 2011-2022 走看看