1. 程式人生 > >洛谷1558 色板遊戲 線段樹

洛谷1558 色板遊戲 線段樹

這就是 pac 老師 color char nod space 遊戲 std

我先立個Flag

我,這幾天,要過1W道線段樹題。

題目背景

阿寶上學了,今天老師拿來了一塊很長的塗色板。

題目描述

色板長度為L,L是一個正整數,所以我們可以均勻地將它劃分成L塊1厘米長的小方格。並從左到右標記為1, 2, ... L。現在色板上只有一個顏色,老師告訴阿寶在色板上只能做兩件事:1. "C A B C" 指在A到 B 號方格中塗上顏色 C。2. "P A B" 指老師的提問:A到 B號方格中有幾種顏色。學校的顏料盒中一共有 T 種顏料。為簡便起見,我們把他們標記為 1, 2, ... T. 開始時色板上原有的顏色就為1號色。 面對如此復雜的問題,阿寶向你求助,你能幫助他嗎?

輸入輸出格式

輸入格式:

第一行有3個整數 L (1 <= L <= 100000), T (1 <= T <= 30) 和 O (1 <= O <= 100000). 在這裏O表示事件數, 接下來 O 行, 每行以 "C A B C" 或 "P A B" 得形式表示所要做的事情(這裏 A, B, C 為整數, 可能A> B)

輸出格式:

對於老師的提問,做出相應的回答。每行一個整數。

輸入輸出樣例

輸入樣例#1:
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
輸出樣例#1:
2

做法

開始看到這個題我想起來之前寫的題解,

模板]分塊/可修改莫隊 (數顏色種類) ,當初是單點修改顏色 詢問區間顏色種類 作為練習用莫隊直接過了。

這個題是 區間修改 顏色 ,由於顏色種類<=30,區間的顏色種類可以狀壓, 然後求和用 或運算 ,這就是一道很裸的線段樹了。

洛谷這個題有坑 讀入的L,R 可能有L>R 需要swap 否則爆0 (好坑啊)

#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
struct Node{
    int l,r,sum;
}tree[MAXN*4];
int N,T,Q,L,R,opt,lazy[MAXN*4
]; char c[5]; void build_tree(int k,int l,int r){ tree[k].l=l,tree[k].r=r; if(l==r){tree[k].sum=1;return ;} int mid=l+r>>1; build_tree(k<<1,l,mid);build_tree(k<<1|1,mid+1,r); tree[k].sum=tree[k<<1].sum|tree[k<<1|1].sum; } void pushdown(int k){ if(!lazy[k])return ; tree[k<<1].sum=lazy[k],lazy[k<<1]=lazy[k]; tree[k<<1|1].sum=lazy[k],lazy[k<<1|1]=lazy[k]; lazy[k]=0; } void Modify(int k,int l,int r,int x){ if(tree[k].l>=l&&tree[k].r<=r){tree[k].sum=x,lazy[k]=x;return;} if(tree[k].l>r||tree[k].r<l)return ; pushdown(k); Modify(k<<1,l,r,x);Modify(k<<1|1,l,r,x); tree[k].sum=tree[k<<1].sum|tree[k<<1|1].sum; } int query(int k,int l,int r){ if(tree[k].l>=l&&tree[k].r<=r)return tree[k].sum; if(tree[k].l>r||tree[k].r<l)return 0; pushdown(k); return query(k<<1,l,r)|query(k<<1|1,l,r); } int main() { scanf("%d%d%d",&N,&T,&Q); build_tree(1,1,N); while(Q--){ scanf("%s%d%d",c,&L,&R); if(L>R)swap(L,R); if(c[0]==C){ scanf("%d",&opt); opt=(1<<opt-1); Modify(1,L,R,opt); } else{ int res=query(1,L,R),ans=0; while(res){ if(res&1)ans++; res>>=1; } printf("%d\n",ans); } } return 0; }

吐槽

我有一個地方 k<<1|1 寫成了 k<<1 查了半天改不對棄療了, 剛剛突然一眼掃到了就給A了

班裏學的物理好惡心 生無可戀。 還有 , 學考的政治歷史也好煩人,不想背-_-||

洛谷1558 色板遊戲 線段樹