若不是題中的數看錯了導致舒陣列開小造成的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...