NOIP提高組模擬賽3

2022-09-18 12:51:14 字數 1962 閱讀 6471

周圍大佬都說初中打過n遍,我乙個菜雞瑟瑟發抖。

把斐波那契數列寫出來找了半天性質,用了半個多小時推出來

x兔子的父親,就是x減去是在斐波那契數列中最大的小於x的數

舉個栗子

13號兔子,應減去8,得到他的祖先5

10號兔子,應減去8,得到他的祖先2

預處理出斐波那契數列,然後讓ab中較大的到他的祖先,a==b時輸出答案,過程可以二分,但是因為菜還懶,發現減去的數一定越來越小,單調指標往前掃就行

那麼為什麼減去是正確的?他的含義是什麼?

首先對斐波那契數列求字首和,得到第i天有幾隻兔子,然後發現字首和不用另算,實際就是斐波那契數列第i+2項,這麼顯然的東西我還是打表發現的,實際還是在斐波那契數列上,找到第一項大於等於x的,就是x在當天出生,減去前一項,得到k,就是x是當天第k只出生的兔子,而標號是按照父親標號從小到大編號的,當天第i只出生的兔子的父親就是k,所以減去最大的小於x的就是x的父親。

#include#includeusing namespace std;

long long fib[1005];

int main()

else

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

}return 0;

}

沒錯,學資料資料結構學傻的就是我

記得做分塊莫隊時候看到過這題,於是就往分塊想,於是喜提tle

其實開個陣列存一下第i種顏色位置的下標,每次二分查詢指定區間內顏色個數就好,陣列好像開不下?用vector

特判一下不存在的情況

#include#include#include#includeusing namespace std;

const int maxn=300005;

int c[maxn];

vector a[maxn];

void ask()

void update()

int main()

return 0;

}

分類討論,由於某些奇奇怪怪的原因還是菜想對了k=1的情況然而只得到了部分部分分。。。

k只有1、2兩種取值,分類討論即可

k=1時,用vis陣列記錄當前團體內有誰,每次加入新兔子時列舉所有平方數減去該兔子顏色,判斷是否存在與之矛盾的兔子,如果有就重新分組,為了保證字典序最小,從後往前倒敘列舉,為了保證時間效率,令開陣列rem記錄那些位置有兔子,清零時清空rem對應位置即可

k=2時,仿照團夥那題,維護兩個並查集,表示兩個團體,令開陣列記錄與矛盾i的兔子在哪個集合,每次有一對新的矛盾關係i-j,判斷這兩個兔子是否在乙個並查集中,在的話重新分組,不在就將i與j敵人所在團體合併,j與i所在團體合併,倒敘列舉。

實際上這玩意叫擴充套件域並查集,記錄i敵人的陣列相當於把i拆成兩點中的虛擬點。領會精神吧。。

#include#include#includeusing namespace std;

const int maxn=301075;

int a[maxn],n,k,rem[maxn],cl[maxn];

bool flag[maxn];

void work1()

}if(fl)

cl[++temp]=a[i];

flag[a[i]]=1;

}printf("%d\n",cnt+1);

for(int i=cnt;i>=1;--i)printf("%d ",rem[i]);

printf("\n");

}vectorv[maxn];

int f[maxn],d[maxn];

int fx(int x)

void hb(int x,int y)

int up(int l,int r)

void work2()

int main()

這次考試最大收穫(大霧)發現自己還是最菜的,學到了不少vector使用方法

NOIP提高組模擬賽4

丹青千秋釀,一醉解愁腸 無悔少年枉,只願壯志狂 矩陣字首和加暴力 o n 2m 2 60pts有手就行 觀察資料範圍,猜測應該是求一種 o n 3 的演算法,想到之前做的題,應該是 n 2 枚舉行,n 處理乙個序列的答案,然後,就沒有然後了 對於乙個序列,求子段和為k的倍數,如何 o n 求解,考慮...

NOIP提高組模擬賽6

這題看著真熟啊,好像把之前的english,入陣曲雜糅了一下。首先,像入陣曲一樣計算出字首和 s 式子可以轉化為求 s r s l 1 equiv max mod k 像english一樣 用單調棧處理出以x為最大值的區間,分區間求解 每次列舉一側區間,已知max,只要知道另一側有多少與之餘數相同的...

NOIP提高組模擬賽7

帶取模的運算,除以乙個數一定要乘逆元!不同位置的值對最終答案的貢獻是互不影響的,分開考慮每個值的貢獻 考慮對於位於 x,y 的值對 n,m 的貢獻,無論從哪個路徑走過去,一定是原數 a b 而對答案貢獻多少次即為 x,y n,m 不同的路徑數,這個顯然是個組合數,用l表示需要走幾步,r表示需要向右 ...