(CF792 ABCD題解) 模擬,樹狀陣列

2021-07-29 23:14:14 字數 2903 閱讀 4306

//

題意: 給你n個數,問你兩個數直接的差值得絕對值最小為多少,及有多少對滿足這樣的數/

分析:排序後直接掃一遍即可

//#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 200010;

int a[maxn];

int main()

else

if(t == mindis) pairs++;

}printf("%d %d\n",mindis,pairs);

return

0;}

//

題意: 有n個人順時針圍成一圈,編號從1~n,剛開始時第乙個人為leader,現在進行k輪遊戲

每一輪有乙個數ai,表示從leader的後乙個人開始往後數ai個人,將最後乙個人出圈,並且將出圈人的後乙個人設為下一輪的leader

問你每一輪出圈人的編號?

分析:由於n很小,所以我們可以直接進行模擬即可,將圈直接看成一行,編號1~n

在每一輪中有:

leader :標記leader為從頭開始的第幾個人

n: 還剩下的人數

所以下乙個出圈的人為第 (leader + a[i]) % n 個人

再將後面的編號往前移動一位即可

依次模擬下去

**注意對邊界情況的處理**

//#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 110;

int ch[maxn];

int a[maxn];

int ans[maxn];

int main()

for(int i=1;i<=k;i++)

printf("\n");

return

0;}

//

****是wa的,今後找機會改**

題意: 給你乙個長度最大為100000的正整數,為你最少刪去多少個數使得他是3的倍數(沒有前導0)

分析:乙個數的所有位數之和是3的倍數那麼那個數就是3的倍數

我們也可以將每一位看成0,1,2,3

所以這個數 %3 後只有可能有3中情況:0,1,2、

若餘數為0:可以直接輸出

若餘數為1:去掉乙個1或兩個2 (有很多關於0的情況的討論)

若餘數為2:去掉乙個2或兩個1

分情況討論即可

//#include

#include

#include

#include

#include

using namespace std;

const int maxn = 100010;

char s[maxn];

int main()

int t = sum % 3;

if(t == 0) printf("%s\n",s);

else

if(t == 1)}}

}else

if(num1 > 1)

printf("\n");

}else

if(num1 == 1)

printf("\n");

}else

else

else

if(s[2] != '0')

else

printf("\n");}}

}}

}else

if(t == 2)}}

}if(num2 > 1)

printf("\n");

}if(num2 == 1)

printf("\n");

}else

else

else

if(s[2] != '0')

else

printf("\n");}}

}}}}

return

0;}

//

題意:給你一顆完全二叉樹,標號規則如圖所示(先序序列),

現在從乙個節點出發,可以進行u:向上,r:向右,l:向左 移動這三種操作 (當不能移動時不動)

經過s操作後,問你最後到達哪一節點?

分析:滿二叉樹的標號方式和我們所學的樹狀陣列一樣,所以我們想到了樹狀陣列

設當前所在節點的編號為u,那麼pos = u&-u : 表示和u處在層的第乙個節點的編號

若 u&(2*pos) != 0 表示 u 節點在父節點的右側

若 u&(2*pos) == 0 表示 u 節點在父節點的左側

並且我們發現從最後一層開始相鄰兩層之間的節點的編號差值從1 開始成倍增長

所以我們根據以上資訊模擬即可

//#include

#include

#include

#include

#include

using

namespace

std;

long

long n,q,u,root;

string s;

int main()

else

if(s[j] == 'l')

else

if(s[j] == 'r')

}printf("%i64d\n",u);

}return

0;}

刷題記錄 CF1228A,B,C,D

a題 a distinct digits 800 題目大意 給你兩個數,l和r,問你在l到r之間的數中存不存在每個數字都不相同的數,存在輸出這個數,不存在輸出 1 思路 暴力就完事 includeusing namespace std const int maxn 2e5 10 int a maxn...

792 高精度減法(模板題)

題目傳送門 題解思路參考大佬 給定兩個正整數,計算它們的差,計算結果可能為負數。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的差。資料範圍1 整 數長度 10 51 整數長度 10 5 1 整數長度 105 輸入輸出樣例 樣例輸入1 32 11樣例輸出1 21高精度減法。模板題。將...

cf刷題日誌

e1.send boxes to alice easy version e2.send boxes to alice hard version easy和hard都沒想出來怎麼貪心。首先對於k 1k 1k1 且k1 k2k 1 k 2 k1 k2 可以顯然得到結論1 把所有數組合為k 1k 1 k1...