hdu 4288
題意 給你類似乙個公升序的set結構 add就是加入乙個數 del就是刪除乙個數 sum就是把所有%5=3的位置的數求和
這題我們怎麼入手呢?以前做過一道類似的樹狀陣列開55個的題 這個題其實大同小異 就是對sum陣列表示%5的值我們開個sum[5]
那麼你既然是公升序的 我每次add 左邊的數一定等於sum[i] 主要是右邊的數如何確定 我們知道i = x + cnt(cnt為左子樹的點個數)
那麼x = i - cnt 於是每次up操作我們爸爸的sum等於 左子樹的sum + 右子樹 (i - cnt%5 + 5) %5
所以up就是這樣
由於數值很大 所以我們要離散化
這是我的**
#include #include #include #include #include #include #include #include #include #include using namespace std;
#define dbg(x) ;
//cout<<#x<<" = "<< (x)<< endl
const int max_n = 1e5+6;
long long sum[max_n<<2][5];
long long a[max_n],b[max_n],num[max_n<<2];
int q[max_n];
char ch[10];
void up(int rt)
}void update(int rt,int l,int r,int x,int key)
int mid = (l+r)>>1;
if(key<=mid) update(rt<<1,l,mid,x,key);
else update(rt<<1|1,mid+1,r,x,key);
up(rt);
}int init(int m)
else if(ch[0]=='d')
else
}sort(b+1,b+1+top);
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
return top;
}int main()
else if(q[i]==1)
else printf("%lld\n",sum[1][3]);}}
return 0;
}
hdu4288 線段樹維護多個sum
題意 給n個有序的數字,三個操作 1 刪除數字x 2 增加數字x 3 求i 5 3的數字之和 i為數字的下標 思路 一開始想水一下,結果超時。先對所有輸入的數字離散化,線段樹維護區間上點的個數和5個sum值,區間合併的時候要注意 左兒子節點和父親節點的關係很容易,右兒子合併的時候與左兒子中的點個數有...
HDU 3333 線段樹 離線處理
hdu 3333 線段樹 離線處理 問你給定區間內的不重複的數字的和,如1 1 1 3 4 區間1到2就是1,區間1到5就是8。這種線段樹只能離線來寫,離線的方法是按照查詢區間的右端點來排序,然後這道題目的資料範圍較大需要離散化簡單處理一下,然後對於輸入的每個點來說,順序走下去。然後如果當前點之前出...
hdu 4288 Coder 成都賽區 線段樹
題意 給出乙個有序集合,3種操作。插入乙個數,刪除乙個數,都保證序列有序。以及求和 其中求和是將下標 5 3的所有數求和 題解 線段樹 離散化 離線處理 一開始也是想的 線段樹 但是 這個和以前的 做過的 乙個線段樹 不同的 是 如果 我們 刪除 乙個 元素後 那麼 他的 下標 將會 改變 比賽是 ...