題意:詢問某一區間的值之和,相同元素只算一次
思路,樹狀陣列求解,由於區間相同元素只算一次,採用離線演算法,把區間右端點從小到大排序,按順序處理。
首先我們找到乙個點時,記錄它的下標,若在後面還有與它相同的元素,我們把之前的元素去掉,插入到當前位置,每次進行這樣的一次處理,就要判斷一下,處理後該點有沒有等於某一詢問區間的右端點,有的話直接求,因為前面已經都處理過來了,所以該點前不存在重複的點
可是我還特別鬱悶,我之前一直tle,就是那個pos陣列開小了,我還是不懂為什麼
**:
#include //我無語了,那個pos陣列開小了一直tle,可整死我了
#include #include #include #include #include #include #include using namespace std;
const int m=50005;
const int n=200005;
int a[m];
int pos[1000005];//開200005不行
long long ans[n],c[m];
int n,m;
struct node
inv[n];
//bool cmp(node a,node b)
//int nextint()//可以優化時間
int main()
scanf("%d",&m);
for(int i=1; i<=m; i++)
sort(inv+1,inv+m+1);
memset(c,0,sizeof(c));
memset(pos,-1,sizeof(pos));
int h=1;
__int64 t1,t2;
for(int i=1; i<=n; i++)
}for(int i=1; i<=m; i++)
printf("%i64d\n",ans[i]);
}return 0;
}
HDU 3874 Necklace 樹狀陣列
題意 求區間內不同的數的和 離線處理,按查詢右端點從小到大排序,從左往右掃一遍。記錄每個數出現的上乙個位置,如果該數之前沒有出現過,就加上,否則就在上乙個位置減去。include include include include define ll long long int using namesp...
HDU 3874 Necklace 莫隊演算法
題目 題意 給定乙個陣列,每次詢問乙個區間 l,r 求區間內所有數字的和,出現多次的數字只加一次 思路 莫隊演算法掃一遍即可,注意會爆int。我陣列開小了不少re而是tle,蛋疼。include include include include include include using namesp...
HDU 3874 Necklace 數狀陣列
題意 求 l,r 區間內不重複的數的和。n個數,m次詢問 解 離線處理m次詢問,看得別人的思路後才知道的。思維侷限在預處理n個數上了。對m次詢問按右區間的值從小到大排序。掃一遍n個數,如果發現當前這個數在之前出現過,就從之前出現這個數的位置上把這個數刪除,在新位置上插入這個數。這樣做的好處是刪除前面...