程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> PKU 3468 A Simple Problem with Integers

PKU 3468 A Simple Problem with Integers

編輯:C++入門知識

PKU 3468 A Simple Problem with Integers


題目大意:
有N,M兩個數
Q 表示查詢, 後面兩個數a b,表示查詢從a 到b計算它們的和
C 表示增加 後面三個數a,b,c 表示從a開始,一直到b,每個數都增加c

除了查詢要進行輸出,增加不要輸出


#include
using namespace std;
#define LL(x)((x)<<1)
#define RR(x)((x)<<1|1)
struct_Seg_Tree{
   int left,right;
   long long sum;
   int add;
   int calmid(){
       return (left+right)/2;
   }
   int caldis(){
       return right-left+1;
   }
}tt[1000000];
int val[1000002];

long long build(int l,int r,int idx){
   tt[idx].left=l;
   tt[idx].right=r;
   tt[idx].add=0;
   if(l==r){
      return tt[idx].sum=val[l];
   }
   return tt[idx].sum=build(l,mid,LL(idx)+build(mid+1,r,RR(idx)));
}     

void update(int l,int r,int add,int idx){
   if(l<=tt[idx].left&&r>=tt[idx].right){
       tt[idx].add+=add;
       tt[idx].sum+=(long long)tt[idx].caldis()*add;//通過乘以後來添加的數 
       return ; 
   }
   if(tt[idx].add){
       tt[LL(idx).sum]+=(long long)tt[LL(idx)].caldis()*tt[idx].add;
       tt[RR(idx).sum]++(long long)tt[RR(idx)].caldis()*tt[idx].add;
       tt[LL(idx)].add+=tt[idx].add;
       tt[RR(idx)].add+=tt[idx].add;
       tt[idx].add=0; 
   
   }
   int mid=tt[idx].calmid();
   if(l<=mid) update(l,r,add,LL(idx));
   if(mid

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved