題意:求乙個區間的和,但如果某乙個數在這個區間出現了多次,這個數只能被計算一次。
官方題解:按右端點從小到大排序。建立樹狀陣列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個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...