本期考察STL的性质较多,如果熟悉的话基本可以秒掉
简单的搜索问题,练手
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
int n, K;
int w[10][10];
bool vis[10];
int ans = 0;
void dfs(int step, int u, int val) {
if (step == n - 1) {
if (val + w[u][0] == K)
ans += 1;
return;
}
for (int v = 0; v < n; ++v) {
if (vis[v] == 0) {
vis[v] = 1;
dfs(step + 1, v, val + w[u][v]);
vis[v] = 0;
}
}
}
int main() {
//freopen("in.txt", "r", stdin);
scanf("%d%d", &n, &K);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
scanf("%d", &w[i][j]);
}
}
vis[0] = 1;
dfs(0, 0, 0);
printf("%d\n", ans);
return 0;
}
模拟,会排序就能做
用map来记录当前时间点的操作,每个时间点的操作完毕检查
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
LL n, W;
map<LL, vector<pair<LL, LL>>> orders;
int main() {
//freopen("in.txt", "r", stdin);
scanf("%lld%lld", &n, &W);
set<LL> ts;
for (int i = 0; i < n; ++i) {
LL s, t, w;
scanf("%lld%lld%lld", &s, &t, &w);
orders[s].push_back({ 1, w });
orders[t].push_back({ 2, w });
ts.insert(s);
ts.insert(t);
}
vi ti(ts.begin(), ts.end());
sort(ti.begin(), ti.end());
bool ac = 1;
LL cur = 0;
for (auto x : ti) {
for (auto &item : orders[x]) {
if (item.first == 1) {
cur += item.second;
}
else {
cur -= item.second;
}
}
if (cur > W) {
ac = 0;
break;
}
}
if (ac) {
printf("Yes\n");
}
else {
printf("No\n");
}
return 0;
}
由于可以走任意步,实际上就是在三个方向上求前缀和
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
int H, W;
char s[2005][2005];
LL dp[2002][2002];
LL row_dp[2002][2002]; // sum
LL col_dp[2002][2002];
LL dia_dp[2002][2002];
LL mod = LL(1e9) + 7;
int main() {
//freopen("in.txt", "r", stdin);
scanf("%d%d", &H, &W);
for (int i = 0; i < H; ++i) {
scanf("%s", s[i]);
}
dp[0][0] = 1;
row_dp[0][0] = col_dp[0][0] = dia_dp[0][0] = 1;
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
if (i + j == 0) continue;
if (s[i][j] == '#') continue;
if (i - 1 >= 0) dp[i][j] += col_dp[i - 1][j];
if (j - 1 >= 0) dp[i][j] += row_dp[i][j - 1];
if (i - 1 >= 0 && j - 1 >= 0) dp[i][j] += dia_dp[i - 1][j - 1];
dp[i][j] %= mod;
col_dp[i][j] = row_dp[i][j] = dia_dp[i][j] = dp[i][j];
if (i - 1 >= 0)
col_dp[i][j] = (col_dp[i - 1][j] + col_dp[i][j]) % mod;
if (j - 1 >= 0)
row_dp[i][j] = (row_dp[i][j - 1] + row_dp[i][j]) % mod;
if (i - 1 >= 0 && j - 1 >= 0)
dia_dp[i][j] = (dia_dp[i - 1][j - 1] + dia_dp[i][j]) % mod;
}
}
LL ans = dp[H - 1][W - 1];
printf("%lld\n", ans);
return 0;
}
并查集是并查集,但是在并查集里进行分类操作。乍一看是 O ( N 2 ) O(N^2) O(N2)操作。实际上如果并到最后,并没有那么多的并操作。具体的时间复杂度待研究。。。。
用一个map[i][j]来记录第i个组去上j课的人数。并查集操作的时候小集加入大集。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
map<int, int> cnt[200020];
int n, q;
int c[200020];
int lev[200020];
int fa[200020];
int getf(int x) {
if (x == fa[x]) return x;
return fa[x] = getf(fa[x]);
}
int main() {
//freopen("in.txt", "r", stdin);
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; ++i) {
scanf("%d", c + i);
cnt[i][c[i]] = 1;
}
for (int i = 1; i <= n; ++i)
fa[i] = i, lev[i] = 1;
for (int i = 0; i < q; ++i) {
int op, u, v;
scanf("%d%d%d", &op, &u, &v);
if (op == 1) {
int fu = getf(u), fv = getf(v);
if (fu == fv) continue;
if (lev[fu] <= lev[fv]) {
swap(fu, fv);
}
fa[fv] = fu;
if (lev[fu] == lev[fv])
lev[fu] += 1;
for (auto it : cnt[fv]) {
int ci = it.first;
cnt[fu][ci] += it.second;
}
}
else {
int fu = getf(u);
printf("%d\n", cnt[fu][v]);
}
}
return 0;
}