牛客練習賽52 BGalahad 樹狀陣列

2021-09-27 07:06:00 字數 1011 閱讀 1697

題意:求乙個區間的和,但如果某乙個數在這個區間出現了多次,這個數只能被計算一次。

官方題解:按右端點從小到大排序。建立樹狀陣列ccc,維護貢獻的字首和。

由於權值ai 滿足1≤ai≤500 000,所以不用離散化,直接維護 last[ a[i] ] 表示元素 a[i] 上一次出現的位置。

設當前更新到的位置為t 。如果ai沒有出現過,即last[ai]=0,則不產生影響;否則把樹狀陣列上的last[ai]貢獻變為0,在t位置貢獻+1。

增大t,依次更新。直到t抵達當前詢問的右端點r。

#includeusing namespace std;

const int n = 5e5+10;

typedef long long ll;

int n, m;

ll sum[n];

int a[n];

int last[n];

ll ans[n];

struct node

}e[n];

int lowbit(int x)

void add(int p, int k)

}ll getsum(int p)

return res;

}int main()

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

sort(e+1, e+1+m);

int j = 1;

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

last[a[i]] = i;

add(i, a[i]);

for(; j <= m; j++)

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

printf("%lld\n", ans[i]);

return 0;

}

牛客練習賽52

數數 define 能夠比int定義乙個數更快,這道就是典例,用int mod超時,而define ac了。fefine 是直接用,而其他定義是還要乙個位址尋找流程 include define max int unsigned 1 1 define min int max int define p...

牛客練習賽52 A 數數(快速冪)

你已經是乙個成熟的孩子了,要學會自己數數了!多組資料。第一行乙個數 t 1 t 5 表示測試資料組數。接下來 t行,每行乙個數 n 1 n 1e7 對於每一組測試資料,輸出一行兩個數,即這組測試資料的答案。示例1複製 1 1複製 1 1解題思路 第一問 1 1 1 2 1 3 1 n 2 1 2 2...

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...