Pagini recente » Borderou de evaluare (job #1988551) | Cod sursa (job #2136325) | Cod sursa (job #81271) | Cod sursa (job #2622366) | Cod sursa (job #3349486)
#include <fstream>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <set>
#include <deque>
std::ifstream fin("secv5.in");
std::ofstream fout("secv5.out");
std::unordered_map<long long, long long> oldest, newest;
std::vector<long long> v;
std::vector<long long> dp; //dp[i] = nr de secvente cu proprietatea din enunt terminate in pozitia i
std::deque<long long> dq;
long long n, l, u;
long long counter;
int main(){
fin >> n >> l >> u;
v.resize(n);
dp.resize(n);
for(long long i = 0; i < n; ++i){
fin >> v[i];
if(oldest.find(v[i]) != oldest.end()){
newest[v[i]] = i;
if((long long)oldest.size() >= l){
long long t = (long long)oldest.size() - l;
dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
}
}
else{
if((long long)oldest.size() < u){
oldest[v[i]] = newest[v[i]] = i;
dq.push_back(v[i]);
if((long long)oldest.size() >= l){
long long t = (long long)oldest.size() - l;
dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
}
}
else{
long long t = dq.front();
dq.pop_front();
oldest.erase(oldest.find(t));
newest.erase(newest.find(t));
oldest[v[i]] = newest[v[i]] = i;
dq.push_back(v[i]);
t = (long long)oldest.size() - l;
dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
}
}
}
for(long long i = 0; i < n; ++i){
counter += (long long)dp[i];
}
fout << counter;
}