數字串 (樹狀陣列)

2021-08-20 08:55:13 字數 1278 閱讀 8088

原題:wannafly挑戰賽15 d

題意:

給乙個數字串,每次操作改變乙個位置的數字,求每次操作後,有多少個子串滿足以下要求:

長度在區間 [l,r] 內

首數字 > 尾數字

解析

對於乙個位置p,求的是乙個sum(p-r+1到p-l+1範圍內數字大於p位置的個數和p+l-1到p+r-1範圍內數字小於p位置的個數)

而又涉及到單點更新,那麼就是樹狀陣列了

因為數字為0~9,所以需要10棵樹

tr[8][20]==3表示為:20~17(20-lowbit(20)+1)範圍內8的個數為3

細節看**吧

#include

#include

#include

#include

#include

#include

#define d long long

using namespace std;

const int n = 1e5;

int n,q,l,r;

d tr[11][n];

char x[n];

int lowbit(int i)

void up(int f,int p,int v)

}d query(int f,int l,int r)

while(l>=1)

return ans;

}void out_tree()

printf("\n");

}}int main()

d ans=0;

//初始化的時候從前往後掃,所以只需要考慮前面比它大的

for(int i=l;i<=n;i++)

}//更新的時候,還要考慮後面比它小的

while(q--)

for(int i=0;i0;i++)

//在減到前態的影響後及時做改變,防止影響接下來的計算

up(v0,pos,-1);

up(v,pos,1);

x[pos]='0'+v;

for(int i=v+1;i<=9;i++)

for(int i=0;iif(pos+l-1>n)break;

ans+=query(i,pos+l-1,min(pos+r-1,n));

}printf("%lld\n",ans);

}}

整數字串轉化

1.用程式設計的方法將整數轉化成字串 整數轉化成字串,可以採用加 0 再逆序的辦法,整數加 0 就會隱性轉換成char型別的數。include include using namespace std int main void temp i 0 i i 1 while i 0 str j 0 cou...

貪心 數字串

描述 description 給你乙個長度為n的數字串,數字串裡會包含1 m這些數字。如果連續的一段數字子串包含了1 m這些數字,則稱這個數字字串為num串。你的任務是求出長度最短的num串是什麼,只需要輸出這個長度即可。1 n,m 200000 輸入格式 input format 第一行給定n和m...

Number Sequence 數字序列

一 杭電原題摘錄 二.題目分析 很容易就能想到遞迴,但是超出記憶體 int fac int a,int b,int n 超出記憶體 因為f n 的值要對7取餘,所以不難想到f n 的值可能存在週期.那我們就去找週期,看是否存在?週期不就是一直重複t個數,那麼我們就說這組數存在週期,且為t.在這個問題...