hdu 3333 Turing Tree & hdu 3874 Necklace (成段更新)

來源:互聯網
上載者:User

題意:有T(1<=T<=10)組測試資料,每組資料有N(1<=N<=30000)個數。接下來有Q個查詢,表示查詢區間[l,r]之間的數的和,但是出現多次的值,只能加進和裡一次。

可以用離線的方法,方法如我之前關於Codeforces Round #136 (Div. 2) D. Little Elephant and Array的解題報告裡介紹的兩種方法沒有什麼太大的區別。

另外hdu 3874 Necklace只是變化了資料範圍,其他的都一樣。

#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <map>#include <algorithm>using namespace std;#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define MID(a,b) (a+((b-a)>>1))const int N=50005;typedef long long LL;struct Query{int st,ed,ind;Query(){}Query(int a,int b,int c){st=a;ed=b;ind=c;}bool operator<(const Query&b)const{ return ed<b.ed; }};struct node{int lft,rht;LL sum;int mid(){return MID(lft,rht);}};int y[N],n,m,sca;LL res[200005];bool flag[N];int st[N],ed[N];vector<Query> q;map<int,int> H;struct Segtree{node tree[N*4];void down(int ind){if(tree[ind].sum){tree[LL(ind)].sum+=tree[ind].sum;tree[RR(ind)].sum+=tree[ind].sum;tree[ind].sum=0;}}void build(int lft,int rht,int ind){tree[ind].lft=lft;tree[ind].rht=rht;tree[ind].sum=0;if(lft!=rht){int mid=tree[ind].mid();build(lft,mid,LL(ind));build(mid+1,rht,RR(ind));}}void updata(int st,int ed,int ind,int valu){int lft=tree[ind].lft,rht=tree[ind].rht;if(st<=lft&&rht<=ed) tree[ind].sum+=valu;else{down(ind);int mid=tree[ind].mid();if(st<=mid) updata(st,ed,LL(ind),valu);if(ed> mid) updata(st,ed,RR(ind),valu);}}LL query(int pos,int ind){if(tree[ind].lft==tree[ind].rht) return tree[ind].sum;else{down(ind);int mid=tree[ind].mid();if(pos<=mid) return query(pos,LL(ind));else return query(pos,RR(ind));}}}seg;int main(){int t;scanf("%d",&t);while(t--){sca=0;q.clear(); H.clear();memset(flag,0,sizeof(flag));scanf("%d",&n);for(int i=1;i<=n;i++){ scanf("%d",&y[i]); if(H.find(y[i])==H.end()) H.insert(make_pair(y[i],sca++));}seg.build(1,n,1);scanf("%d",&m);for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);q.push_back(Query(a,b,i));}sort(q.begin(),q.end());int ind=0;for(int i=1;i<=n;i++){int valu=H[y[i]];if(flag[valu]==0){seg.updata(1,i,1,y[i]);st[valu]=1; ed[valu]=i;flag[valu]=1;}else{st[valu]=ed[valu]+1; ed[valu]=i;seg.updata(st[valu],ed[valu],1,y[i]);}while(q[ind].ed==i&&ind<m){res[q[ind].ind]=seg.query(q[ind].st,1);ind++;}}for(int i=0;i<m;i++) printf("%I64d\n",res[i]);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.