起床困難症候群,隨便構造一下就好了。
#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...