周圍大佬都說初中打過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表示需要向右 ...