有乙個紙帶·,每次區間染色,同乙個地方後染的顏色覆蓋先染的,求最後紙帶上顏色種類數。
咦,這不是線段樹嗎?
咦,倒過來做好像很方便啊?
咦,離散化有坑?
區間塗色,若該顏色所在區間均被染色,則該顏色按原順序操作後會被後面的顏色覆蓋
注意離散化
本來三個顏色3-8,2-5,7-9,最後6號點上顏色是1
離散化後為2-5,1-3,4-6,顏色1就被「吃」掉了
怎麼解決?自(kan)行(dai)思(ma)考(ba)
#include
#define len 1000005
using
namespace
std;
inline
int getint()
while(isdigit(c))
return x*p;
}inline
void putint(int x)
static
int buf[30];
int tot=0;
dowhile(x);
while(tot)putchar(buf[--tot]+'0');
}int a[len],b[len],x[len<<3];
bool seg[(len<<4)+1],tag[(len<<4)+1];
inline
void updata(int k)
inline
void change(int k)
inline
void pushdown(int k)
}void modify(int k,int l,int r,int s,int t)
int mid=l+r>>1;
if(s<=mid)modify(k<<1,l,mid,s,t);
if(mid1|1,mid+1,r,s,t);
updata(k);
}bool query(int k,int l,int r,int s,int t)
int mid=l+r>>1;
bool ans=1;
if(s<=mid)ans=ans&&query(k<<1,l,mid,s,t);
if(mid1|1,mid+1,r,s,t);
updata(k);
return ans;
}int main()
int tot=n*2;
for(int i=1;i<=n;++i)
sort(x+1,x+tot+1);
tot=unique(x+1,x+tot+1)-x;
for(int i=1;i<=n;++i)
int ans=0;
for(int i=n;i>=1;--i)
}cout
0;}
咦,正解竟然是並查集!
我們將區間覆蓋用並查集優化,維護當前顏色最右端,合併時將一段顏色的最右端與相鄰格仔合併即可
#include
#define len 2000006
using
namespace
std;
inline
int getint()
while(isdigit(c))
return x*p;
}int ans=0;
int a[len],b[len],x[len];
int fa[len];
inline
int getfa(int x)
inline
int merge(int u,int v)
inline
void modify(int l,int r)
int main()
int tot=n*2;
sort(x+1,x+tot+1);
tot=unique(x+1,x+tot+1)-x;
for(int i=1;i<=n;++i)
for(int i=1;i<=tot;++i)
for(int i=n;i>=1;--i)
cout
0;}
NOIP模擬(20171024)T2 乘積
求從1 n中選k個數,使得這k個數的乘積不含完全平方因子 70 n 30 100 n 500 狀壓dp,f i j k 表示前i個數,選了j個,當前所選數之積分解質因數後的狀態為k k表示成二進位制後,第一位表示有沒有2,第二位表示有沒有3 以此類推 令i 1分解質因數後狀態為po s i 1 f ...
NOIP模擬(20171024)T3 數學
求滿足方程ax xa mod2n 的解的個數 n 30,a 109詢問組數t 1000 引理一 若a,b 均為奇數,且a2 k 1 b2k 1 mod2n 則a b mod2n 證明 a 2k 1 b2k 1 mod2n a 2k 1 b2k 1 0 mod2n a b a2k a2k 1b a2k...
NOIP模擬(10 30)T1 比賽
比賽 題目背景 10.30 noip 模擬t1 分析 暴力 將資料從小到大排序,從大到小找到第乙個滿足 a i k a i 1 的位置,那麼答案就是 n i 了,如果找不到那麼就是 n了 注意邊界 source created by scarlyw include include include i...