題意:給定一個數組,給定兩種區間操作,一種是往一個區間中的每一個位置加上一個數,另一種是詢問某個區間的數的和
解法:線段樹
結構定義:
struct Node { int l,r; long long tsum,csum; //其中tsum表示對整個區間的改變量,例如加入[1,5],則所有在區間[1,5]的祖先位置的都要加 //csum表示該區間的改變 Node() { l=r=tsum=csum=0; } };
代碼如下:
#include <iostream> using namespace std; #define MAXN 100005 struct Node { int l,r; long long tsum,csum; //其中tsum表示對整個區間的改變量,例如加入[1,5],則所有在區間[1,5]的祖先位置的都要加 //csum表示剛好該區間的改變 Node() { l=r=tsum=csum=0; } }; Node treeNode[4*MAXN]; void construct(int p,int l,int r) { treeNode[p].l=l; treeNode[p].r=r; if (l==r) { return; } int mid=(treeNode[p].l+treeNode[p].r)/2; construct(2*p,l,mid); construct(2*p+1,mid+1,r); } void Addnode(int p,int l,int r,int val) { treeNode[p].tsum+=(r-l+1)*val; if (treeNode[p].l==l&&treeNode[p].r==r) { treeNode[p].csum+=val; return; } int mid=(treeNode[p].l+treeNode[p].r)/2; if (r<=mid) { Addnode(2*p,l,r,val); } else if (l>=mid+1) { Addnode(2*p+1,l,r,val); } else { Addnode(2*p,l,mid,val); Addnode(2*p+1,mid+1,r,val); } } long long cal(int p,int l,int r) { long long ans=0; if (treeNode[p].l==l&&treeNode[p].r==r) { ans=ans+treeNode[p].tsum; } else { ans=ans+treeNode[p].csum*(r-l+1); int mid=(treeNode[p].l+treeNode[p].r)/2; if (r<=mid) { ans+=cal(2*p,l,r); } else if (l>=mid+1) { ans+=cal(2*p+1,l,r); } else { ans+=cal(2*p,l,mid); ans+=cal(2*p+1,mid+1,r); } } return ans; } int main() { int n,q,i,a,b,c; int num; scanf("%d%d",&n,&q); construct(1,1,n); for (i=1;i<=n;i++) { scanf("%d",&num); Addnode(1,i,i,num); } char str[2]; for (i=1;i<=q;i++) { scanf("%s",&str); if (str[0]=='Q') { scanf("%d%d",&a,&b); long long ans=cal(1,a,b); printf("%lld/n",ans); } else if (str[0]=='C') { scanf("%d%d%d",&a,&b,&c); Addnode(1,a,b,c); } } return 0; }
前幾天面試,問道快排非遞歸,我說我不會!!!! 我太菜了,面試題都不會。 比賽一直用sort,屢試不爽,所以排序算法的代碼很生疏! !!快排分區間的時候很容易寫錯,最好能記住它的寫作格式 遞歸版的: void qsort(int
比賽時隊友嘗試用一個優先隊列做,後來發現用兩個更合適。 第一次用priority_queue。。。 每次在喫cake時儘量不改變方向,喫最近的cake,每次pop之後並不改變左右隊列。 菜鳥忘了刷新隊列WA了好幾次。。。。教訓啊T——T
C與C++:char *strchr(const char* _Str,char _Val) char *strchr(char* _Str,char _Ch) 頭文件:#include <string.h> 功能:查找字符串_Str中首
描述 將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。 正整數n 的這種表示稱爲
1:紅與黑 查看提交統計提問 總時間限制: 1000ms 內存限制: 65536kB 描述有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程序,計算你總共能
題目 http://acm.hdu.edu.cn/showproblem.php?pid=1372 這是一個簡單的搜索問題 題目意思是 一隻馬從一個點到另外一個點就可以了 你要知道象棋中馬是怎麼走的。 其他的就可以了,剛開
題目 http://acm.hdu.edu.cn/showproblem.php?pid=1010 剛開始拿着這個題目 開始用bfs 但是一提交就錯 不知道爲什麼 很糾結哦 但是最後還是看別人解題報告才知道哦 題意
DescriptionBackgroundCharlie Darkbrown sits in another one of those boring Computer Science lessons: At the moment the
1, map的兩種遍歷<span style="font-size:14px;"> map<string,int>::iterator it; for(it=MAP.begin();it!=MAP.end();++it){ cout
Descriptioninputinput.txtoutputoutput.txtString x is an anagram of string y, if we can rearrange the letters in string
DescriptionIgnatius bought a land last week, but he didn't know the area of the land because the land is enclosed by a
題意,有一串數字,求出最長上升序列,其中0可以當做任意一個整數(包括負數)。思路:0用的越多越好,所以我們把0全部用上,再從剩下的數字中選出LIS,爲保證嚴格遞增,每一個數字都減去其之前0的個數(保證0都被順利的使用)注意用vis存儲0的
DescriptionIn Disgaea as in most role-playing games, characters have skills that determine the character's ability to u
題意:問n個點中是否存在兩對不同的點的曼哈頓距離相等。思路:因爲0<n,m<100000,所以曼哈頓距離最多爲200000,直接暴力求沒對點的曼哈頓距離,當計算次數>200000,一定存在兩對點曼哈頓距離相同。注意判斷是否存在相同的點。#
題目鏈接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3138 題意:n個點m個操