CodeForces 878 簡要題解

2021-08-09 22:51:03 字數 4398 閱讀 1401

起床困難症候群,隨便構造一下就好了。

#include 

#define xx first

#define yy second

#define mp make_pair

#define pb push_back

#define mset(x, y) memset(x, y, sizeof x)

#define mcpy(x, y) memcpy(x, y, sizeof x)

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

inline

int read()

int n, x, y = 1023;

char opt[3];

int main()

puts("2");

printf("& %d\n", x ^ y);

printf("^ %d\n", x);

return

0;}

先用棧把內部的消掉,剩下的一定是消一頭一尾。

消的時候如果一頭一尾的出現次數加起來恰好為

k 就消下去,注意一些邊界情況。

#include 

#define xx first

#define yy second

#define mp make_pair

#define pb push_back

#define mset(x, y) memset(x, y, sizeof x)

#define mcpy(x, y) memcpy(x, y, sizeof x)

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

inline

int read()

const

int maxn = 100005;

int n, m, q, c, a[maxn], b[maxn];

ll ans;

int main()

else

c ++, a[c] = x, b[c] = 1;

if (!c)

return

puts("0"), 0;

int tot = 0, del = 0, pos = 0;

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

tot += b[i];

for (int i = 1; i < c + 1 - i; i ++)

if (a[i] == a[c + 1 - i] && b[i] + b[c + 1 - i] == m)

del += m;

else

if (pos)

else

cout

<< ans << endl;

return

0;}

題目名字提示類似競賽圖。

首先變成圖論問題,i能贏

j 連邊(i

,j),可以贏的人一定能到達所有點。

兩個點之間至少有一條邊,就是說縮環之後是一條鏈。

新加乙個點可能帶來縮掉若干個scc,對於每個scc維護每種屬性的最大最小值,用set維護一下鏈上的相對位置關係,暴力縮環即可。

#include 

#define xx first

#define yy second

#define mp make_pair

#define pb push_back

#define mset(x, y) memset(x, y, sizeof x)

#define mcpy(x, y) memcpy(x, y, sizeof x)

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

inline

int read()

const

int maxn = 50005;

int n, m, siz[maxn], l[maxn][10], r[maxn][10];

set s;

inline

bool win(int x, int y)

inline

void insert(int x)

else

break;

}while (true)

else

break;

}else

break;

}s.insert(mp(l[x][0], x));

}int main()

考慮將ai

變成0/

1 ,那麼取

max 和

min 相當於or

和and

操作。每個序列可以用乙個2k

位二進位制數表示,第

s 位表示初始的0/

1狀態為

s ,那麼這個序列的狀態是什麼,用bitset加速即可。

#include 

#define xx first

#define yy second

#define mp make_pair

#define pb push_back

#define mset(x, y) memset(x, y, sizeof x)

#define mcpy(x, y) memcpy(x, y, sizeof x)

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

inline

int read()

const

int maxn = 100005;

const

int maxm = 4100;

int n, m, q, c, a[12][maxn];

bitset

b[maxn];

int main()

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

}return

0;}

首先單次詢問可以倒著貪心做,如果是負數就把它乘二加到答案(最後合併),否則去和前乙個合併。求出i

往前這樣做一步的長度,倍增加速詢問。

注意**裡雖然寫了

2 層for,但是均攤下來應該是nl

ogn的。

#include 

#define xx first

#define yy second

#define mp make_pair

#define pb push_back

#define mset(x, y) memset(x, y, sizeof x)

#define mcpy(x, y) memcpy(x, y, sizeof x)

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

inline

int read()

const

int maxn = 100005;

const

int mod = 1e9 + 7;

int n, m, a[maxn], bin[maxn], inv[maxn], s[maxn], f[18][maxn], g[18][maxn];

inline

int get(int l, int r)

inline

int solve(int l, int r)

int main()

else

if (cur > 2000000000)}}

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

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

if (!~f[i - 1][j])

f[i][j] = -1;

else

f[i][j] = f[i - 1][f[i - 1][j]], g[i][j] = (g[i - 1][j] + g[i - 1][f[i - 1][j]]) % mod;

while (m --)

return

0;}

質量挺高的…感覺姿勢不對這場每個題(除了a)細節都會比較鬼畜…

CodeForces 878D 遞迴(搜尋)

開始有k個生物,有n個屬性 支援3種操作 1.將兩個生物合併成乙個新的生物,所有屬性值為原來的較大值 2.將兩個生物合併成乙個新的生物,所有屬性值為原來的較小值 3.詢問i生物的第j個屬性值 n 1e5 k 12 q 1e5 input 三個數 n k q分別表示屬性數,生物數以及運算元 之後k行每...

Codeforces 599 簡要題解

這套題目做得我好難受,de比較神仙,所以還沒有做出來 codeforces 599 當兩個格仔的距離是n的因子 非1 時兩個格仔顏色相同,求最後有多少個不同顏色的格仔 n 1012 include include include include define ll long long using n...

Codeforces 599 簡要題解

這套題目做得我好難受,de比較神仙,所以還沒有做出來 codeforces 599 當兩個格仔的距離是n的因子 非1 時兩個格仔顏色相同,求最後有多少個不同顏色的格仔 n 1012 include include include include define ll long long using n...