\(丹青千秋釀,一醉解愁腸\)
\(無悔少年枉,只願壯志狂\)
矩陣字首和加暴力\(o(n^2m^2)\) 60pts有手就行
觀察資料範圍,猜測應該是求一種\(o(n^3)\)的演算法,想到之前做的題,應該是\(n^2\)枚舉行,\(n\)處理乙個序列的答案,然後,就沒有然後了
對於乙個序列,求子段和為k的倍數,如何\(o(n)\)求解,
考慮字首和,如果乙個子段和為k的倍數,那麼子段的左右兩界在模k意義下是同餘的,開陣列記錄,\(s[i]\)表示模k餘數為i的字首和有幾個,而任意兩個都對應乙個合法的矩陣,所以可以愉快的切掉此題,還有一點就是\(s[0]\)初值應設為1,原因模k為0的直接就是合法矩陣。
記得開longlong,還有不要每次memset,不然你會喜提tle35 還不如暴力
#include#includeusing namespace std;
const int maxn=405;
int n,m,k;
int mp[maxn][maxn];
long long sum[maxn][maxn];
int s[1000005];
int main()
for(int j=1;j<=m;++j)
}printf("%lld\n",ans);
return 0;
}
\(歷史落在贏家之手,至少我們擁有傳說\)
\(誰說敗者無法不朽,拳頭只能讓人低頭\)
\(念頭卻能讓人抬頭,抬頭去看去愛去追\)
\(你心中的夢\)
就我乙個打dp的,思路沒啥問題,但是掛了一堆細節,調了乙個多小時,結果只有20pts,然後改了億一點細節a了
畫圖可以發現,轉移時子節點不僅可能對父節點有貢獻,還可能需要父節點貢獻,設\(g[x][i]\)表示以x為根的子樹能夠駐守的距離為i的最小方案,轉移時我們需要知道\(g[v][j]\)(v是x的子節點,\(j \in [-k,k]\)),為了處理下標為負的情況,我統一加上了21,也可以像洛谷題解一樣加k。
考慮具體過程(具體**下標請自行加上乙個常數)
如果是葉節點 那麼\(g[x][i]=0\;(i\in [-k,-1]) g[x][i]=1\;(i\in [0,k])\)
一般情況的轉移
預處理\(ls[i]\)記錄x子樹駐守距離為i的方案之和
如果在x駐守,那麼子節點貢獻-k即可\(g[x][k]=ls[-k]+1\)
如果x有正貢獻i,但是沒有在x駐守,那麼一定有乙個子節點貢獻了i+1,其他子節點貢獻-i即可\(g[x][i]=min(g[v][i+1]+ls[-i]-g[v][-i])i\in[0,k)\)
如果x有負貢獻i,那麼所有子節點貢獻了i+1才保證合法\(g[x][i]=ls[i+1]i\in[-k,-1]\)
由於某些狀態實際上不存在,所以存在\(g[x][i]>g[x][j](i< j)\)這顯然不合理,所以需要倒著取\(min\)即\(g[x][i]=min(g[x][i],g[x][i+1])\),這樣保證了i越小g也越小,且保證合法
dp到這裡就結束了,然後我們再簡單講講正解
考慮放棄dp,這題可以貪心,隨便找個根,然後找最深的點,在該點的k級祖先駐守一定最優,按點深度從大到小排序,每次取最深的點,檢查是否被控制,沒有就駐守k級父親或者根節點,暴力更新周圍點。
附dp**
#include#includeusing namespace std;
int min(int x,int y)
//print();
}int main()
int flag[40005],cf[40005];
int n,k,m,op[67],x[19],cnt;
int dis[21][40005];
bool vis[40005];
queueq;
void spfa(int now,int nowx)}}
if(u>0) }}
}}
}int f[67737];
void dp()}}
printf("%d\n",f[0]);
}int main()
for(int i=1;i<=m;++i)scanf("%d",&op[i]);
for(int i=1;i<=n+1;++i)cf[i]=flag[i-1]^flag[i];
for(int i=1;i<=n+1;++i)if(cf[i])x[++cnt]=i;
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=cnt;++i)spfa(i,x[i]);
dp();
return 0;
}
NOIP提高組模擬賽3
周圍大佬都說初中打過n遍,我乙個菜雞瑟瑟發抖。把斐波那契數列寫出來找了半天性質,用了半個多小時推出來 x兔子的父親,就是x減去是在斐波那契數列中最大的小於x的數 舉個栗子 13號兔子,應減去8,得到他的祖先5 10號兔子,應減去8,得到他的祖先2 預處理出斐波那契數列,然後讓ab中較大的到他的祖先,...
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表示需要向右 ...