zoukankan      html  css  js  c++  java
  • 小椛椛的板子们

    Updata : 小椛椛的板子们2

    实在不愿意再做题了,这几天写写板子。

    若想找特定模板,请按Ctrl + F搜索

    FFT(大家都会的FFT,这个写法跑的贼慢,不过好写易懂,rank1没了sad)

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #define Max 3000000
    #define rg register
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    
    typedef double flo; const flo PI = acos (-1.0);
    
    struct Vec 
    {
        flo x, y; Vec (flo a = 0, flo b = 0) : x (a), y (b) {}
        
        Vec operator * (const Vec &rhs) const
        { return Vec (x * rhs.x - y * rhs.y, x * rhs.y + y * rhs.x); }
        
        Vec operator * (const flo &k) const
        { return Vec (x * k, y * k); }
        
        Vec operator + (const Vec &rhs) const
        { return Vec (x + rhs.x, y + rhs.y); }
        
        Vec operator - (const Vec &rhs) const
        { return Vec (x - rhs.x, y - rhs.y); }
        
        Vec &operator /= (const flo &k) 
        { return x /= k, y /= k, *this; }
    };
    
    using std :: swap;
    
    Vec a[Max], b[Max];
    
    int N, M, Maxn, rd[Max];
    
    void FFT (Vec *a, int N, int f = 1)
    {
        rg int i, j, k;
        for (i = 1; i < N; ++ i)
            if (rd[i] > i) swap (a[i], a[rd[i]]);
        for (k = 1; k < N; k <<= 1)
        {
            Vec wn (cos (PI / k), f * sin (PI / k));
            for (j = 0; j < N; j += k << 1)
            {
                Vec w (1, 0), t;
                for (i = j; i < j + k; ++ i, w = w * wn)
                    t = w * a[i + k], a[i + k] = a[i] - t, a[i] = a[i] + t;
            }
        }
        if (f == -1) 
            for (i = 0; i < N; ++ i) a[i] /= N;
    }
    
    int main (int argc, char *argv[])
    {
        read (N), read (M); rg int i; int x;
        ++ N, ++ M, Maxn = 1 << int (ceil (log2 (N + M)));
        for (i = 0; i < N; ++ i) read (x), a[i].x = x;
        for (i = 0; i < M; ++ i) read (x), b[i].x = x;
        
        for (i = 1; i < Maxn; ++ i)
            rd[i] = rd[i >> 1] >> 1 | (i & 1) * (Maxn >> 1);
        FFT (a, Maxn), FFT (b, Maxn);
        
        for (i = 0; i < Maxn; ++ i) a[i] = a[i] * b[i];
        N = N + M - 2;
        for (FFT (a, Maxn, -1), i = 0; i <= N; ++ i)
            printf ("%d ", int (round (a[i].x)));
        return 0;
    }
        

    Lucas 卢卡斯

    #include <cstdio>
    #include <iostream>
    #define rg register
    inline void read (long long &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 1213231
    typedef long long LL; LL fac[Max];
    LL Pow (LL x, LL p, LL mo)
    {
        LL a = x, res = 1;
        for (; p; p >>= 1, a *= a, a %= mo)
            if (p & 1) res *= a, res %= mo;
        return res % mo;
    }
    LL C (LL N, LL M, LL p) 
    { return M > N ? 0 : ((fac[N] * Pow (fac[M], p - 2, p)) % p * Pow (fac[N - M], p - 2, p) % p); }
    LL Lucas (LL N, LL M, LL P) 
    { return !M ? 1 : (C (N % P, M % P, P) * Lucas (N / P, M / P, P)) % P; }
    int main (int argc, char *argv[])
    {
        LL T, x, y, p, L; read (T); rg int i;
        for (fac[0] = 1; T; -- T)
        {
            read (x), read (y), read (p);
            for (i = 1; i <= p; ++ i) fac[i] = fac[i - 1] * i, fac[i] %= p;
            printf ("%lld
    ", Lucas (x + y, x, p));
        }
        return 0;
    }

    快速排序

    虽然说不让用sort,但是我这种懒癌晚期的人怎么可能去手写sort呢?【其实是不会写

    觉得过意不去,就写了快读和快输

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    struct io
    {
        static const int BUF = 12310330;
        char p[BUF], *s, e[BUF], *t; int a[24];
        io () : s(p), t(e) { fread (s, 1, sizeof p, stdin); }
        ~io () { fwrite (e, 1, t - e, stdout); }
        operator int()
        {
            static int v,j;
            v = 0,j = 1;
            for (v = 0, j = 1; *s < 48; j = *s++ ^ 45);
            do v = v * 10 + *s++ - 48; while (*s > 32);
            return j ? v : -v;
        }
        void print(int v)
        {
            static int *q = a;
            if (!v) *t++ = 48;
            else
            {
                if (v < 0) *t++ = 45, v *= -1;
                for (; v; *q++ = v % 10 + 48, v /= 10);
                for (; q != a; *t++ = *--q);
            }
            *t++ = 32;
        }
    } ip;
    #define Max 100007
    int a[Max]; 
    int main (int argc, char *argv[])
    {
    #define rg register
        int N = ip; rg int i;
        for (i = 1; i <= N; ++ i) a[i] = ip;
        std :: sort (a + 1, a + 1 + N);
        for (i = 1; i <= N; ++ i) ip.print (a[i]);
        return 0;
    }

    负环

    递归spfa判负环

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define rg register
    struct IO
    {
        static const int BUF = 32312312;
        char p[BUF], *s; 
        IO () : s (p) { fread (s, 1, sizeof p, stdin); } 
        operator int ()
        {
            rg int v, j = 1;
            for (v = 0, j = 1; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s > 32);
            return j ? v : -v;
        }
    } ip;
    
    #define Max 400007
    int N, M; bool is[Max], F; 
    int _n[Max << 1], _v[Max << 1], list[Max], EC, _d[Max << 1], dis[Max];
    inline void In (int u, int v, int d)
    { _v[++ EC] = v, _n[EC] = list[u], list[u] = EC, _d[EC] = d; }
    void Check (int n)
    {
        if (F) return ; is[n] = true;
        for (rg int i = list[n], v; i; i = _n[i])
            if (dis[v = _v[i]] > dis[n] + _d[i]) 
            {
                dis[v] = dis[n] + _d[i];
                if (!is[v]) Check (v);
                else { F = true; return ; }
            }
        is[n] = false;
    }
    int main (int argc, char *argv[])
    {
        rg int i, j; int x, y, z; 
        for (int T = ip; T; -- T)
        {
            N = ip, M = ip; F = false;
            for (i = 1; i <= N; ++ i) dis[i] = list[i] = is[i] = false;
            for (i = 1, EC = 0; i <= M; ++ i) 
            {
                x = ip, y = ip, z = ip;
                if (z < 0) In (x, y, z); else In (x, y, z), In (y, x, z);
            }
            for (i = 1; i <= N && !F; Check (i ++));
            puts (F ? "YE5" : "N0");
        }
        return 0;    
    }

     Tarjan强连通分量+缩点+拓扑最长路

    #include <cstdio>
    #include <iostream>
    #include <stack>
    #include <queue>
    #define rg register
    
    struct IO 
    {
        static const int BUF = 12312123;
        char p[BUF], *s;
        IO () : s (p) { fread (s, 1, sizeof p, stdin); }
        operator int ()
        {
            rg int v = 0, f = true;
            for (; *s < 48; f = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s > 32);
            return f ? v : -v; 
        }
    } ip;
    int N;
    #define Max 10004
    int _n[Max * 20], _v[Max * 20], list[Max], EC, key[Max];
    
    inline void In (int u, int v)
    { _v[++ EC] = v, _n[EC] = list[u], list[u] = EC; }
    
    int dfn[Max], low[Max], DC, SC, scc[Max], val[Max]; std :: stack <int> S;
    inline void cmin (int &a, int b) { if (b < a) a = b; }
    void Tarjan (int n)
    {
        dfn[n] = low[n] = ++ DC; S.push (n); rg int v;
        for (rg int i = list[n]; i; i = _n[i])
            if (!dfn[v = _v[i]]) Tarjan (v), cmin (low[n], low[v]);
            else if (!scc[v]) cmin (low[n], dfn[v]);
        if (low[n] == dfn[n]) 
        {
            ++ SC; rg int r;
            for (r = n + 1; r != n; S.pop ())
                scc[r = S.top ()] = SC, val[SC] += key[r];
        }
    }
    
    int ev[Max], en[Max], el[Max], dis[Max], ec, in[Max];
    inline void ei (int u, int v)
    { ev[++ ec] = v, en[ec] = el[u], el[u] = ec; ++ in[v]; }
    
    int f[Max];
    inline void cmax (int &a, int b) { if (b > a) a = b; }
    void Topsort ()
    {
        rg int i, v; std :: queue <int> Q; int s = 0;
        for (i = 1; i <= SC; ++ i) 
            if (in[i] == 0) Q.push (i), f[i] = val[i], cmax (s, f[i]);
        for (int n; !Q.empty (); Q.pop ())
            for (i = el[n = Q.front ()]; i; i = en[i])
            {
                v = ev[i], cmax (f[v], f[n] + val[v]);
                if ((-- in[v]) == 0) Q.push (v);
                cmax (s, f[v]);
            }        
        printf ("%d", s);
    }
    int main (int argc, char *argv[])
    {
        int M; N = ip, M = ip; int x, y, z; rg int i;
        for (i = 1; i <= N; ++ i) key[i] = ip;
        for (i = 1; i <= M; ++ i) In (ip, ip);
        
        for (i = 1; i <= N; ++ i) if (!dfn[i]) Tarjan (i);
        for (int n = 1; n <= N; ++ n)
            for (i = list[n]; i; i = _n[i])
                if (scc[_v[i]] != scc[n]) ei (scc[n], scc[_v[i]]);
                
        Topsort ();  return 0;
    }

     割点(顶)

    #include <cstdio>
    #include <iostream>
    #define rg register
    struct IO
    {
        static const int BUF = 12312332;
        char p[BUF], *s;
        IO () : s (p) { fread (s, 1, sizeof p, stdin); }
        operator int ()
        {
            rg int v = 0, j = 1;
            for (; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s >= 48);
            return j ? v : -v;
        }
        
    } ip;
    #define Max 2000007
    int N, Rt, is[Max];
    inline void cmin (int &a, int b) { if (b < a) a = b; }
    
    int _n[Max], _v[Max], list[Max], EC, dfn[Max], low[Max], DC;
    inline void In (int u, int v)
    { _v[++ EC] = v, _n[EC] = list[u], list[u] = EC; }
    
    void Dfs (int n)
    {
        low[n] = dfn[n] = ++ DC; rg int i, v, r = 0;
        for (i = list[n]; i; i = _n[i])
        {
            v = _v[i];
            if (!dfn[v]) 
            {
                Dfs (v), cmin (low[n], low[v]);
                if (low[v] >= dfn[n] && n != Rt) is[n] = true;
                if (n == Rt) ++ r;
            }
            cmin (low[n], dfn[v]);
        }
        if (r >= 2 && n == Rt) is[Rt] = true;
    }
    int main (int argc, char *argv[])
    {    
        int M, x, y; N = ip, M = ip; rg int i, s = 0;
        for (i = 1; i <= M; ++ i) 
            x = ip, y = ip, In (x, y), In (y, x);
        for (Rt = 1; Rt <= N; ++ Rt)
            if (!dfn[Rt]) Dfs (Rt);
        for (i = 1; i <= N; ++ i) if (is[i]) ++ s;
        for (i = 1, printf ("%d
    ", s); i <= N; ++ i) 
            if (is[i]) printf ("%d ", i);
        return 0;
    }

     高斯消元

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define EPS 1e-8
    #define rg register
    int N;
    #define Max 200
    typedef double flo; flo a[Max][Max];
    inline flo abs (flo x) { return x < 0 ? -x : x; }
    inline void swap (flo &a, flo &b) { flo c = a; a = b, b = c; }
    bool Gauss ()
    {
        rg int i, j, k; flo n;
        for (i = 0; i < N; ++ i)
        {
            for (j = i + 1, k = i; j < N; ++ j)
                if (abs (a[j][i]) > abs (a[k][i])) k = j;
            if ((abs (n = a[k][i])) < EPS) return true;
            for (j = i; j <= N; ++ j) swap (a[i][j], a[k][j]);
            for (j = i; j <= N; ++ j) a[i][j] /= n;
            for (k = 0; k < N; ++ k)
                if (k != i)
                    for (n = a[k][i], j = i; j <= N; ++ j)
                        a[k][j] -= a[i][j] * n;
        }
        return false;
    }
    
    int main (int argc, char *argv[])
    {
        scanf ("%d", &N); rg int i, j;
        for (i = 0; i < N; ++ i)
            for (j = 0; j <= N; ++ j) scanf ("%lf", &a[i][j]);
    
        if (Gauss ()) return puts ("No Solution"), 0; 
    
        for (i = 0; i < N; ++ i) printf ("%.2lf
    ", a[i][N]);
            
        return 0;
    }

     st表

    #include <cstdio>
    #include <iostream>
    
    #define rg register
    struct io
    {
        static const int BUF = 32310330;
        char p[BUF], *s, e[BUF], *t; int a[24];
        io () : s (p), t (e) { fread (s, 1, sizeof p, stdin); }
        ~io () { fwrite (e, 1, t - e, stdout); }
        operator int ()
        {
            static int v, j;
            v = 0,j = 1;
            for (v = 0, j = 1; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s++ - 48; while (*s > 32);
            return j ? v : -v;
        }
        void pt (int v)
        {
            static int *q = a;
            if (!v) *t ++ = 48;
            else
            {
                if (v < 0) *t ++ = 45, v *= -1;
                for (; v; *q ++ = v % 10 + 48, v /= 10);
                for (; q != a; *t ++ = *--q);
            }
            *t++ = '
    ';
        }
    } ip;
    #define Max 100005
    int f[Max][22];
    int lg[Max];
    inline int max (int a, int b) { return a > b ? a : b; }
    int main (int argc, char *argv[])
    {
        int N = ip, M = ip; rg int i, j;
        for (i = 1; i <= N; ++ i) f[i][0] = ip;
        for (lg[0] = 1, i = 2; i <= N; ++ i)
        {
            lg[i] = lg[i - 1];
            if ((1 << lg[i] + 1) == i) ++ lg[i];
        }
        for (i = N; i; -- i)
            for (j = 1; (i + (1 << j) - 1) <= N; ++ j)
                f[i][j] = max (f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
        
        for (int x, y, l; M; -- M)
        {
            x = ip, y = ip;
            l = lg [y - x + 1];
            ip.pt (max (f[x][l], f[y - (1 << l) + 1][l]));
        }
        return 0;
    }

     高精

    #include <cstdio>
    #include <iostream>
    #include <vector>
    #include <iomanip>
    #include <cassert>
    #include <algorithm>
    #include <cstring>
    
    const int Big_B = 10; const int Big_L = 1;
    inline int intcmp_ (int a, int b) { if (a > b) return 1; return a < b ? -1 : 0; }
    struct Int 
    {
    #define rg register
        inline int max (int a, int b) { return a > b ? a : b; }
        inline int min (int a, int b) { return a < b ? a : b; }
        std :: vector <int> c; Int () {} typedef long long LL; 
        Int (int x) { for (; x > 0; c.push_back (x % Big_B), x /= Big_B); }
        Int (LL x) { for (; x > 0; c.push_back (x % Big_B), x /= Big_B); }
        inline void CrZ () { for (; !c.empty () && c.back () == 0; c.pop_back ()); }
        inline Int &operator += (const Int &rhs)
        {
            c.resize (max (c.size (), rhs.c.size ())); rg int i, t = 0, S;
            for (i = 0, S = rhs.c.size (); i < S; ++ i)
                c[i] += rhs.c[i] + t, t = c[i] >= Big_B, c[i] -= Big_B & (-t);
            for (i = rhs.c.size (), S = c.size (); t && i < S; ++ i)
                c[i] += t, t = c[i] >= Big_B, c[i] -= Big_B & (-t);
            if (t) c.push_back (t); return *this;
        }
        inline Int &operator -= (const Int &rhs)
        {
            c.resize (max (c.size (), rhs.c.size ())); rg int i, t = 0, S;
            for (i = 0, S = rhs.c.size (); i < S; ++ i)
                c[i] -= rhs.c[i] + t, t = c[i] < 0, c[i] += Big_B & (-t);
            for (i = rhs.c.size (), S = c.size (); t && i < S; ++ i)
                c[i] -= t, t = c[i] < 0, c[i] += Big_B & (-t);
            CrZ (); return *this;
        }
        inline Int &operator *= (const Int &rhs)
        {
            rg int na = c.size (), i, j, S, ai; 
            c.resize (na + rhs.c.size ()); LL t;
            for (i = na - 1; i >= 0; -- i)
            {
                ai = c[i], t = 0, c[i] = 0;
                for (j = 0, S = rhs.c.size (); j < S; ++ j)
                {
                    t += c[i + j] + (LL) ai * rhs.c[j];
                    c[i + j] = t % Big_B, t /= Big_B;
                }
                for (j = rhs.c.size (), S = c.size (); t != 0 && i + j < S; ++ j)
                    t += c[i + j], c[i + j] = t % Big_B, t /= Big_B;
                assert (t == 0);
            }
            CrZ (); return *this;
        }
        inline Int &operator /= (const Int &rhs) { return *this = div (rhs); }
        inline Int &operator %= (const Int &rhs) { return div (rhs), *this; }
        inline Int &shlb (int l = 1)
        {
            if (c.empty ()) return *this; c.resize (c.size () + l);rg int i;
            for (i = c.size () - 1; i >= l; -- i) c[i] = c[i - l];
            for (i = 0; i < l; ++ i) c[i] = 0;
            return *this;
        }
        inline Int &shrb (int l = 1)
        {
            for (rg int i = 0; i < c.size () - l; ++ i) c[i] = c[i + l];
            c.resize (max (c.size () - l, 0)); return *this;
        }
        inline Int div (const Int &rhs)
        {
            assert (!rhs.c.empty ()); Int q, r; rg int i; if (rhs > *this) return 0;
            q.c.resize (c.size () - rhs.c.size () + 1); rg int _l, _r, mid;
            for (i = c.size () - 1; i > c.size () - rhs.c.size (); -- i) r.shlb (), r += c[i];
            for (i = c.size () - rhs.c.size (); i >= 0; -- i)
            {
                r.shlb (); r += c[i]; 
                if (r.Comp (rhs) < 0) q.c[i] = 0;
                else 
                {
                    _l = 0, _r = Big_B;
                    for (; _l != _r; )
                    {
                        mid = _l + _r >> 1;
                        if ((rhs * mid).Comp (r) <= 0) _l = mid + 1; else _r = mid;
                    }
                    q.c[i] = _l - 1, r -= rhs * q.c[i];
                }
            }
            q.CrZ (), *this = r; return q;
        }
        inline int Comp (const Int &rhs) const 
        {
            if (c.size () != rhs.c.size ()) return intcmp_ (c.size (), rhs.c.size ());
            for (rg int i = c.size () - 1; i >= 0; -- i) 
                if (c[i] != rhs.c[i]) return intcmp_ (c[i], rhs.c[i]);
            return 0;
        }
        friend inline Int operator + (const Int &lhs, const Int &rhs)
        { Int res = lhs; return res += rhs; }
        inline friend Int operator - (const Int &lhs, const Int &rhs)
        { 
            if (lhs < rhs)
            {
                putchar ('-'); 
                Int res = rhs; return res -= lhs;
            }
            else { Int res = lhs; return res -= rhs; }
        }
        friend inline Int operator * (const Int &lhs, const Int &rhs)
        { Int res = lhs; return res *= rhs; }
        friend inline Int operator / (const Int &lhs, const Int &rhs)
        { Int res = lhs; return res.div (rhs); }
        friend inline Int operator % (const Int &lhs, const Int &rhs)
        { Int res = lhs; return res.div (rhs), res; }
        friend inline std :: ostream &operator << (std :: ostream &out, const Int &rhs)
        { 
            if (rhs.c.size () == 0) out << "0";
            else 
            {
                out << rhs.c.back ();
                for (rg int i = rhs.c.size () - 2; i >= 0; -- i)
                    out << std :: setfill ('0') << std :: setw (Big_L) << rhs.c[i];
            }
            return out;
        } 
        friend inline std :: istream &operator >> (std :: istream &in, Int &rhs)
        {
            static char s[100000];
            in >> s + 1; int Len = strlen (s + 1);
            int v = 0; LL r = 0, p = 1;
            for (rg int i = Len; i >= 1; -- i)
            {
                ++ v; r = r + (s[i] - '0') * p, p *= 10;
                if (v == Big_L) rhs.c.push_back (r), r = 0, v = 0, p = 1;
            }
            if (v != 0) rhs.c.push_back (r); return in;
        }
        friend inline bool operator < (const Int &lhs, const Int &rhs)
        { return lhs.Comp (rhs) < 0; }
        friend inline bool operator <= (const Int &lhs, const Int &rhs)
        { return lhs.Comp (rhs) <= 0; }
        friend inline bool operator > (const Int &lhs, const Int &rhs)
        { return lhs.Comp (rhs) > 0; }
        friend inline bool operator >= (const Int &lhs, const Int &rhs)
        { return lhs.Comp (rhs) >= 0; }
        friend inline bool operator == (const Int &lhs, const Int &rhs)
        { return lhs.Comp (rhs) == 0; }
        friend inline bool operator != (const Int &lhs, const Int &rhs)
        { return lhs.Comp (rhs) != 0; }
    #undef rg    
    };
    int Main ()
    {
    
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}

     主席树(区间第k小)

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define rg register
    struct IO
    {
        static const int BUF = 12312332;
        char p[BUF], *s, *t, e[BUF]; int a[24];
        IO () : s (p), t (e) { fread (s, 1, BUF, stdin); }
        ~IO () { fwrite (e, 1, t - e, stdout); }
        operator int ()
        {
            rg int v = 0, j = 1;
            for (; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s >= 48);
            return j ? v : -v;
        }
        void pt (int v)
        {
            static int *q = a;
            if (!v) *t ++ = 48;
            else
            {
                if (v < 0) *t ++ = 45;
                for (; v; *q ++ = v % 10 + 48, v /= 10);
                for (; q != a; *t ++ = *-- q);
            }
            *t ++ = '
    ';    
        }
    } ip;
    
    #define Max 600006
    namespace pr
    {
        int c[Max * 20][2], C, v[Max * 20], rt[Max];
        void Updata (int pre, int &n, int l, int r, int t)
        {
            n = ++ C; v[n] = v[pre] + 1;
            if (l == r) return ;
            int m = l + r >> 1;
            if (t <= m) Updata (c[pre][0], c[n][0], l, m, t), c[n][1] = c[pre][1];
            else Updata (c[pre][1], c[n][1], m + 1, r, t), c[n][0] = c[pre][0];
        }
        
        int Query (int pre, int &n, int l, int r, int k)
        {
            if (l == r) return l;
            int m = l + r >> 1, res = v[c[n][0]] - v[c[pre][0]];
            if (k <= res) return Query (c[pre][0], c[n][0], l, m, k);
            return Query (c[pre][1], c[n][1], m + 1, r, k - res);
        }
    }
    int a[Max], data[Max], C;
    int main (int argc, char *argv[])
    {
        int N = ip, M = ip; rg int i;
        
        for (i = 1; i <= N; ++ i) a[i] = ip, data[++ C] = a[i];
        
        std :: sort (data + 1, data + 1 + N);
        int S = std :: unique (data + 1, data + 1 + N) - data - 1;
        
        for (i = 1; i <= N; ++ i)
        {
            a[i] = std :: lower_bound (data + 1, data + 1 + S, a[i]) - data;
            pr :: Updata (pr :: rt[i - 1], pr :: rt[i], 1, S, a[i]);
        }
        
        int x, y, z;
        for (i = 1; i <= M; ++ i)
        {
            x = ip, y = ip, z = ip;
            ip.pt (data[pr :: Query (pr :: rt[x - 1], pr :: rt[y], 1, S, z)]);
        }
        return 0;
    }

     树状数组(单点修改,区间求和)

    #include <cstdio>
    #include <iostream>
    #define rg register
    struct IO 
    {
        static const int BUF = 12312313;
        char *s, *t, p[BUF], e[BUF]; int a[24];
        IO () : s (p), t (e) { fread (s, 1, BUF, stdin); }
        ~IO () { fwrite (e, 1, t - e, stdout); }
        
        operator int ()
        {
            rg int v = 0, j = 1;
            for (; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s >= 48);
            return j ? v : -v;
        }
        
        void pt (int v)
        {
            static int *q = a;
            if (!v) *t ++ = 48;
            else 
            {
                if (v < 0) *t ++ = 45;
                for (; v; *q ++ = v % 10 + 48, v /= 10);
                for (; q != a; *t ++ = *-- q);
            }
            *t ++ = '
    ';
        }
    } ip;
    
    #define Max 1325630
    namespace bit
    {
        int v[Max], N;
        inline void Pre (int x) { N = x; } 
        
        int Query (int l, int r)
        {
            rg int i, res = 0;
            for (i = l - 1; i; i -= i & -i) res -= v[i];
            for (i = r; i; i -= i & -i) res += v[i];
            return res;
        }
        
        void Change (int p, int t)
        { for (rg int i = p; i <= N; i += i & -i) v[i] += t; return ; }
        
    }
    int main (int argc, char *argv[])
    {
        int N = ip, M = ip; rg int i; bit :: Pre (N);
        
        for (i = 1; i <= N; ++ i) bit :: Change (i, ip);
        
        for (int t, x, y; M; -- M)
        {
            t = ip, x = ip, y = ip;
            if (t == 1) bit :: Change (x, y);
            else ip.pt (bit :: Query (x, y));
        }
        return 0;
    }

     LCA (树剖)

    #include <cstdio>
    #include <iostream>
    #define rg register
    
    struct IO 
    {
        static const int BUF = 12312313;
        char *s, *t, p[BUF], e[BUF]; int a[24];
        IO () : s (p), t (e) { fread (s, 1, BUF, stdin); }
        ~IO () { fwrite (e, 1, t - e, stdout); }
        
        operator int ()
        {
            rg int v = 0, j = 1;
            for (; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s >= 48);
            return j ? v : -v;
        }
        
        void pt (int v)
        {
            static int *q = a;
            if (!v) *t ++ = 48;
            else 
            {
                if (v < 0) *t ++ = 45;
                for (; v; *q ++ = v % 10 + 48, v /= 10);
                for (; q != a; *t ++ = *-- q);
            }
            *t ++ = '
    ';
        }
    } ip; 
    #define Max 500009
    int _n[Max << 1], _v[Max << 1], list[Max], EC;
    inline void In (int u, int v)
    { _v[++ EC] = v, _n[EC] = list[u], list[u] = EC; }
    
    int up[Max], son[Max], s[Max], f[Max], d[Max];
    void Dfs_1 (int n, int F)
    {
        f[n] = F, d[n] = d[F] + 1, s[n] = 1; rg int i, v;
        for (i = list[n]; i; i = _n[i])
            if ((v = _v[i]) != F)
            {
                Dfs_1 (v, n), s[n] += s[v];
                if (s[son[n]] < s[v]) son[n] = v;
            }
    }
    
    void Dfs_2 (int n, int c)
    {
        up[n] = c; if (son[n]) Dfs_2 (son[n], c); else return ;
        for (rg int i = list[n], v; i; i = _n[i])
            if ((v = _v[i]) != f[n] && v != son[n]) Dfs_2 (v, v);
    }
    inline void swap (int &a, int &b) { int c = a; a = b, b = c; }
    int Lca (int x, int y)
    {
        for (; up[x] != up[y]; x = f[up[x]])
            if (d[up[x]] < d[up[y]]) swap (x, y);
        return d[x] < d[y] ? x : y;
    }
    
    int main (int argc, char *argv[])
    {
        int N = ip, M = ip, Rt = ip, x, y; rg int i; 
        for (i = 1; i < N; ++ i)
            x = ip, y = ip, In (x, y), In (y, x);
        Dfs_1 (Rt, 0), Dfs_2 (Rt, Rt);
        for (; M; -- M) ip.pt (Lca (ip, ip));
        return 0;
    }

     最短路(堆dij)

    #include <cstdio>
    #include <iostream>
    #include <queue>
    #include <cstring>
    #define rg register
    struct IO
    {
        static const int BUF = 12312332;
        char p[BUF], *s;
        IO () : s (p) { fread (s, 1, sizeof p, stdin); }
        operator int ()
        {
            rg int v = 0, j = 1;
            for (; *s < 48; j = *s ++ ^ 45);
            do v = v * 10 + *s ++ - 48; while (*s >= 48);
            return j ? v : -v;
        }
        
    } ip;
    
    struct D 
    { 
        int id, d; D (int a = 0, int b = 0) : id (a), d (b) {} 
        bool operator < (const D &rhs) const { return d > rhs.d; }
    };
    #define Max 100000
    bool is[Max]; int _v[Max], _n[Max], list[Max], _d[Max], d[Max], EC;
    
    void Dij (int S, int T)
    {
        std :: priority_queue <D> Q; Q.push (D (S, 0)); rg int i, n, v;
        for (D res; !Q.empty (); )
        {
            res = Q.top (); Q.pop ();
            if (is[res.id]) is[res.id] = true;
            if (res.id == T) return ;
            for (n = res.id, i = list[n]; i; i = _n[i])
                if (d[v = _v[i]] > d[n] + _d[i])
                    d[v] = d[n] + _d[i], Q.push (D (v, d[v]));
        }
    }
    
    inline void In (int u, int v, int d)
    { _v[++ EC] = v, _n[EC] = list[u], list[u] = EC, _d[EC] = d; }
    
    int main (int argc, char *argv[])
    {
        int N = ip, M = ip, S = ip, T = ip, x, y, z; rg int i;
        memset (d, 0x3f, sizeof d);
        
        for (i = 1; i <= M; ++ i)
            x = ip, y = ip, z = ip, In (x, y, z), In (y, x, z);
        Dij (S, T);
        printf ("%d", d[T]);
        
        return 0;
    }

     线段树(区间加,区间乘,区间求和)

    #include <cstdio>
    #include <iostream>
    typedef long long LL;
    #define rg register
    inline void read (LL &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 100009
    int L[Max << 2], R[Max << 2]; LL sm[Max << 2], tag1[Max << 2], tag2[Max << 2];
    LL a[Max], P;
    
    void Build (int n, int l, int r)
    {
        L[n] = l, R[n] = r, tag2[n] = 1;
        if (l == r) { sm[n] = a[l], tag2[n] = 1; return ; }
        int m = l + r >> 1;
        Build (n << 1, l, m), Build (n << 1 | 1, m + 1, r);
        (sm[n] = sm[n << 1] + sm[n << 1 | 1]) %= P;
    }
    inline void Down (int n)
    {
        int lc = n << 1, rc = n << 1 | 1;
        if (tag2[n] != 1) 
        {
            LL &t = tag2[n];
            (tag1[lc] *= t) %= P, (tag1[rc] *= t) %= P;
            (tag2[lc] *= t) %= P, (tag2[rc] *= t) %= P;
            (sm[lc] *= t) %= P, (sm[rc] *= t) %= P; t = 1;
        }
        if (tag1[n])
        {
            LL &t = tag1[n];
            (tag1[lc] += t) %= P, (tag1[rc] += t) %= P;
            (sm[lc] += (R[lc] - L[lc] + 1) * t) %= P, (sm[rc] += (R[rc] - L[rc] + 1) * t) %= P;
            t = 0;
        }
    }
    void Modi (int n, int l, int r, bool t, LL to)
    {
        if (l <= L[n] && R[n] <= r)
        {
            if (t == false) (tag1[n] += to) %= P, (sm[n] += (R[n] - L[n] + 1) * to) %= P; 
            else (tag1[n] *= to) %= P, (tag2[n] *= to) %= P, (sm[n] *= to) %= P;        
            return ;    
        }
        Down (n); int m = L[n] + R[n] >> 1;
        if (l <= m) Modi (n << 1, l, r, t, to);
        if (r > m) Modi (n << 1 | 1, l, r, t, to);
        (sm[n] = sm[n << 1] + sm[n << 1 | 1]) %= P;
    }
    
    LL Query (int n, int l, int r)
    {
        if (l <= L[n] && R[n] <= r) return sm[n];
        Down (n); LL res = 0; int m = L[n] + R[n] >> 1;
        (sm[n] = sm[n << 1] + sm[n << 1 | 1]) %= P;
        if (l <= m) res = Query (n << 1, l, r);
        if (r > m) res += Query (n << 1 | 1, l, r);
        return res % P;
    }
    
    int main (int argc, char *argv[])
    {
        int N, M; scanf ("%d%d", &N, &M); read (P); LL t, x, y, z;
        for (rg int i = 1; i <= N; ++ i) read (a[i]);
        for (Build (1, 1, N); M; -- M)
        {
            read (t), read (x), read (y);
            if (t == 1)
                read (z), Modi (1, x, y, true, z);
            else if (t == 2)
                read (z), Modi (1, x, y, false, z);
            else printf ("%lld
    ", Query (1, x, y));
        }
        return 0;
    }
  • 相关阅读:
    ssh 代理详细解释
    c++ extern c
    php 删除换行符
    doxygen 模板
    php 判断字符串
    php 链接 mysql 数据库
    远程桌面管理:tsmmc.msc在xp系统中的使用
    更改Server 2008域用户密码策略
    Windows Server 2008 IIS7部署
    iis6中FTP配置的技巧和细节
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/7787777.html
Copyright © 2011-2022 走看看