嗯…直接貼板子了,(注釋寫了點)..
#include
using
namespace
std;
const
int maxn=1e5+10;
int a[maxn],belong[maxn],l[1010],r[1010],block,num;//a陣列訪問原始資料,belong陣列表示每個數屬於哪一塊方便呼叫,l和r表示各塊左右端點,block各塊大小,num塊數量
void change(int l,int r,int add)//修改,視情況而定
int query(int l,int r)//查詢,同上
void build(int n)//建立各塊(各個分塊這個操作大致一樣)
int main()//讀入
墨墨購買了一套n支彩色畫筆(其中有些顏色可能相同),擺成一排,你需要回答墨墨的提問。墨墨會向你發布如下指令:
1、 q l r代表詢問你從第l支畫筆到第r支畫筆中共有幾種不同顏色的畫筆。
2、 r p col 把第p支畫筆替換為顏色col。
為了滿足墨墨的要求,你知道你需要幹什麼了嗎?
輸入輸出格式
輸入格式:
第1行兩個整數n,m,分別代表初始畫筆的數量以及墨墨會做的事情的個數。
第2行n個整數,分別代表初始畫筆排中第i支畫筆的顏色。
第3行到第2+m行,每行分別代表墨墨會做的一件事情,格式見題幹部分。
輸出格式:
對於每乙個query的詢問,你需要在對應的行中給出乙個數字,代表第l支畫筆到第r支畫筆中共有幾種不同顏色的畫筆。
基本是裸的,不過資料要稍微離散下,再加個bitset加速(離散還不怎麼會…)
**(最慢點196ms)
#include
using
namespace
std;
const
int maxn=1e5+7;
int a[maxn],t[maxn],belong[maxn],num,l[1010],r[1010],mp[1000010],cnt=0,block;
bitset
<11010>bst[4010],ans;bool vis[11010];
void lisan(int n)//離散
void build(int n)
}int query(int l,int r)
return res;
}ans.reset();
for(int i=l;i<=r[belong[l]];i++)
ans.set(a[i]);
for(int i=belong[l]+1;i//暴力搞
ans|=bst[i];
for(int i=l[belong[r]];i<=r;i++)
ans.set(a[i]);
return ans.count();
}void change(int pos,int to)//同上暴力
int main()
return
0;}
分塊模板題
題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,單點查值。輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為a i 以空格隔開 接下來輸入 n 行詢問,每行輸入四個數字 opt,l,r,c,以空格隔開 若 opt 0,表示將 l,r 的之間的數都加 c 若 o...
Color the ball( 分塊模板 )
color the ball 分塊1 n個氣球排成一排,從左到右依次編號為1,2,3.n.每次給定2個整數a b a b lele便為騎上他的 小飛鴿 牌電動車從氣球a開始到氣球b依次給每個氣球塗一次顏色。但是n次以後lele已經忘記了第i個氣球已經塗過幾次顏色了,你能幫他算出每個氣球被塗過幾次顏色...
BZOJ 1806 樹分塊 模板題
time limit 10 sec memory limit 162 mbsec special judge submit 2685 solved 1635 submit status discuss 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成 員...