20200721NOIP提高組模擬T1 矩陣

2022-08-18 23:21:13 字數 1609 閱讀 6447

給你乙個數a,以及一串全是數字的字串以構造矩陣c,c[i][j]=a[i]*a[j](a[k]表示字串中第k位所代表的數字).請你求出權值之和恰好為a的子矩陣個數.

此題比較有意思.題目要我們求的答案即滿足$(\sum_^\sum_^ c[i][j]) ==a$的四元組[x,y,u,v]個數.接下來我們分析一下這個式子:$$\sum_^\sum_^c[i][j]=\sum_^\sum_^ a[i] \cdot a[j]=\sum_^(a[i] \cdot \sum_^a[j])=\sum_^a[i] \cdot \sum_^a[j]$$$$=(sum[u]-sum[x-1]) \cdot (sum[v]-sum[y-1])$$

其中sum陣列為字首和.由於n比較小$(n\in 4000)$,所以我們可以n²預處理出字首和之差,然後運用乘法原理組合即可.值得注意的是,當a==0時,由於0乘以任何數結果均為0,所以要特殊處理,0*0的矩陣被我們算了兩次,所以要減掉一次.

#include#include

#include

#include

#include

#include

#define r register

#define next exnttttttttttttttttttttt

#define debug puts("mlg")

using

namespace

std;

typedef

long

long

ll;typedef

long

double

ld;typedef unsigned

long

long

ull;

inline ll read();

inline

void

write(ll x);

inline

void

writesp(ll x);

inline

void

writeln(ll x);

ll a;

char

wn;ll num[

6000

],n;

ll used[

150000],sum[150000

];ll ans;

intmain()

for(r ll i=1;i<=n;i++)

for(r ll i=1;i<=n;i++)

}if(a==0

)

for(r ll i=1;i<=120000;i++)

}writeln(ans);

}inline ll read()

while(ch>='

0'&&ch<='9'

)

return x*t;

}inline

void

write(ll x)

if(x<=9)

write(x/10);putchar(x%10+'0'

);}inline

void

writesp(ll x)

inline

void

writeln(ll x)

20200721NOIP提高組模擬T3 最小代價

給你n個點 n leq100000 所構成的邊帶權的無向圖,每個點都有黑或白兩種顏色之一,其中黑記為1,白記為0.現在要你選擇一些邊 選擇一條邊的代價即為此邊權值 用這些邊構成新的圖,使得新圖中每個白點都與黑點聯通,且每個白點到距離其最近的黑點的距離等於原圖中的最短距離.若不存在這樣的圖,輸出imp...

NOIP提高組 矩陣

在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...

NOIP提高組2005 過河

過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...