• UVA 12532 Interval Product


    线段树水题,忽略每个数的大小,只记住他们的正负即可,规规矩矩的代码。不过这是我第一次完全自己写的一次A的代码了。纪念一下。。。

    #include <iostream>
    #include <cstdio>
    using namespace std;
    #define N 100010
    
    int tree[4*N];
    int x;
    char ans[100005];
    
    void build(int l,int r,int rt)
    {
        if(l == r)
        {
            cin>>x;
            if(x>0)
                tree[rt] = 1;
            else if(x == 0)
                tree[rt] = 0;
            else
                tree[rt] = -1;
            return;
        }
        int mid = (l+r)/2;
        build(l,mid,2*rt);
        build(mid+1,r,2*rt+1);
        tree[rt] = tree[2*rt]*tree[2*rt+1];
    }
    
    void change(int l,int r,int pos,int val,int rt)
    {
        if(l == r)
        {
            if(val<0)
                tree[rt] = -1;
            else if(val == 0)
                tree[rt] = 0;
            else
                tree[rt] = 1;
            return;
        }
        int mid = (l+r)/2;
        if(pos<=mid)
            change(l,mid,pos,val,2*rt);
        else
            change(mid+1,r,pos,val,2*rt+1);
        tree[rt] = tree[2*rt]*tree[2*rt+1];
    }
    
    int query(int l,int r,int aa,int bb,int rt)
    {
        if(aa>r||bb<l)
            return 0;
        if(aa<=l&&bb>=r)
            return tree[rt];
        int mid = (l+r)/2;
        if(bb<=mid)
            return query(l,mid,aa,bb,2*rt);
        if(aa>mid)
            return query(mid+1,r,aa,bb,2*rt+1);
        return query(l,mid,aa,bb,2*rt)*query(mid+1,r,aa,bb,2*rt+1);
    }
    int main()
    {
        int n,k,i,j;
        int ka;
        char ss[5];
        int aa,bb;
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            ka = 0;
            memset(ans,0,sizeof(ans));
            build(1,n,1);
            for(i=0;i<k;i++)
            {
                scanf("%s %d %d",ss,&aa,&bb);
                if(ss[0] == 'C')
                {
                    change(1,n,aa,bb,1);
                }
                else
                {
                    int res = query(1,n,aa,bb,1);
                    if(res > 0)
                        ans[ka++] = '+';
                    else if(res < 0)
                        ans[ka++] = '-';
                    else
                        ans[ka++] = '0';
                }
            }
            printf("%s
    ",ans);
        }
        return 0;
    }
    View Code

    作者:whatbeg
    出处1:http://whatbeg.com/
    出处2:http://www.cnblogs.com/whatbeg/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章抢先看?详见我的独立博客: whatbeg.com

  • 相关阅读:
    编程术语英汉对照
    asp.net常用函数
    好的博客地址
    读取项目中的txt文件内容
    Web Service的定义
    ADO.NET在开发中的部分使用方法和技巧
    如何实现文本框焦点自动跳转及通过回车键提交表单
    15位和18位身份证JS校验实例
    PL/SQL 操作数据库常见脚本
    android 隐藏标题栏
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3472889.html
Copyright © 2020-2023  润新知