<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem równoległe_wyszukiwanie_binarne</title>
<link>https://forum.pasja-informatyki.pl/tag/r%C3%B3wnoleg%C5%82e_wyszukiwanie_binarne</link>
<description>Powered by Question2Answer</description>
<item>
<title>Zadanie meteory finał XVIII OI, równoległe wyszukiwanie binarne</title>
<link>https://forum.pasja-informatyki.pl/583882/zadanie-meteory-final-xviii-oi-rownolegle-wyszukiwanie-binarne</link>
<description>

&lt;p&gt;Mam problem z zadaniem meteory z finału XVIII OI:&amp;nbsp;&lt;a href=&quot;https://szkopul.edu.pl/problemset/problem/czzVm7v3I58TnPHzBgWiyELT/site/?key=statement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://szkopul.edu.pl/problemset/problem/czzVm7v3I58TnPHzBgWiyELT/site/?key=statement&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Zobaczyłem je w przygodach, trochę nad nim pomyślałem, przeczytałem rozwiązanie i wydawało mi się, że je rozumiem, robimy zwykłe wyszukiwanie binarne, ale żeby nie robić dła każdego oddzielnie, to robimy je równolegle, czyli trzymamy rekurencyjnie i dzielimy je na części. Wszystko było fajnie, nawet się ucieszyłem, że poznałem nowy algorytm, napisałem go, uśmiechnięty, że będzie setka, a tu się okazało, że jest zero i w wszystkich testach oprócz 3 przykładowych przekroczono limit czasu. Kompletnie nie wiem o co chodzi. Kod wydaje się być prosty. Czyli najprawdopodobniej nie rozumiem tej idei...&lt;/p&gt;



&lt;p&gt;Strona 184 w książeczce OI, to rozwiązanie, co wydaje mi się, że je rozumiem. Znaczy wydawało mi się, bo teraz to wiem, że czegoś nie rozumiem, tylko jeszcze nie wiem czego.&lt;/p&gt;



&lt;p&gt;Mój kod:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

struct Opad
{
    int l;
    int r;
    int ile_dod;
};

int n = 0, m = 0, k = 0, base = (1 &amp;lt;&amp;lt; 19), rozmiar_drzewa = base * 2;
vector&amp;lt;int&amp;gt; drzewo_przedzialowe;
vector&amp;lt;int&amp;gt; idxy_poczatkowe;
vector&amp;lt;int&amp;gt; zapotrzebowanie;
vector&amp;lt;int&amp;gt; stacje;
vector&amp;lt;int&amp;gt; wyn;
vector&amp;lt;Opad&amp;gt; opady;

inline void update (int l, int p, int val)
{
    l = l + base - 1, p = p + base + 1;
    while (l / 2 != p / 2)
    {
        if (l % 2 == 0)
            drzewo_przedzialowe[l+1] += val;
        if (p % 2 == 1)
            drzewo_przedzialowe[p-1] += val;
        l /= 2;
        p /= 2;
    }
}

inline void dodaj (int l, int p, int val)
{
    if (l &amp;lt;= p)
        update(l,p,val);
    else
    {
        update(l,m-1,val);
        update(0,p,val);
    }
}

inline int query(int v)
{
    v += base;
    int res = 0;
    while (v &amp;gt; 0)
    {
        res += drzewo_przedzialowe[v];
        v /= 2;
    }
    return res;
}

inline void clearuj_drzewo_przedzialowe()
{
    drzewo_przedzialowe.assign(rozmiar_drzewa,0);
}

inline void binary_searchh(int l, int p, vector&amp;lt;int&amp;gt; idxy)
{
    if (p - l == 1)
    {
        for (int i = 0; i &amp;lt; idxy.size(); ++i)
            wyn[idxy[i]] = p;
    }
    else
    {
        int srodek = (l + p) / 2;
        clearuj_drzewo_przedzialowe();
        for (int i = 0; i &amp;lt; srodek; ++i)
            dodaj(opady[i].l-1, opady[i].r-1, opady[i].ile_dod);
        vector&amp;lt;int&amp;gt; ile;
        ile.assign(n+1,0);
        for (int i = 0; i &amp;lt; m; ++i)
            ile[stacje[i]] += query(i);
        vector&amp;lt;int&amp;gt; vect_lewych, vect_prawych;
        for (int i = 0; i &amp;lt; idxy.size(); ++i)
        {
            if (ile[idxy[i]] &amp;gt;= zapotrzebowanie[idxy[i]])
                vect_prawych.push_back(idxy[i]);
            else
                vect_lewych.push_back(idxy[i]);
        }
        binary_searchh(l,srodek,vect_prawych);
        binary_searchh(srodek,p,vect_lewych);
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;

    zapotrzebowanie.assign(n+1,-1);
    wyn.assign(n+1,-1);
    stacje.assign(m,-1);

    for (int i = 0; i &amp;lt; m; ++i)
        cin &amp;gt;&amp;gt; stacje[i];

    for (int i = 1; i &amp;lt;= n; ++i)
        cin &amp;gt;&amp;gt; zapotrzebowanie[i];

    cin &amp;gt;&amp;gt; k;
    opady.assign(k,{});
    for (int i = 0; i &amp;lt; k; ++i)
        cin &amp;gt;&amp;gt; opady[i].l &amp;gt;&amp;gt; opady[i].r &amp;gt;&amp;gt; opady[i].ile_dod;

    clearuj_drzewo_przedzialowe();
    idxy_poczatkowe.assign(n,0);
    for (int i = 0; i &amp;lt; n; ++i)
        idxy_poczatkowe[i] = i+1;
    binary_searchh(-1,k+1,idxy_poczatkowe);

    for (int i = 1; i &amp;lt;= n; ++i)
    {
        if (wyn[i] == k+1)
            cout &amp;lt;&amp;lt; &quot;NIE&quot; &amp;lt;&amp;lt; '\n';
        else
            cout &amp;lt;&amp;lt; wyn[i] &amp;lt;&amp;lt; '\n';
    }

    return 0;
}
&lt;/pre&gt;



&lt;p&gt;Z góry dziękuję za pomoc i poświęcony czas!&lt;/p&gt;</description>
<category>Algorytmy</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/583882/zadanie-meteory-final-xviii-oi-rownolegle-wyszukiwanie-binarne</guid>
<pubDate>Mon, 17 Apr 2023 00:08:00 +0000</pubDate>
</item>
</channel>
</rss>