題意:
乙個空的座標系,有④種操作:①1 x y c表示在(x, y)點染上顏色c;②2 x y1 y2表示查詢在(1, y1)到(x, y2)範圍內有多少種不同的顏色:
③0表示清屏;④3表示程式退出(0<=x, y<=1000000, 0<=c<=50)
思路:開五十個線段樹(一種顏色乙個),以y為下表,儲存min x,(因為查詢x固定1---x)然後暴力查詢50個就好了
但是顯然碰到了乙個問題,1e6 開50個線段樹顯然不現實。。所以需要空間優化一下。。。這裡我們考慮動態來開闢線段樹,有效的節點進行分配,無效則不分配。。。提問,這樣空間為什麼是合理的呢?其實因為乙個add 最多開logn個節點,單組只有1.5e5次查詢,顯然,最多也就只開了qlogn個。那麼這樣空間複雜度就是合理的了。。具體動態開闢的實現也非常簡單,模擬trie,見**。
**:#includeusing namespace std;
#define mem(x,y) memset(x,y,sizeof(x));
const int maxn=3e6+10;
int root[55];
int l[maxn],r[maxn],tot,sum[maxn];
void update(int &rt,int idx,int val,int l,int r)
int query(int rt,int l,int r,int ll,int rr)
int main(){
int t,n,op,x,y,y1,y2,c,ret;
while(scanf("%d",&op)){
if(op==0){
mem(l,-1);mem(r,-1);
for(int i=0;i
hdu6183 線段樹動態開點
在寫題的時候偶然發現的 都是大佬 大概就是 將線段樹接下來的 i 1 和 i 1 1改為了用乙個陣列l i 和r i 來儲存感覺很有意思 有一點點像鏈式前向星 題目位址 hdu6183 還乙個大佬寫的 cdq 線段樹 include define mod 998244353 using namesp...
hdu 4391 線段樹 優化
2012 多校第十場,這個題目比賽的時候我直接在每個節點裡面開了乙個map,結果毫無疑問mle 了,比賽之後看了結題報告說是 分段雜湊,沒學過,後來聽說線段樹稍微剪枝一下就能過,換了一下思路,確實就能過了,每個節點也不需要記錄每種顏色的個數了,只需要記錄最大的編號和最小的就可以了。include i...
hdu 4262 線段樹優化
include include include includeusing namespace std define lson u 1 define rson u 1 1 define maxn 100005 int map maxn struct nodet maxn 2 void pushup i...