只查詢區間不同的數的和(思路好題)
對查詢離線
不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 (等價操作的轉換)
離散化一下
#include#define mem(a,b) memset(a,b,sizeof(a))
#define lson root<<1
#define rson root<<1|1
#define mid int mid=(l+r)>>1
#define frei freopen("in.txt","r",stdin)
#define n 30100
#define ll long long
using namespace std;
int n;
ll ans[n<<2];
mapinvf;
int a[n],pre[n];
ll f[n],res;
struct que;
que q[100100];
ll sum[100100];
void lisanhua(int n)
}}void update(int root,int l,int r,int ql,int qr,int val)
mid;
update(lson,l,mid,ql,qr,val);
update(rson,mid+1,r,ql,qr,val);
ans[root]=ans[lson]+ans[rson];
}void query(int root,int l,int r,int ql,int qr)
mid;
query(lson,l,mid,ql,qr);
query(rson,mid+1,r,ql,qr);
}bool cmp(que a,que b){
return a.r
hdu3333 線段樹,離散化,離線操作
求區間不同數字的和 先將資料離散化,離線操作就是要先將問題儲存起來,根據一定的順序解答來降低複雜度 這題就將問題儲存起來後按右邊界排序,之後從左到右逐個點的建立線段樹,同時標記一下這個值是否出現過和位置,如果之前出現過,就把之前出現的點清零再在當前點插值,同時看當前的點有沒有剛剛排好序的問題的右邊界...
HDU 3333 離線線段樹
線段樹 給定乙個序列,求區間出現的數的數值和,若有多個,只計算一次 先離散化存數資料 對詢問區間按右節點排序,這樣我們每次維護的都是從前到當前位置,保證其重複元素不累加 跟新節點,對於之前出現過的刪除,並在新位置新增 然後查詢即可 include iostream include algorithm...
hdu 3333 離散化 離線操作
若不是題中的數看錯了導致舒陣列開小造成的re,就是1a呀,話說最近總是犯這種錯誤,難道要換眼鏡?一看肯定是線段樹,求區間內不同的數的和,由於這些數要不同,可能不是連續的,所以要離線處理。將訪問操作按照末端節點排序。然後再把a陣列離散化即可。include include define ss a sc...