zoukankan      html  css  js  c++  java
  • [Codeforces 489E] Nastya and King-Shamans

    [题目链接]

            http://codeforces.com/contest/992/problem/E

    [算法]

            线段树 + 二分

             时间复杂度 : O(NlogN^2)

    [代码]

            

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 2e5 + 10;
    typedef long long ll;
    
    struct Node
    {
        int l,r;
        ll mx,sum;
    } Tree[MAXN << 2];
    
    int i,n,q,x,y,cur,tmp,ans;
    ll value[MAXN];
    ll pre;
    
    template <typename T> inline void read(T &x)
    {
        int 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;
    }
    inline void update(int index)
    {
        Tree[index].mx = max(Tree[index << 1].mx,Tree[index << 1 | 1].mx);
        Tree[index].sum = Tree[index << 1].sum + Tree[index << 1 | 1].sum;
    }
    inline void build(int index,int l,int r)
    {
        int mid;
        Tree[index].l = l;
        Tree[index].r = r;
        if (l == r)
        {
            Tree[index].mx = value[l];
            Tree[index].sum = value[l];
            return;
        }
        mid = (l + r) >> 1;
        build(index << 1,l,mid);
        build(index << 1 | 1,mid + 1,r);
        update(index);
    }
    inline void modify(int index,int pos,int val)
    {
        int mid;
        if (Tree[index].l == Tree[index].r)
        {
            Tree[index].mx = Tree[index].sum = val;
            return;
        }
        mid = (Tree[index].l + Tree[index].r) >> 1;
        if (mid >= pos) modify(index << 1,pos,val);
        else modify(index << 1 | 1,pos,val);
        update(index);
    }
    inline int query(int index,int l,int r,ll val)
    {
        int mid,tmp;
        if (Tree[index].l == l && Tree[index].r == r)
        {
            if (Tree[index].mx < val) return -1;
            if (l == r) return l;
            mid = (Tree[index].l + Tree[index].r) >> 1;
            if (Tree[index << 1].mx >= val) return query(index << 1,l,mid,val);
            else return query(index << 1 | 1,mid + 1,r,val);    
        }    
        mid = (Tree[index].l + Tree[index].r) >> 1;
        if (mid >= r) tmp = query(index << 1,l,r,val);
        else if (mid + 1 <= l) tmp = query(index << 1 | 1,l,r,val);
        else 
        {
            tmp = query(index << 1,l,mid,val);
            if (tmp != -1) return tmp;
            return query(index << 1 | 1,mid + 1,r,val);
        }
        return tmp;
    }
    inline ll query_sum(int index,int l,int r)
    {
        int mid;
        if (Tree[index].l == l && Tree[index].r == r) return Tree[index].sum;
        mid = (Tree[index].l + Tree[index].r) >> 1;
        if (mid >= r) return query_sum(index << 1,l,r);
        else if (mid + 1 <= l) return query_sum(index << 1 | 1,l,r);
        else return query_sum(index << 1,l,mid) + query_sum(index << 1 | 1,mid + 1,r);
    }
    int main()
    {
        
        read(n); read(q);
        for (i = 1; i <= n; i++) read(value[i]);
        build(1,1,n);
        while (q--)
        {
            read(x); read(y);
            value[x] = y;
            modify(1,x,y);
            if (value[1] == 0)
            {
                printf("1
    ");
                continue;    
            }    
            cur = pre = tmp = 0; ans = -1;
            while (cur < n)
            {
                tmp = query(1,cur + 1,n,pre);
                if (tmp == -1) break;
                cur = tmp;
                pre = query_sum(1,1,tmp);
                if (pre - value[cur] == value[cur]) 
                {
                    ans = tmp;
                    break;
                }
            }
            printf("%d
    ",ans);
        }
        
        return 0;
    }
  • 相关阅读:
    能让你少写1000行代码的20个正则表达式
    无法识别特性“configProtectionProvider”的解决方案
    C# 对 App.config的appSettings节点数据进行加密
    SQL数据库分配权限
    在C#项目中需要用double类型操作MSSQL float类型数据(附C#数据类型和SQL数据类型对照)
    Linux一键安装web环境全攻略phpstudy版
    阿里云linux服务器到期后续费,网站打不开解决方法之一
    onethink上传到服务器(或者迁移)后台登录验证码错误问题
    PHPCMS网站迁移过程后,添加内容 报500错误解决方案
    css3 media媒体查询器用法总结
  • 原文地址:https://www.cnblogs.com/evenbao/p/9487674.html
Copyright © 2011-2022 走看看