補題場 codeforece第一周周賽

2021-10-10 03:32:57 字數 2142 閱讀 2227

傳送門

題意:狀態定義f[i]:f[0]表示不選,f[1]表示選擇。

狀態轉移f[1]=f[0]+a,f[0]=f[1]-a。最終答案為f[1],因為最後一位為加的答案肯定大於為減的。

#include

using

namespace std;

const

int n=

3e5+10;

long

long f[2]

;int

main()

cout<<}return0;

}

傳送門

題意:求最少次相鄰數字的交換後,得到翻轉後的串。

交換相鄰數字,就可以想到求逆序對的數量,同時,將數字正確位置,按公升序分配給相同數字(貪心),然後用樹狀陣列求逆序對

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

2e6+

100;

int n;

char a[n]

,b[n]

;vector<

int> pos[30]

;ll num[n]

,pp[n]

;ll tree[n]

;ll lowbit

(ll k)

void

add(ll x,ll k)

}ll sum

(ll x)

return ans;

}int

main()

ll ans=0;

for(

int i=n;i>

0;i--

) cout

}

傳送門

題意:求交集

#includeusing namespace std;

#define int long long

const int n=300009;

long long n,k,p=998244353;

struct point

qaq[n];

long long a[n],init[n];

bool cmp(point ***,point yyy)}if

(!flag)

for(

int i=

2;i<=

sqrt

(x);i++)}

num*

=(cnt+1)

;}if(x>

1) num*=2

;if(num-

2!=n) flag=0;

if(flag) cout

<}return0;

}

傳送門

題意:計數類dp,狀態定義f[i][0/1/2]表示i字元前a,b,c結尾的子串個數,那麼可得到狀態轉移方程

當a[i]!=?時

f[i][0]=f[i-1][0]+3^(cnt-1) (問號的個數)

f[i][1]=f[i-1][0]+f[i-1][1]

f[i][2]=f[i-1][1]+f[i-1][2]

當a[i]=?時,

f[i][0]=f[i-1][0]*3

f[i][1]=f[i-1][0]*3+f[i-1][1]

f[i][2]=f[i-1][1]*3+f[i-1][2]

#include

using

namespace std;

typedef

long

long ll;

const

int n=

2e5+

10,mod=

1e9+7;

int n;

char str[n]

;long

long f[n][3

];intmain()

else

} cout<];

return0;

}

2018第一場多校 補題

distinct values ps 思路巨明顯,就是 寫不出,總想著一次更新一條線段。這裡用乙個set,存的是當前能用的數的。怎麼去更新set,記錄上乙個區間的左右端點 l r 然後類似於莫隊的寫法。看 吧。注意上乙個區間和當前區間沒有公共端點時要特判!也就是 中的 if 語句 include i...

杭電多校第一場補題

include include include include include include include include define int long long using namespace std const int maxn 1e4 10 const int inf 0x3f3f3f3...

VJ個人賽第一場補題 H

描述 我們都知道數字是個好玩意,那麼我們想知道乙個數字能是否能用若干個 或許是乙個 連續的素數之和表示,並且想知道有多少種方法。例如,53 有兩種表示方法 5 7 11 13 17 和 53。現在給你乙個整數 n,你要告訴他這個數字有多少種不同的連續素數和表示方式。輸入 多組資料輸入,每行乙個數字 ...