luogu 1558 色板游戏
生活随笔
收集整理的這篇文章主要介紹了
luogu 1558 色板游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目背景
阿寶上學了,今天老師拿來了一塊很長的涂色板。
題目描述
色板長度為L,L是一個正整數,所以我們可以均勻地將它劃分成L塊1厘米長的小方格。并從左到右標記為1, 2, ... L。
現在色板上只有一個顏色,老師告訴阿寶在色板上只能做兩件事:
學校的顏料盒中一共有 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,這樣的話需要你交換A和B)
輸出格式
對于老師的提問,做出相應的回答。每行一個整數。
輸入輸出樣例
輸入 #1復制 2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2 輸出 #1復制 2 1?分析
涂色的題,可以用狀態壓縮來存顏色的狀態。
用一個數組存是否是單一顏色,如果兒子節點不是單一顏色或兩個區間顏色不一樣,那么就不是單一顏色
若是單一顏色的區間,在遍歷時要下放
?
代碼
?
1 /*********************** 2 User:Mandy.H.Y 3 Language:c++ 4 Problem: 5 Algorithm: 6 ***********************/ 7 8 #include<bits/stdc++.h> 9 #define lson l,mid,k<<1 10 #define rson mid + 1,r,k<<1|1 11 12 using namespace std; 13 14 const int maxn = 1e5 + 5; 15 16 int n,t,o,ans; 17 bool tree[maxn << 2]; 18 int colo[maxn << 2]; 19 20 template<class T>inline void read(T &x){ 21 x = 0;bool flag = 0;char ch = getchar(); 22 while(!isdigit(ch)) flag |= ch == '-',ch = getchar(); 23 while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch^ 48),ch = getchar(); 24 if(flag) x = -x; 25 } 26 27 template<class T>void putch(const T x){ 28 if(x > 9) putch(x / 10); 29 putchar(x % 10 | 48); 30 } 31 32 template<class T>void put(const T x){ 33 if(x < 0) putchar('-'),putch(-x); 34 else putch(x); 35 } 36 37 void file(){ 38 freopen("testdata(2).in","r",stdin); 39 freopen("1558.out","w",stdout); 40 } 41 42 void buildtree(int l,int r,int k){ 43 tree[k] = 1;colo[k] = 2; 44 if(l == r) return; 45 int mid = (l + r) >> 1; 46 buildtree(lson); 47 buildtree(rson); 48 } 49 50 void readdata(){ 51 read(n);read(t);read(o); 52 buildtree(1,n,1); 53 } 54 55 void pushdown(int k){ 56 if(tree[k] == 1){ 57 tree[k<<1] = 1; 58 tree[k<<1|1] = 1; 59 colo[k<<1] = colo[k]; 60 colo[k<<1|1] = colo[k]; 61 } 62 } 63 64 void modify(int l,int r,int k,int x,int y,int color){ 65 if(x <= l && r <= y){ 66 tree[k] = 1;//tree用于標記是否為單一色彩 67 colo[k] = (1 << color); 68 return; 69 } 70 int mid = (l + r) >> 1; 71 pushdown(k);//%%% 72 if(x <= mid) modify(lson,x,y,color); 73 if(y > mid) modify(rson,x,y,color); 74 colo[k] = colo[k<<1] | colo[k<<1|1];//狀態壓縮存顏色 75 if((colo[k<<1] != colo[k<<1|1]) || (tree[k<<1] == 0) || (tree[k<<1|1] == 0)) tree[k] = 0; 76 //%%% 注意 三個條件 77 } 78 79 void query(int l,int r,int k,int x,int y){ 80 if(x <= l && r <= y){ 81 ans |= colo[k]; 82 return; 83 } 84 pushdown(k);//%%% 85 int mid = (l + r) >> 1; 86 if(x <= mid) query(lson,x,y); 87 if(y > mid) query(rson,x,y); 88 } 89 90 void work(){ 91 while(o--){ 92 char c = getchar(); 93 int l,r,x; 94 while(c != 'C' && c != 'P') c = getchar(); 95 if(c == 'C') { 96 read(l);read(r);read(x); 97 if(l > r) swap(l,r); 98 modify(1,n,1,l,r,x); 99 } else { 100 read(l);read(r); 101 if(l > r) swap(l,r); 102 ans = 0; 103 int num = 0; 104 query(1,n,1,l,r); 105 for(int i = ans;i;i -= (i & (-i))) ++num;//%%% 106 put(num); 107 putchar('\n'); 108 } 109 } 110 } 111 112 int main(){ 113 // file(); 114 readdata(); 115 work(); 116 return 0; 117 } View Code?
轉載于:https://www.cnblogs.com/Mandy-H-Y/p/11421149.html
總結
以上是生活随笔為你收集整理的luogu 1558 色板游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python分段函数图像画法_数值实验分
- 下一篇: 崩坏3角色渲染分析