首页 > 其他分享 >P1558 色板游戏

P1558 色板游戏

时间:2024-01-15 19:01:22浏览次数:34  
标签:node lazy who end 游戏 int 色板 st P1558

原题链接

题解1,种30棵树,每棵树代表每种颜色,树的每个节点代表这个颜色在对应区间上是否存在

code

#include<bits/stdc++.h>
using namespace std;
int st[32][400005]={0};
int lazy[32][400005]={0};

void pushdown(int who,int node)
{
    st[who][node*2]=lazy[who][node];
    lazy[who][node*2]=lazy[who][node];
    st[who][node*2+1]=lazy[who][node];
    lazy[who][node*2+1]=lazy[who][node];
    lazy[who][node]=-1;
}

void tuse(int node,int start,int end,int l,int r,int who,int val)
{
    if(start>r||end<l)return;

    if(start>=l&&end<=r)
    {
        st[who][node]=val;
        lazy[who][node]=val;
        return;
    }

    if(lazy[who][node]!=-1) pushdown(who,node);

    int mid=(start+end)/2;
    tuse(2*node,start,mid,l,r,who,val);
    tuse(2*node+1,mid+1,end,l,r,who,val);
    st[who][node]=st[who][node*2]||st[who][node*2+1];
}

int query(int node,int start,int end,int l,int r,int who)
{
    if(start>r||end<l)return 0;
    if(start>=l&&end<=r) return st[who][node];

    if(lazy[who][node]!=-1) pushdown(who,node);

    int mid=(start+end)/2;
    return query(node*2,start,mid,l,r,who)|query(node*2+1,mid+1,end,l,r,who);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int l,t,o;
    cin>>l>>t>>o;
    for(int i=1;i<=4*(l+1);i++) st[1][i]=1;
    memset(lazy,-1,sizeof lazy);
    while(o--)
    {
        char op;
        int x,y;
        cin>>op>>x>>y;
        if(y<x)swap(x,y);
        if(op=='C')
        {
            int k;
            cin>>k;
            for(int i=1;i<=t;i++)
            {
                if(k!=i)tuse(1,1,l,x,y,i,0);
                else tuse(1,1,l,x,y,i,1);
            }
        }
        else
        {
            int ans=0;
            for(int i=1;i<=t;i++) if(query(1,1,l,x,y,i)) ans++;
            cout<<ans<<"\n";
        }
    }
    return 0;
}

题解2:一棵树,树的每个节点用二进制表示,01代表对应二进制位的颜色是否在这个区间上存在

code

#include<bits/stdc++.h>
using namespace std;
int st[400005]={0};
int lazy[400005]={0};
int a[35]={0,1};
void pushdown(int node)
{
    st[node]=lazy[node];//lazy代表该节点应该修改的值
    lazy[node*2]=lazy[node];
    lazy[node*2+1]=lazy[node];
    lazy[node]=0;
}

void tuse(int node,int start,int end,int l,int r,int val)
{
    if(lazy[node])  pushdown(node);

    if(start>r||end<l)  return;

    if(start>=l&&end<=r)
    {
        st[node]=a[val];//涂色后,其子节点附加延迟效果
        lazy[node*2]=a[val];
        lazy[node*2+1]=a[val];
        return;
    }

    int mid=(start+end)/2;
    tuse(2*node,start,mid,l,r,val);
    tuse(2*node+1,mid+1,end,l,r,val);
    st[node]=st[node*2]|st[node*2+1];//由于其区间被部分修改,所以需要重新计算,而若存在其子节点的延迟修改,那么这个点也早已被计算过了
}

int query(int node,int start,int end,int l,int r)
{
    if(lazy[node]) pushdown(node);//要修改也只是修改延迟效果的值

    if(start>r||end<l) return 0;

    if(start>=l&&end<=r) return st[node];

    int mid=(start+end)/2;
    return query(node*2,start,mid,l,r)|query(node*2+1,mid+1,end,l,r);//查询的是对应区间上的值,而不应修改非该区间的值
}

