diff options
author | Anton Luka Šijanec <anton@sijanec.eu> | 2024-03-24 13:51:59 +0100 |
---|---|---|
committer | Anton Luka Šijanec <anton@sijanec.eu> | 2024-03-24 13:51:59 +0100 |
commit | bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5 (patch) | |
tree | 97cde1fadb2385d899eaeb97fd4d5255d9dc5494 /šola/p2/dn | |
parent | dn04a in dn04b failed attempt (diff) | |
download | r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.tar r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.tar.gz r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.tar.bz2 r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.tar.lz r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.tar.xz r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.tar.zst r-bba81a6b6efb73c428fa96cd75f5960d2a9c5ce5.zip |
Diffstat (limited to 'šola/p2/dn')
-rw-r--r-- | šola/p2/dn/DN04b_63230317.c | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/šola/p2/dn/DN04b_63230317.c b/šola/p2/dn/DN04b_63230317.c index 105890a..eba57c4 100644 --- a/šola/p2/dn/DN04b_63230317.c +++ b/šola/p2/dn/DN04b_63230317.c @@ -1,39 +1,44 @@ #include <stdio.h> #include <stdbool.h> +#include <limits.h> +#include <stdlib.h> int main (void) { - int n, k, s = 0; - scanf("%d %d", &n, &k); - int a[n]; - for (int i = 0; i < n; i++) - scanf("%d", &a[i]); - int d, l = n-1; - for (int i = 0; i < n-1; i++) - if (2*a[i] <= k && 2*a[i+1] > k) - l = i; - d = l; - fprintf(stderr, "l je %d, d je %d\n", l, d); + unsigned long long n, k; + unsigned long long s = 0; + scanf("%llu %llu", &n, &k); + unsigned long long * števila = calloc(n+1, sizeof *števila); + unsigned long long * količine = calloc(n+1, sizeof *količine); + int unikatnih = 0; + for (unsigned long long i = 0; i < n; i++) { + unsigned long long element; + scanf("%llu", &element); + if (!unikatnih || števila[unikatnih-1] != element) { + količine[unikatnih] = 1; + števila[unikatnih++] = element; + } else + količine[unikatnih-1]++; + } + int l = 0; + int d = unikatnih-1; do { - if (a[l]+a[d] == k) { - int lc = l; - int dc = d; - int add = 0; - while (lc >= 0 && a[lc] == a[l]) - lc--; - while (dc <= n-1 && a[dc] == a[d]) - dc++; - if (a[l] == a[d]) // (dc-lc) choose 2 - add = ((dc-lc-1)*n)/2; - else - add = (d-dc+1)*(lc-l+1); - fprintf(stderr, "l=%d, d=%d, a[l]=%d, a[d]=%d, lc=%d, dc=%d, add=%d\n", l, d, a[l], a[d], lc, dc, add); - l = lc; - d = dc; - s += add; + if (števila[l] + števila[d] == k) { + if (števila[l] == števila[d]) { + s += (količine[l]-1)*(količine[l])/2; + break; + } + s += količine[l]*količine[d]; + if (l == d-1) + break; + l++; + d--; + continue; } - if (l-1 >= 0) - l--; - if (d+1 < n) - d++; - } while (d < n-1 || l > 0); - printf("%d\n", s); + if (l == d) + break; + if (števila[l]+števila[k] < k) + l++; + else + d--; + } while (true); + printf("%llu\n", s); } |