一、預處理
所謂預處理,顧名思義,就是事先計算好需要的值或事先處理某些東西,有時候你會發現你做乙個題目出現了tle,原因就是重複的計算會導致效率不高(或者說你的預處理不夠「優雅」)。
a、直接把結果預處理
xtuoj 1052
題意:某乙個數字集合定義如下:
1.0屬於這個集合;
2.如果x屬於這個集合,那麼2x+1,3x+1也屬於這個集合;
3.集合只包含按增序排列的前100000個元素。
集合按增序排列,根據輸入的元素序號,輸出對應的元素值。
輸入每行乙個整數n(n<100000),表示元素的序號(從0開始記數),如果是-1,則輸入結束。
輸出每行輸出對應元素的值。
sample input
-1sample output
9 分析:很明顯,不能也不好直接判斷是否存在於這個集合中,只需要把所有存在於這個集合中標記,並且預處理這些元素的序號,之後輸出就行了,那麼一次預處理便可以知道所有序號對應的元素了。
#include
#define max 2000001
using name space std;
int a[100010], b[3*max];
int main() ;
int main()
int flag = 0;
for (int i = m; i <= n; i++)s[maxn];
int main()
int t;
scanf("%d",&t);
while(t--){
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x&1){
s[i].odd += s[i-1].odd +1;
//每乙個繼承前面那個的奇數和偶數個數.
s[i].ans += s[i-1].ans;
else{
s[i].ans += s[i-1].ans + 1;
s[i].odd += s[i-1].odd;
while(q--){
int l,r;
scanf("%d%d",&l,&r);
int a = s[r].odd - s[l-1].odd;
int b = s[r].ans - s[l-1].ans;
printf("%d\n",a*b);
fzu 2129
思維題,也可以用字首和思想,只是有點難理解。所以這兒就不給這種解法了,給一種易理解的解法。
思路:設ans(k)為k長度的子串行的個數,,a[k]為第k個子序列,那麼如果a[k]和前面的數都不相同的情況下,ans(k)]=ans(k-1)*2+1;如果前面的數字出現過的話,那麼就要減去最近一次出現a[k]這個數值的地方-1的子串行個數,因為這些算重複的了,而且+1也沒有了,因為ans(a[k]上次出現的位置)包括了a[k]單獨算一次的情況。
#include
#include
#include
#include
#define mod 1000000007
using name space std;
const int maxn=1e6+5;
int cas=1;
int ans[maxn],a[maxn];
int vis[maxn];
int main()
int n;
while(~scanf("%d",&n)){
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(vis[a[i]]==0){
ans[i] = (ans[i-1]*2+1)%mod;
else{
ans[i] = ((ans[i-1]*2 -ans[vis[a[i]]-1])%mod+mod)%mod;
//這樣做的目的是為了防止出現負數(我是試出來的)因為我找不到具體樣列會出現負數.所以必須這才能a。
vis[a[i]] = i;
printf("%d\n",ans[n]%mod);
NOIP大綱整理 (一)常見問題與常用策略
數學類問題 1.精度處理 高精度 實數處理 各種浮點型別處理方法 2.組合數學問題 斐波那契數列 第二類數 卡特蘭數 polya原理 排列組合計數 加法原理與乘法原理 3.進製問題 特定二進位制串的統計 二分查詢 利用二進位制進行路徑 狀態描述 二進位制轉換 4.遞推與遞迴關係 遞推關係式 通項公式...
C 筆記整理 預處理命令
define和 undef define 它告訴編譯器存在給定名稱的符號 undef 它刪除符號的定義 if elif else endif 這些指令告訴編譯器是否編譯某個 塊 define debug define bug static void main string args if if el...
c語言整理編譯預處理
c程式執行過程 源程式 編譯預處理 編譯 優化程式 匯程式設計序 鏈結程式 可執行檔案。編譯預處理時,先要讀取源程式,對預處理指令 開頭指令 以及特殊的符號進行處理,比如define 替換指令,也會進行刪除注釋,多餘的空白字元,然後產生的預處理檔案或者程式傳給編譯器,在程式中以 開頭的編譯指令稱為預...