zoukankan      html  css  js  c++  java
  • UVA

    http://acm.bnu.edu.cn/v3/problem_show.php?pid=27853

    Interval Product

    Time Limit: 2000ms
    Memory Limit: 131072KB
    This problem will be judged on UVA. Original ID: 12532
    64-bit integer IO format: %lld Java class name: Main
    Type:
    None
     

    [PDF Link]

    It's normal to feel worried and tense the day before a programming contest. To relax, you went out for a drink with some friends in a nearby pub. To keep your mind sharp for the next day, you decided to play the following game. To start, your friends will give you a sequence of N integers X1, X2,..., XN. Then, there will be K rounds; at each round, your friends will issue a command, which can be:
    • a change command, when your friends want to change one of the values in the sequence; or
    • a product command, when your friends give you two values I, J and ask you if the product XI x XI+1 x ... x XJ-1 x XJ is positive, negative or zero.

    Since you are at a pub, it was decided that the penalty for a wrong answer is to drink a pint of beer. You are worried this could affect you negatively at the next day's contest, and you don't want to check if Ballmer's peak theory is correct. Fortunately, your friends gave you the right to use your notebook. Since you trust more your coding skills than your math, you decided to write a program to help you in the game.

    Input

    Each test case is described using several lines. The first line contains two integers N and K, indicating respectively the number of elements in the sequence and the number of rounds of the game ( 1$ le$N, K$ le$105). The second line contains N integers Xi that represent the initial values of the sequence ( -100$ le$Xi$ le$100 for i = 1, 2,..., N). Each of the next K lines describes a command and starts with an uppercase letter that is either `C' or `P'. If the letter is `C', the line describes a change command, and the letter is followed by two integers I and V indicating that XI must receive the value V ( 1$ le$I$ le$N and -100$ le$V$ le$100). If the letter is `P', the line describes a product command, and the letter is followed by two integers I and J indicating that the product from XI to XJ, inclusive must be calculated ( 1$ le$I$ le$J$ le$N). Within each test case there is at least one product command.

    Output

    For each test case output a line with a string representing the result of all the product commands in the test case. The i-th character of the string represents the result of the i-th product command. If the result of the command is positive the character must be `+' (plus); if the result is negative the character must be `-' (minus); if the result is zero the character must be `0' (zero).

    Sample Input

    4 6
    -2 6 0 -1
    C 1 10
    P 1 4
    C 3 7
    P 2 2
    C 4 -5
    P 1 4
    5 9
    1 5 -2 4 3
    P 1 2
    P 1 5
    C 4 -5
    P 1 5
    P 4 5
    C 3 0
    P 1 5
    C 4 -5
    C 4 -5
    

    Sample Output

    0+-
    +-+-0
    #include<iostream>
    #include<cstdio>
    #define maxn 1000005
    struct  node
    {
        int left,right;
        int num;
    }tree[3*maxn];
    int out=1;
    void build(int left,int right,int i)
    {
        tree[i].left=left;
        tree[i].right=right;
        tree[i].num=0;
        if(tree[i].left==tree[i].right)
             return ;
        int mid=(left+right)/2;
        build(left,mid,2*i);
        build(mid+1,right,2*i+1);
    }
    void insert(int id,int i,int j)
    {
          if(tree[id].left==i&&tree[id].right==i)
                   {
    
                       tree[id].num=j;
                    }
          if(tree[id].left==tree[id].right)
                     return ;
        if(i>tree[id].right)
            return;
        if(i<tree[id].left)
                return;
         int mid=(tree[id].left+tree[id].right)/2;
         if(i<=mid)
             insert(id*2,i,j);
         else
             insert(id*2+1,i,j);
        tree[id].num=tree[2*id].num*tree[2*id+1].num;
    
    }
    void sum(int id,int i,int j)
    {
        int mid=(tree[id].left+tree[id].right)/2;
        if(tree[id].left==i&&tree[id].right==j)
         {
    
             out*=tree[id].num;
                 return ;
         }
         if(j<=mid)
           sum(id*2,i,j);
         else if(i>mid)
             sum(id*2+1,i,j);
         else
         {
            sum(id*2,i,mid);
            sum(id*2+1,mid+1,j);
         }
    }
    int main()
    {
        int i,x,y,n,m,u,num;
    
       while(~ scanf("%d%d",&n,&m))
       {
           char str[1000006];
           build(1,n,1);
         for(i=1;i<=n;i++)
        {
            scanf("%d",&u);
            if(u>0)
               u=1;
             else if(u==0)
                   u=0;
             else
               u=-1;
          //  printf("u=%d
    ",u);
            insert(1,i,u);
    
        }
    
        char p;
        int r=0;
        for(i=1;i<=m;i++)
        {
         // printf("AAA
    ");
            getchar();
           scanf("%c",&p);
            //printf("p=%c
    ",p);
              if(p=='C')
                 {
                    scanf("%d%d",&x,&y);
                 if(y>0)
                   y=1;
                else if(y==0)
                   y=0;
                else
                   y=-1;
               // printf("y=%d
    ",y);
                     //printf("aa
    ");
                     insert(1,x,y);
                  }
              if(p=='P')
                {
                    scanf("%d%d",&x,&y);
                    sum(1,x,y);
                  //  printf("out=%d
    ",out);
                     if(out>0)
                      {
                         str[r++]='+';
                        //  printf("+
    ");
                      }
                     else if(out<0)
                         {
                             str[r++]='-';
                             // printf("-
    ");
                         }
                      else
                      {
                         str[r++]='0';
                         // printf("0
    ");
                      }
                            out=1;
                }
            }
            str[r] = '';
            printf("%s
    ",str);
       }
         return 0;
    }
  • 相关阅读:
    [编写高质量代码:改善java程序的151个建议]建议72 生成字列表后不要再操作原列表
    [编写高质量代码:改善java程序的151个建议]建议71 推荐使用subList处理局部列表
    [编写高质量代码:改善java程序的151个建议]建议70 子列表只是原列表的一个视图
    程序员的简历到底该怎么写?(转)
    SQL数据库数据优化SQL优化总结( 百万级数据库优化方案)
    sqlserver的四种分页方式
    sql server中截取字符串的常用函数(自己经常到用的时候想不起来所以拿到这里)
    SQL之存储过程详细介绍及语法(篇幅比较长慢慢看)
    超经典SQL练习题,做完这些你的SQL就过关了
    SqlServer 数据库引擎优化顾问优化数据库(消耗内存很大)
  • 原文地址:https://www.cnblogs.com/cancangood/p/4712584.html
Copyright © 2011-2022 走看看