luoguP1558 色板遊戲

2021-08-08 01:34:36 字數 1911 閱讀 5055

題目背景

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

題目描述

色板長度為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 1

分析:

線段樹

看到t的範圍不大,我就乾脆在每個線段樹節點中都開了乙個30的陣列,記錄該區間每種顏色的數量

其餘的就是樸素操作了

一開始狂wa不止,知道wo看到了這句話

這裡 a, b, c 為整數, 可能a> b

改了之後就a了。。。。坑坑坑!!!

luogu上我每個點都是1000ms–(沒有吸氧)

但是在poj2777上時限都一樣,

卻是悲慘的tle

只能說明poj的評測機比較辣雞。。

這裡寫**片

#include

#include

#include

using

namespace

std;

const

int n=100001;

struct node;

node t[n<<2];

int n,o,c,co[32];

inline

void print(int bh,int z)

void push(int bh)

}inline

void update(int bh)

void build(int bh,int l,int r)

int mid=(l+r)>>1;

build(bh<<1,l,mid);

build(bh<<1|1,mid+1,r);

update(bh);

}void change(int bh,int l,int r,int z)

int mid=(t[bh].x+t[bh].y)>>1;

if (l<=mid) change(bh<<1,l,r,z);

if (r>mid) change(bh<<1|1,l,r,z);

update(bh);

}void copy(int bh)

void ask(int bh,int l,int r)

int mid=(t[bh].x+t[bh].y)>>1;

if (l<=mid) ask(bh<<1,l,r);

if (r>mid) ask(bh<<1|1,l,r);

}int main()

else

}return

0;}

Luogu P1558 色板遊戲

此題與poj2777重題 為了加深對線段樹的記憶,然後開始搞這道題。tm的wa了一下午就是發現x可能大於y 然而題目裡說的還很清楚,我tm沒看見 1.儲存時不是儲存顏色,而是將它狀壓成乙個整數 如序號為3的顏色存為1 3 8 2.回溯時不是取和相加,而是直接按位或 原理等下講 3.最後的查詢完畢的值...

P1558 色板遊戲

題目位址 思路 位運算,狀態壓縮,線段樹 分析思路 線段樹code include include define clean x memset x,0,sizeof x define ls rt 2 define rs rt 2 1 const int maxl 100005 maxk 30 uns...

luogu 1558 色板遊戲

寫這篇部落格不是為了總結我的演算法,而是為了紀念讓我爆零的套路.色板長度為 l l 是乙個正整數,所以我們可以均勻地將它劃分成 l 塊 1 厘公尺長的小方格。並從左到右標記為 1,2,l 現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 c a b c 指在 a 到 b 號方格中塗上顏色 c...