NOIP提高組模擬賽6

2022-09-19 10:51:14 字數 2332 閱讀 8926

這題看著真熟啊,好像把之前的english,入陣曲雜糅了一下。

首先,像入陣曲一樣計算出字首和\(s\)式子可以轉化為求

\(s[r]-s[l-1]\equiv max(mod\;k)\)

像english一樣

用單調棧處理出以x為最大值的區間,分區間求解

每次列舉一側區間,已知max,只要知道另一側有多少與之餘數相同的即可

然鵝這題資料範圍不允許用字首和優化某區間餘數為特定值的個數,這樣english中的啟發式合併就沒有意義,因為兩邊都要掃,如果資料相對單調,非常容易卡成\(o(n^2)\)喜提tle。

所以揉了兩道題做不出怎麼辦?再揉一道

像之前的數顏色那樣用vector存餘數為i的字首和的下標,每次查詢直接二分,這樣複雜度就可以了,記得存乙個0進去

#include#include#include#includeusing namespace std;

const int maxn=1000005;

int a[maxn],l[maxn],r[maxn],stc[maxn],top,n,k;

long long sum[maxn],ans=0;

vectorv[maxn];

int ask(int ll,int rr,int y)

void work(int ll,int rr,int xx))\)

如何計算這個式子,並且保留分數形式?

----約分

分母只有2這個因子,上下約分一定只能約2的幾次方

如何約分?

有:\(2^n-x\)與\(x\)的2的因子個數一樣

**感性理解下

\(x=2^p*q\)(q不含2這個因子)

\(2^n-x=2^p(2^+q)\)

因為q不含2這個因子,所以q是奇數,\((2^+q)\)也是奇數,不含2這個因子,所以\(2^n-x\)與\(x\)的2的因子個數一樣,即p

所以判斷能約幾個2,判斷分母和\(m!\)有幾個2這個因子即可

用\(m!\)除以2,得到其中有幾個含2這個因子的,除以4得到有幾個含兩個2這個因子的....不停除以2的此方,直到大於\(m!\)累計一下個數,得到約分的數,上下乘以逆元即可

#include#include#includeusing namespace std;

const long long mod=1e6+3,nv=500002;

long long m,n;

long long qp(long long x,long long y)

return ans;

}int main()

long long p=qp(2,n),q=qp(p,m);

long long a=1;

for(int i=0;i想出過卡上下界的做法,但是不知道怎麼處理\(a[i]\)有數的情況,還是太菜

定義二元組,(其實就是兩個陣列)up[i] \((x,c)\) 和down[i] \((x,c)\),表示上下界,即到第i個數,最小是down->x,出現次數down->c 最大up-x,出現次數up->c

顯然一般情況up每兩個加一,down每5個加一,如果\(a[i]\)有數,先用上下界判是否合法,然後更新上下界,由於要讓up最大,down最小,顯然令\(up->x=a[i] \;up->c=2\;down->x=a[i]\;down->c=1\)

這樣就能判斷是否存在合法方案,並且求出最大值,(注意特判一下

\(up[n]->c==1\)需要減1)

然後考慮如何填數,倒敘填數,定義now和sum,sum表示連續填了幾個相同的數,每次填\(min(up[i]->z,now)\);當\(a[i]\)有數,\(now=min(now,a[i])\);sum每到5 now要減一

不是很理解,先口胡一下,不對請大佬指正

這個now大概是個上界,而我們此時需要盡可能小(減的快),就需要用up此時是下界,但是由於正著掃時候\(a[i]\)有數是直接暴力修改,導致中間會斷,部分的下界是錯誤的,需要用上界修正,而now的作用就在這時候體現了,就是說up和now交替合法

#include#includeusing namespace std;

const int maxn=200005;

int min(int x,int y)

else

if(down[i-1].c<5)

else

if(a[i])

if(up[i].z>a[i])

if(down[i].z=1;--i)

printf("%d\n",up[n].z);

for(int i=1;i<=n;++i)printf("%d ",as[i]);

return 0;

}

NOIP提高組模擬賽3

周圍大佬都說初中打過n遍,我乙個菜雞瑟瑟發抖。把斐波那契數列寫出來找了半天性質,用了半個多小時推出來 x兔子的父親,就是x減去是在斐波那契數列中最大的小於x的數 舉個栗子 13號兔子,應減去8,得到他的祖先5 10號兔子,應減去8,得到他的祖先2 預處理出斐波那契數列,然後讓ab中較大的到他的祖先,...

NOIP提高組模擬賽4

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

NOIP提高組模擬賽7

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