• [Codeforces 914D] Bash and a Tough Math Puzzle


    [题目链接]

             https://codeforces.com/contest/914/problem/D

    [算法]

             显然 , 当一个区间[l , r]中为d倍数的数的个数 <= 1 , 答案为Yes , 否则为No

             线段树简单维护即可 , 详见代码 , 时间复杂度 : O(NlogN ^ 2)

    [代码]

           

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 5e5 + 10;
    
    int n , m;
    int val[MAXN];
    int cnt;
    
    struct Segment_Tree
    {
        struct Node
        {
            int l , r;
            int value;    
        } a[MAXN << 2];
        inline int gcd(int x , int y)
        {
            if (y == 0) return x;
            else return gcd(y , x % y);
        }
        inline void update(int x)
        {
            a[x].value = gcd(a[x << 1].value , a[x << 1 | 1].value);
        }
        inline void build(int index , int l , int r)
        {
            a[index].l = l , a[index].r = r;
            if (l == r)
            {
                a[index].value = val[l];
                return;
            }
            int mid = (l + r) >> 1;
            build(index << 1 , l , mid);
            build(index << 1 | 1 , mid + 1 , r);
            update(index);
        }
        inline void modify(int index , int x , int y)
        {
            if (a[index].l == a[index].r)
            {
                a[index].value = y;
                return;
            } else
            {
                int mid = (a[index].l + a[index].r) >> 1;
                if (mid >= x) modify(index << 1 , x , y);
                else modify(index << 1 | 1 , x , y);
                update(index);
            }
        }
        inline void getans(int index , int l , int r , int d)
        {
            if (cnt > 1) return;
            int mid = (a[index].l + a[index].r) >> 1;
            if (a[index].l == l && a[index].r == r)
            {
                if (l == r) 
                {
                    if (a[index].value % d) 
                        ++cnt;
                    return;
                }
                if ((a[index << 1].value % d) && (a[index << 1 | 1].value % d)) 
                {
                    cnt += 2;
                    return;
                } else if (a[index << 1].value % d) getans(index << 1 , l , mid , d);
                else if (a[index << 1 | 1].value % d) getans(index << 1 | 1 , mid + 1 , r , d);
            } else
            {
                if (mid >= r) getans(index << 1 , l , r , d);
                else if (mid + 1 <= l) getans(index << 1 | 1 , l , r , d);
                else 
                {
                    getans(index << 1 , l , mid , d);
                    getans(index << 1 | 1 , mid + 1 , r , d);
                }
            }
        }
    } SGT;
    
    template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
    template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
    template <typename T> inline void read(T &x) 
    {
        T f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
        for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
        x *= f;        
    }
    
    int main()
    {
        
        read(n);
        for (int i = 1; i <= n; i++) read(val[i]);
        SGT.build(1 , 1 , n);
        read(m);
        while (m--)
        {
            int type;
            read(type);
            if (type == 1)
            {
                int l , r , x;
                read(l); read(r); read(x);
                cnt = 0;
                SGT.getans(1 , l , r , x);
                if (cnt > 1) printf("NO
    ");
                else printf("YES
    ");    
            } else
            {
                int x , y;
                read(x); read(y);
                SGT.modify(1 , x , y);
            }
        }
        
        return 0;
    }
  • 相关阅读:
    CF1172F
    CF506E
    【清华集训2014】玛里苟斯
    CF516E Drazil and His Happy Friends
    [NOI2017]游戏(2-SAT)
    [bzoj2878][Noi2012]迷失游乐园(基环树dp)
    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
    [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
    [AT2306]Rearranging(拓扑序)
    [bzoj5301][Cqoi2018]异或序列
  • 原文地址:https://www.cnblogs.com/evenbao/p/10099340.html
Copyright © 2020-2023  润新知