3108 - Dss
Enunt[edit | edit source]
Se dau N numere naturale s[1], s[2], …, s[N] și Q interogări de forma a b.
Cerinţa[edit | edit source]
Să se determine pentru fiecare interogare [a;b] numărul de subșiruri formate din elemente distincte ale secvenței s[a], s[a+1], s[a+2], …, s[b]. Prin secvență a șirului s se înțelege orice succesiune de elemente aflate pe poziții consecutive s[a], s[a+1], …, s[b], cu 1 ≤ a ≤ b ≤ N. Prin subșir al șirului s se înțelege orice succesiune de elemente aflate pe poziții în ordine strict crescătoare, dar nu neapărat consecutive, sa1, sa2, …, sak cu 1 ≤ a1 < a2 < ... < ak ≤ N.
Date de intrare[edit | edit source]
Fișierul de intrare dss.in conține pe primul rând numerele N și Q. Pe linia a doua sunt scrise N numere naturale separate prin câte un spațiu. Pe următoarele Q rânduri sunt scrise câte două numere naturale a b@, separate prin spațiu, reprezentând capetele intervalelor de interogare date.
Date de ieșire[edit | edit source]
În fișierul de ieșire dss.out pe fiecare dintre primele Q rânduri este scris câte un număr natural reprezentând numărul tuturor subșirurilor formate din elemente distincte conținute în secvența din interogarea corespunzătoare.
Restricţii şi precizări[edit | edit source]
- 1 ≤ N ≤ 400.000
- 1 ≤ Q ≤ 10.000
- 1 ≤ s[k] ≤ N
- 1 ≤ a ≤ b ≤ N
Numărul de subșiruri pentru fiecare interogare vor fi calculate modulo 1.000.000.007
Exemplul 1[edit | edit source]
- dss.in
5 3 1 2 3 2 3 1 4 2 5 1 3
- dss.out
11 8 7
Explicație[edit | edit source]
- - Subșirurile formate din elemente distincte din secvența s[1..4]=(1 2 3 2) sunt 1, 2, 3, 2, 1 2, 1 3, 1 2, 2 3, 3 2, 1 2 3, 1 3 2, deci în total 11 subșiruri.
- - Subșirurile formate din elemente distincte din secvența s[2..5]=(2 3 2 3) sunt 2, 3, 2, 3, 2 3, 2 3, 3 2, 2 3, deci 8 subșiruri.
- - Subșirurile formate din elemente distincte din secvența s[1..3]=(1 2 3) sunt 1, 2, 3, 1 2, 1 3, 2 3, 1 2 3, deci 7 subșiruri.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def count_subsequences(s, a, b):
MOD = 1000000007 n = len(s) dp = [0] * (n + 1) last_seen = [-1] * (n + 1) dp[0] = 1 for i in range(1, n + 1): dp[i] = (dp[i - 1] * 2) % MOD if last_seen[s[i - 1]] != -1: dp[i] = (dp[i] - dp[last_seen[s[i - 1]] - 1] + MOD) % MOD last_seen[s[i - 1]] = i return (dp[b] - dp[a - 1] + MOD) % MOD
def main():
with open("dss.in", "r") as fin: N, Q = map(int, fin.readline().split()) s = list(map(int, fin.readline().split())) queries = [list(map(int, line.split())) for line in fin]
with open("dss.out", "w") as fout: for a, b in queries: fout.write(str(count_subsequences(s, a, b)) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>