int finds(int now)
{
    int ans=0;
    while(now)
    {
        if(now&1)ans++;
        now>>=1;
    }
    return ans;
}
int main()
{
    for(int i=2;i<=30;i++)a[i]=a[i-1]<<1;
    ios::sync_with_stdio(false);
    cin.tie(0);
    int l,t,o;
    cin>>l>>t>>o;
    for(int i=1;i<=4*l;i++) st[i]=1;
    while(o--)
    {
        char op;
        int x,y;
        cin>>op>>x>>y;
        if(y<x)swap(x,y);
        if(op=='C')
        {
            int k;
            cin>>k;
            tuse(1,1,l,x,y,k);
        }
        else cout<<finds(query(1,1,l,x,y))<<endl;
    }
    return 0;
}

标签:node,lazy,who,end,游戏,int,色板,st,P1558
From: https://www.cnblogs.com/pure4knowledge/p/17966057

相关文章

  • 微信抖音小游戏《黄金矿工》案例详解
      微信小游戏,抖音小游戏,非常适合个人开发者创业,不用版号,门槛低,同时抖音小游戏的系统算法推荐,能让好的游戏脱颖而出, 你要做的就是把游戏做好就可以了。    这个系列的文章,配套了视频教程讲解与课程资源,课程源码。下面开始讲解黄金矿工的具体制作流程。  1:开发工具......
  • 数字生成游戏
    数字生成游戏题目描述小明完成了这样一个数字生成游戏,对于一个不包含的数字来说,有以下种生成新的数的规则:将的任意两位对换生成新的数字,例如可以生成;将的任意一位删除生成新的数字,例如可以生成;在的相邻两位之间之间插入一个数字,需要满足。例如可以生成,但......
  • 使用 Python 和 Pygame 制作游戏:第六章到第八章
    第六章:贪吃虫原文:inventwithpython.com/pygame/chapter6.html译者:飞龙协议:CCBY-NC-SA4.0    如何玩贪吃虫贪吃虫是Nibbles的克隆。玩家开始控制一个不断在屏幕上移动的短蠕虫。玩家无法停止或减慢蠕虫,但他们可以控制它转向的方向。红苹果随机出现在屏幕上,玩家必......
  • 使用 Python 和 Pygame 制作游戏:第九章到第十章
    第九章:推星星原文:inventwithpython.com/pygame/chapter9.html译者:飞龙协议:CCBY-NC-SA4.0         如何玩推星星推星星是Sokoban或“箱子推动者”的克隆。玩家位于一个房间,里面有几颗星星。房间中的一些瓷砖精灵上有星星标记。玩家必须想办法将星星推到有星......
  • leetcode 跳跃游戏
    classSolution{public:boolcanJump(vector<int>&nums){intn=nums.size();intcurrent_length=nums[0];if(n==1)returntrue;if(current_length==0)returnfalse;for(inti=1;i<n;i......
  • 三国游戏
    三国游戏题目小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X,Y,Z(一开始可以认为都为0)。游戏有n个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第i个事件发生时会分别让X,Y,Z增加\(A_i,B_i,Ci\)。当游戏结束时(所有事件的发......
  • python | 小游戏 开局托儿所 自动化脚本 pyautogui
    小游戏开局托儿所自动化脚本pyautogui纯sb游戏,我脚本都不是总能上100分。当然,跟我算法不是最优肯定也有关系。别玩这游戏,纯浪费时间。好久不写这种带算法的代码了,调了半天。importpyautoguideflike(boxa,boxb): ifabs(boxa.top-boxb.top)<10andabs(boxa.left-box......
  • 2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能
    2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能,每一个技能会有一个伤害,同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害,每一个技能最多只能释放一次,已知怪物有m点血量。现在想问你最少用几个技能能消灭掉他(血量小于等于0)。技能的数量是n,怪物的血......
  • 2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能
    2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能,每一个技能会有一个伤害,同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害,每一个技能最多只能释放一次,已知怪物有m点血量。现在想问你最少用几个技能能消灭掉他(血量小于等于0)。技能的数量是n,怪......
  • 案例分享:游戏行业各岗位的KPI绩效指标制定
    在游戏行业中,岗位种类繁多,每个岗位的职责和要求都有所不同。因此,制定合理的KPI(关键绩效指标)是确保团队高效运作的关键。在竞争激烈的市场环境中,合理的KPI不仅有助于员工明确工作方向,还能促进团队的高效协作。本文将深入探讨游戏行业中策划、美术、程序、运营、测试、市场营销和客......