牛客提高組模擬賽4

2022-05-20 05:30:34 字數 2156 閱讀 3837

這題應該做法有很多吧,我提供一種奇怪的做法

將每一行連續的1提出來,形成乙個個區間\(l,r\)

實際是求對於每一\(1\leq l \leq r \leq m\),能覆蓋它的\(l,r\)有多少個

怎麼求呢?

首先我們將這些區間儲存在每個左端點上

迴圈列舉左端點,每次將右端點的sum++,維護乙個字尾即可,累加得到每個右端點的答案

直接這樣做,複雜度應該是\(n \cdot m+m \cdot m\)

那對於\(m\)較大\(n\)較小的情況,如何優化為\(n*m\)呢?

其實是非常簡單的,記錄右端點出現的最遠位置\(maxr\),每次從\(maxr\)迴圈到i即可

這樣的話,其實每一次是迴圈乙個連續區間的塊長,總共塊長應該是\(n*m\)

const int n=5010;

bool be;

int n,m;

int a[n][n];

struct edgee[n*n/2];

int head[n],ecnt;

void addedge(int u,int v);

head[u]=ecnt;

}int sum[n],k[n];

bool ed;

int main()

rep(j,1,m)

} } }

int ans=0;

rep(i,1,m)

int d=0;

drep(j,ma,i)

} printf("%d\n",ans);

}

\[\

\]\[\

\]\[\

\]dp裸題吧

\[dp[i][j]$$前j個數,分成$i$段的最大收益

首先我們考慮$n^3$轉移

```cpp

for(int k=1;ksum[k+1][j]$的情況

而什麼時候存在這種情況呢?當且僅當$a[k]$中存在$a[k+1..j]$的二進位制位中不擁有的1時遞增

所以存下每一位的一上一次出現的位置,一共有$log_2(10^7)$的轉移方案

總複雜度$n\cdot k \cdot log_2(10^7)$,略大於乙個億的樣子,但實際上這題時限2s,不是特別卡常吧

```cpp

#includeusing namespace std;

#define reg register

typedef long long ll;

#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)

#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)

char io;

int rd()

const int n=5100;

int n,k;

int a[n],sum[n][n];

ll dp[n/5][n];

int pre[26];

inline int max(int a,int b)

int main()e[n<<1];

int head[n],ecnt;

void addedge(int u,int v);

head[u]=ecnt;

}#define erep(u,i) for(int i=head[u];i;i=e[i].nxt)

int a[n];

int sz[n],son[n],l[n],r[n],dfn,id[n];

void pre_dfs(int u,int f)

void init()

} b;

int ans[n];

void dsu(int u,int f)

if(son[u]) dsu(son[u],u);

b.add(a[u]);

erep(u,i)

ans[u]=b.quemax();

}bool ed;

int main()

rep(i,1,n) a[i]=rd();

pre_dfs(1,0);

dsu(1,0);

rep(i,1,rd()) printf("%d\n",ans[rd()]);

}

NOIP提高組模擬賽4

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

牛客模擬賽1 普及組

題號題目 t1牛牛的密碼 t2牛牛的跳跳棋 t3牛牛的最大興趣組 t4牛牛的滑動視窗 得分120 120 直接照題意模擬即可。include include include include using namespace std char xy 100010 dy 100010 sz 100010 ...

牛客模擬賽5 普及組

題號題目 t1購物 t2交換 t3最少移動 t4飛行棋 得分280 400 直接計算 include include include include using namespace std long long t,n,x,k,js1,js2,ans intmain return0 發現此題只有串頭和...