這題看著真熟啊,好像把之前的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表示需要向右 ...