牛客NOIP暑期七天營 提高組2

2022-05-21 04:35:33 字數 1752 閱讀 4258

①、trie樹上的節點多記乙個rest值表示還有多少個串沒被用。列舉所有串, 每次先在trie上跑匹配串,看一看那個點的rest。如果沒法匹配的話就往trie裡插入原串,把結束節點的rest+1

②、思路和trie類似。其實就是把trie換成hash。(把在樹上跑換成去hash值)

③、將每個序列的個數存下,每次讀入時判斷對應序列的map的權值是否為0,若不為0,將輸入序列和其對應序列的map權值-- ,ans++

下面是第三種解法 :

1 #include2

using

namespace

std;

3#define ll long long

4#define inf 0x3f3f3f

5ll read()614

void

out(int

a)15

21if(a>=10)out(a/10

);22 putchar(a%10+'0'

);23

}24 maphaha;

25int

n;26 mapab;

27int

main()

2849

//cout<50

if(haha[b]!=0)51

56}57 cout

59return0;

60 }

view code

因為n是<=1e19的,而long long是存不到大於777777777444444444的下乙個幸運數,所以當n>777777777444444444,我們要進行特判。

剩下的情況的最大的幸運數則為777777777444444444。

因為幸運數肯定為偶數,且只包含4、7且4、7個數相同,所以打表完我們會發現 在long long可存的範圍下幸運數並不多

所以我們將所有幸運數存入arr[ ]陣列中,最後再對arr[ ]和n進行二分查詢,返回大於等於n的第乙個幸運數(打表時注意遞迴方式使陣列arr[ ]預設從小到大排序)

下面貼**:

1 #include2

using

namespace

std;

3#define ll long long

4#define inf 0x3f3f3f

5ll read()614

void

out(ll a)

1521

if(a>=10)out(a/10

);22 putchar(a%10+'0'

);23}24

const

int n = 1e6+10;25

int k = 1

,t;26

ll n;

27ll arr[n];

28void dfs(int num4,int

num7,ll ans)

2935

else

if(num4 == 0)36

39else

if(num7 == 0)40

43else

4448}49

intmain()

5064

int r =k;

65int l = 1;66

while(r - l > 0)67

75 cout

77return0;

78 }

view code

牛客NOIP暑期七天營 提高組3

今天是被打爆的一天,t3就是用正解做的,但是好像zz了,只得了30分。t1由於沒判不合法的情況,也只有15分 果然是乙個拿不到noip一等獎的人 畢竟noip都準備改名了?a 破碎的矩陣。題意 給出n,m,表示有n m的矩陣,然後給定每一行的異或和,每一列的異或和,求方案數。思路 如果合法,方案數是...

暑期七天魔鬼訓練營

第一天 1 luogu 2871 poj3624 charm bracelet 手鍊 01揹包 狀態壓縮 2 poj 1384 piggy bank 完全揹包 3 poj 2387 the cows come home 最短路徑模板 4 poj 3255 次短路 5 poj 3723 conscri...

牛客CSP S提高組賽前集訓營2

然後隨便用乙個資料結構維護一下就行了,我寫的線段樹。我們先找出每個環,然後我們先刪連線環的邊,每刪一條就可以多產生乙個聯通塊,在考慮刪環邊,發現從最大的環刪起一定最優 因為你刪的第一條邊得不到任何新的聯通塊 就很容易想到tar jantarjan tarjan 發現你只能寫出80 8080 分,因為...