多校第五場(字串)

2022-01-10 09:54:48 字數 2970 閱讀 7099

5783.divide the sequence

題意:給出一段序列,盡可能多得分割序列使得每段字首和非負。

分析:既然字首和非負,那麼從後往前遍歷,若非負則++。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define f(i,a,b) for (int i=(a),_##i=(b); i<=_##i; i++)

#define rof(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--)

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

#define rek(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--)

#define mem(a,b) memset(a,b,sizeof(a))

#define cpy(a,b) memcpy(a,b,sizeof(b))

int a[1001000

],n;

long

long

sum,m;

intmain()

}printf(

"%i64d\n

",sum);

}return0;

}

5791.two

題意:給出兩個數字序列,求兩個序列的公共子串行的個數(可重複)

分析:可dp,可用樹狀陣列做。

先給出dp方程,再解釋.

dp[i][j]=(dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1])%mod;——1

if(dp[i][j]<0) dp[i][j]+=mod;——2

if(a[i]==b[j]) dp[i][j]=(dp[i][j]+dp[i-1][j-1]+1)%mod;——3

第乙個是每次都要使用的,因為dp[i][j]要加上除去a[i]的(dp[i-1][j]),加上除去b[j]的(dp[i][j-1],再減去重複加的(dp[i-1][j-1],就ok啦。

第二個是保證dp[i][j]為正,因為在減dp[i-1][j-1]中可能為負,故要處理。

最後是第三個,因為如果a[i]==b[j],那麼對前面的所有都可加上a[i],b[j],所以要加一遍dp[i-1][j-1],然後a[i]和b[j]單獨匹配得到,需要+1,

舉個例子:

1 2 3 4 

1 2匹配到2時,前面所有的匹配到的(1,1)都可變成(1 2,1 2)所以需要加一遍dp[i-1][j-1],ok啦。

//

jing miao de dong gui

#include#include

const

int mod=1000000007

;int dp[1010][1010

];int a[1010],b[1010

],n,m;

intmain()

printf(

"%d\n

",dp[n][m]);

}}

5792.world is exploding

題意:給出數字序列,找出滿足某些條件的四個數的組數,aaad&&c分析:因為數字範圍很大(達到1e9),而箇數最多只有5萬個,故要離散化。然後對每個數統計左邊大於(l)和小於(l1)它的數,右邊大於(r)和小於(r1)它的數。

最後處理特殊情況,左邊*右邊-特殊情況就可以得到結果了,具體見bc的blog。

#includeusing

namespace

std;

const

int maxn = 5e4+7

;int

d[maxn],n,a[maxn],l[maxn],r[maxn],l1[maxn],r1[maxn];

inline

int lowbit(int

x)//

改點求段

inline void update(int x,int

v)//

d[1]~d[x]

inline int

get(int

x)map

h;vector

v;intmain()

sort(v.begin(),v.end());

//排序

v.erase(unique(v.begin(),v.end()),v.end());//

去重+翻轉數列

//for(int i=0;ifor(int i=0;i//

hash?

h[v[i]]=i+1

;

for(int i=1;i<=n;i++)a[i]=h[a[i]];

long

long ans1=0,ans2=0,ans3=0;//

樹狀陣列求左邊大於或小於它的數

for(int i=1;i<=n;i++)

memset(d,

0,sizeof

(d));

for(int i=n;i>=1;i--)

for(int i=1;i<=n;i++) printf("

l[i]=%d l1[i]=%d r[i]=%d rl[i]=%d\n

",l[i],l1[i],r[i],r1[i]);

for(int i=1;i<=n;i++)

cout

小的*大的-特殊情況

}}

13 多校第五場

1009 題目鏈結 題目大意 求乙個數有多少種不同的劃分方式 參考 講的很詳細,重點就是乙個公式 include include include include include includeusing namespace std define mod 1000000007 long long in...

多校練習賽 第五場

多校第五場 1001 inversion 剛看到這道題的時候就知道是歸併排序了,可是當時沒有掌握清楚,在網上找了些例題,感覺跟題意差太遠用不 上,結果剛才仔細看了下,其實就是歸併排序的模板題,哎。悲劇呀!include include define maxn 100010 using namespa...

牛客多校(第五場)E room

將乙個房間當做乙個點,後來的房間與之前的房間中不用搬的人作為權值,建圖,跑最大權匹配,就是不用搬的人數,在減一下即可,km演算法,o n 3 include include include includeusing namespace std define n 200 define inf 0x3f...