UVA - 12532 Interval Product

本文介绍了一个编程游戏,玩家需要处理一系列整数,并响应修改或计算指定区间乘积符号的指令。文章提供了完整的C++实现代码,包括使用线段树进行区间更新和查询的高效算法。

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
 
NoneGraph Theory 2-SAT Articulation/Bridge/Biconnected Component Cycles/Topological Sorting/Strongly Connected Component Shortest Path Bellman Ford Dijkstra/Floyd Warshall Euler Trail/Circuit Heavy-Light Decomposition Minimum Spanning Tree Stable Marriage Problem Trees Directed Minimum Spanning Tree Flow/Matching Graph Matching Bipartite Matching Hopcroft–Karp Bipartite Matching Weighted Bipartite Matching/Hungarian Algorithm Flow Max Flow/Min Cut Min Cost Max FlowDFS-like Backtracking with Pruning/Branch and Bound Basic Recursion IDA* Search Parsing/Grammar Breadth First Search/Depth First Search Advanced Search Techniques Binary Search/Bisection Ternary SearchGeometry Basic Geometry Computational Geometry Convex Hull Pick's TheoremGame Theory Green Hackenbush/Colon Principle/Fusion Principle Nim Sprague-Grundy NumberMatrix Gaussian Elimination Matrix ExponentiationData Structures Basic Data Structures Binary Indexed Tree Binary Search Tree Hashing Orthogonal Range Search Range Minimum Query/Lowest Common Ancestor Segment Tree/Interval Tree Trie Tree Sorting Disjoint SetString Aho Corasick Knuth-Morris-Pratt Suffix Array/Suffix TreeMath Basic Math Big Integer Arithmetic Number Theory Chinese Remainder Theorem Extended Euclid Inclusion/Exclusion Modular Arithmetic Combinatorics Group Theory/Burnside's lemma Counting Probability/Expected ValueOthers Tricky Hardest Unusual Brute Force Implementation Constructive Algorithms Two Pointer Bitmask Beginner Discrete Logarithm/Shank's Baby-step Giant-step Algorithm Greedy Divide and ConquerDynamic ProgrammingTag it!

[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 XIx XI+1x ... x XJ-1x 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\n",u);
        insert(1,i,u);

    }

    char p;
    int r=0;
    for(i=1;i<=m;i++)
    {
     // printf("AAA\n");
        getchar();
       scanf("%c",&p);
        //printf("p=%c\n",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\n",y);
                 //printf("aa\n");
                 insert(1,x,y);
              }
          if(p=='P')
            {
                scanf("%d%d",&x,&y);
                sum(1,x,y);
              //  printf("out=%d\n",out);
                 if(out>0)
                  {
                     str[r++]='+';
                    //  printf("+\n");
                  }
                 else if(out<0)
                     {
                         str[r++]='-';
                         // printf("-\n");
                     }
                  else
                  {
                     str[r++]='0';
                     // printf("0\n");
                  }
                        out=1;
            }
        }
        str[r] = '\0';
        printf("%s\n",str);
   }
     return 0;
}

 

转载于:https://www.cnblogs.com/cancangood/p/4712584.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值