原題: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.在這個問題...