zoukankan      html  css  js  c++  java
  • 敌兵布阵

    Lily特别喜欢养花,但是由于她的花特别多,所以照料这些花就变得不太容易。她把她的花依次排成一行,每盆花都有一个美观值。如果Lily把某盆花照料的好的话,这盆花的美观值就会上升,如果照料的不好的话,这盆花的美观值就会下降。有时,Lily想知道某段连续的花的美观值之和是多少,但是,Lily的算术不是很好,你能快速地告诉她结果吗?Input

    第一行一个整数T,表示有T组测试数据。
    每组测试数据的第一行为一个正整数N (N<=50000),表示Lily有N盆花。
    接下来有N个正整数,第i个正整数ai(1<=ai<=50) 表示第i盆花的初始美观值。
    接下来每行有一条命令,命令有4种形式:
    (1)Add i j, i和j为正整数,表示第i盆花被照料的好,美观值增加j (j<=30)
    (2)Sub i j, i和j为正整数,表示第i盆花被照料的不好,美观值减少j (j<=30)
    (3)Query i j, i和j为正整数,i<=j,表示询问第i盆花到第j盆花的美观值之和
    (4)End,表示结束,这条命令在每组数据最后出现
    每组数据的命令不超过40000条
    

    Output

    对于第i组数据,首先输出"Case i:"和回车。
    对于每个"Query i j"命令,输出第i盆花到第j盆花的美观值之和。
    

    Sample Input

    1
    9
    7 9 8 4 4 5 4 2 7
    Query 7 9
    Add 4 9
    Query 3 6
    Sub 9 6
    Sub 3 3
    Query 1 9
    End 
    

    Sample Output

    Case 1:
    13
    30
    50 

    解题思路:线段树模板题;
      1 #include<iostream>
      2 #include <string.h>
      3 #include <stdio.h>
      4 #include <queue>
      5 
      6 using namespace std;
      7 
      8 const int MAX = 50000*2 + 5000;
      9 const long long  MAX1 = 1e10;
     10 
     11 struct Seg
     12 {
     13     int veg;
     14 }seg[MAX];
     15 
     16 void CJ(int root,int add[],int istact,int iend)
     17 {
     18     if(istact == iend)
     19     {
     20         seg[root].veg = add[iend];
     21 
     22     }
     23 
     24     else
     25     {
     26         int mid = (istact + iend)/2;
     27         CJ(root*2+1,add,istact,mid);
     28         CJ(root*2+2,add,mid+1,iend);
     29         seg[root].veg = seg[root*2+1].veg + seg[root*2+2].veg;
     30     }
     31 }
     32 
     33 int Cha(int root,int istact,int iend,int nstact,int nend)
     34 {
     35     if(nstact > iend || nend < istact )
     36         return 0;
     37     if(nstact <= istact&&nend >=iend )
     38         return seg[root].veg;
     39     int mid = (istact + iend)/2;
     40     int temp1 =Cha(root*2+1,istact,mid,nstact,nend);
     41     int temp2 = Cha(root*2+2,mid+1,iend,nstact,nend);
     42     return temp1 +temp2;
     43 
     44 }
     45 
     46 void gaibian(int root,int istact,int iend,int wei,int agg)
     47 {
     48     if(istact == iend)
     49     {
     50         if(iend == wei)
     51             seg[root].veg +=agg;
     52         return;
     53     }
     54     int mid = (istact + iend)/2;
     55     if(wei <=mid )
     56         gaibian(root*2+1,istact,mid,wei,agg);
     57     else
     58         gaibian(root*2+2,mid+1,iend,wei,agg);
     59     seg[root].veg = seg[root*2+1].veg + seg[root*2+2].veg;
     60 }
     61 
     62 int a[MAX];
     63 int T;
     64 int N;
     65 int main()
     66 {
     67     cin>>T;
     68     int t = 0;
     69     while(T--)
     70     {
     71         cout<<"Case "<<++t<<":"<<endl;
     72 
     73         cin>>N;
     74         for(int i =1;i <=N;i++)
     75             scanf("%d",&a[i]);
     76         CJ(0,a,1,N);
     77 
     78         char zhi[20];
     79         while(scanf("%s",zhi))
     80         {
     81             if(zhi[0]=='E') break;
     82             int x,y;
     83                 scanf("%d %d",&x,&y);
     84            if(zhi[0]=='Q')
     85             {
     86                 cout<<Cha(0,1,N,x,y)<<endl;
     87             }
     88             else if(zhi[0]=='A')
     89             {
     90                 gaibian(0,1,N,x,y);
     91             }
     92             else if(zhi[0]=='S')
     93             {
     94                 gaibian(0,1,N,x,-y);
     95             }
     96 
     97         }
     98     }
     99 
    100    return 0;
    101 }
  • 相关阅读:
    软阈值迭代算法(ISTA)和快速软阈值迭代算法(FISTA)
    伍德伯里矩阵恒等式(Woodbury matrix identity)
    压缩感知:一种新型亚采样技术
    运输层--------运输层与网络层的关系、UDP、TCP
    单链表的基本操作(二)
    单链表的基本操作(一)
    c++中的数据类型转换
    链表总的首元结点、头结点、头指针的区别
    封装设计基础知识点
    git的使用总结
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7375393.html
Copyright © 2011-2022 走看看