hdu 3333 離散化 離線操作

2021-06-10 00:16:18 字數 995 閱讀 4198

若不是題中的數看錯了導致舒陣列開小造成的re,就是1a呀,話說最近總是犯這種錯誤,難道要換眼鏡?

一看肯定是線段樹,求區間內不同的數的和,由於這些數要不同,可能不是連續的,所以要離線處理。。將訪問操作按照末端節點排序。。然後再把a陣列離散化即可。

#include #include #define ss(a) scanf("%d",&a)

#define cl(a) memset(a,0,sizeof(a))

#define lowbit(a) a&(-a)

#define ll __int64

using namespace std;

struct node

;struct ask

;const int n=30100;

const int m=100100;

int pos[n],b[n],c[n],n;

ll res[m],sum[n];

node a[n];

ask s[m];

bool cmp1(node x,node y)

return re;

}void insert(int t,int x)

}int main()

sort(a+1,a+n+1,cmp1);

t=0;

a[i].v=-1;

for (i=1;i<=n;i++)

ss(m);

for (i=1;i<=m;i++)

sort(s+1,s+m+1,cmp2);

s[0].end=0;

for (i=1;i<=m;i++)

else

pos[k]=j;

}res[s[i].id]=query(s[i].end)-query(s[i].start-1);

}for (i=1;i<=m;i++) printf("%i64d\n",res[i]);

}return 0;

}

hdu3333 線段樹,離散化,離線操作

求區間不同數字的和 先將資料離散化,離線操作就是要先將問題儲存起來,根據一定的順序解答來降低複雜度 這題就將問題儲存起來後按右邊界排序,之後從左到右逐個點的建立線段樹,同時標記一下這個值是否出現過和位置,如果之前出現過,就把之前出現的點清零再在當前點插值,同時看當前的點有沒有剛剛排好序的問題的右邊界...

HDU 3333 線段樹 離散化

只查詢區間不同的數的和 思路好題 對查詢離線 不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 等價操作的轉換 離散化一下 include define mem a,b memset a,b,sizeof a define lson root 1 define rson ro...

HDU 3333 離線線段樹

線段樹 給定乙個序列,求區間出現的數的數值和,若有多個,只計算一次 先離散化存數資料 對詢問區間按右節點排序,這樣我們每次維護的都是從前到當前位置,保證其重複元素不累加 跟新節點,對於之前出現過的刪除,並在新位置新增 然後查詢即可 include iostream include algorithm...