• uva 12532


    一个简单的线段树;

    被我看错题了,浪费一个半小时;

     1 #include<cstdio>
     2 #define maxn 500005
     3 using namespace std;
     4 
     5 struct tree
     6 {
     7     int l,r,value;
     8     tree *right,*left;
     9 }tr[maxn];
    10 int nonocount;
    11 int ans;
    12 
    13 void build(tree *rt,int l,int r)
    14 {
    15     rt->l=l;
    16     rt->r=r;
    17     if(l==r)
    18     {
    19         scanf("%d",&rt->value);
    20         if(rt->value>0)rt->value=1;
    21         else if(rt->value==0)rt->value=0;
    22         else rt->value=-1;
    23         return;
    24     }
    25     nonocount++;
    26     rt->left=tr+nonocount;
    27     nonocount++;
    28     rt->right=tr+nonocount;
    29     int mid=(l+r)>>1;
    30     build(rt->left,l,mid);
    31     build(rt->right,mid+1,r);
    32     rt->value=(rt->left->value)*(rt->right->value);
    33 }
    34 
    35 void insert(tree *rt,int p,int x)
    36 {
    37     if(rt->l==p&&rt->r==p)
    38     {
    39         rt->value=x;
    40         if(rt->value>0)rt->value=1;
    41         else if(rt->value==0)rt->value=0;
    42         else rt->value=-1;
    43         return;
    44     }
    45     int mid=(rt->r+rt->l)>>1;
    46     if(p<=mid)insert(rt->left,p,x);
    47     else insert(rt->right,p,x);
    48     rt->value=(rt->left->value)*(rt->right->value);
    49 }
    50 
    51 void query(tree *rt,int l,int r)
    52 {
    53     if(l==rt->l&&r==rt->r)
    54     {
    55         ans=ans*(rt->value);
    56         return;
    57     }
    58     int mid=(rt->l + rt->r)/2;
    59     if(r<=mid)query(rt->left,l,r);
    60     else if(l>mid)query(rt->right,l,r);
    61     else
    62     {
    63         query(rt->left,l,mid);
    64         query(rt->right,mid+1,r);
    65     }
    66 }
    67 
    68 char s[10];
    69 int main()
    70 {
    71 //    freopen("in.txt","r",stdin);
    72     int n,k,a,b;
    73     while(scanf("%d%d",&n,&k)!=EOF)
    74     {
    75         nonocount=0;
    76         build(tr,1,n);
    77         for(int i=0;i<k;i++)
    78         {
    79             scanf("%s",&s);
    80             if(s[0]=='C')
    81             {
    82                 scanf("%d%d",&a,&b);
    83                 insert(tr,a,b);
    84             }
    85             else if(s[0]=='P')
    86             {
    87                 ans=1;
    88                 scanf("%d%d",&a,&b);
    89                 query(tr,a,b);
    90                 if(ans==0)printf("0");
    91                 else if(ans>0)printf("+");
    92                 else if(ans<0)printf("-");
    93             }
    94         }
    95         puts("");
    96     }
    97     return 0;
    98 }
    View Code
  • 相关阅读:
    Linux常用命令大全
    C# 多线程、控制线程数提高循环输出效率
    【Redis笔记(四)】 Redis数据结构
    Redis 详解 (一) StackExchange.Redis Client
    C#中的线程(一)入门
    C#多线程
    StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
    【转】C#中使用Redis学习二 在.NET4.5中使用redis hash操作
    使用MongoDB.NET 2.2.4驱动版本对 Mongodb3.3数据库中GridFS增删改查
    .Net-Mongodb学习大全网址
  • 原文地址:https://www.cnblogs.com/yours1103/p/3389835.html
Copyright © 2020-2023  润新知