A题:给定一个棋盘,放B,W不能相邻,输出摆法
思路:模拟国际象棋,B放在白格,A放在黑格即可
B题:给定一些化学物品,给定哪些可以反应,现在一一加入试管,如果试管之前有加过可以反应的,危险度乘2,初始危险度为1,求最小危险度
思路:用并查集,找出有多少个集合,这些先加进去保证不会反应,那么剩下的一个个加进去都乘2即可
C题:求一个最小密度连通子图,子图必须为一个集合,并且两点存在的话,他们的边必须存在
思路:推一推公式发现是选两个点,密度最大的最优,再往后加一个点都会导致密度变小
D题:根据题目给的函数生成A和B数组,求出长度1-n的子数组中的max(ai*bn-i)
思路:如果1比较多的情况,那么之后从后往前找30个左右很快就能找到答案,如果1比较少的情况,那么直接从前往后,在1的情况上找,这样做的合理性在于,对于b数组,基本1的分布情况是30多个左右就会有1个1,所以总体复杂度并不会太高
E题:一个区间,两种操作,可以染上某种颜色,使每个位置增量增加染上和现有颜色之差绝对值,还有一种操作是询问某个区间的总增量
明显的线段树,区间询问区间查询,利用延迟操作求解
代码:
A:
#include <stdio.h>
#include <string.h>
int n, m;
char g[105][105];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%s", g[i]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == '-') continue;
if ((i + j) % 2 == 0) g[i][j] = 'B';
else g[i][j] = 'W';
}
}
for (int i = 0; i < n; i++)
printf("%s\n", g[i]);
return 0;
}B:
#include <stdio.h>
#include <string.h>
int n, m;
int parent[55];
int find(int x) {
if (x == parent[x]) return x;
return parent[x] = find(parent[x]);
}
int main() {
scanf("%d%d", &n, &m);
int ans = n;
int x, y;
for (int i = 1; i <= n; i++)
parent[i] = i;
while (m--) {
scanf("%d%d", &x, &y);
int pa = find(x);
int pb = find(y);
if (pa != pb) {
parent[pa] = pb;
n--;
}
}
long long out = 1;
for (int i = 0; i < ans - n; i++)
out *= 2;
printf("%lld\n", out);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 505;
int n, m;
double v[N];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%lf", &v[i]);
int a, b;
double w;
double ans = 0;
while (m--) {
scanf("%d%d%lf", &a, &b, &w);
ans = max(ans, (v[a] + v[b]) / w);
}
printf("%.15lf\n", ans);
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100005;
int a[N], b[N], n, d, x, to[N], q[N];
int getnext() {
x = (x * 37LL + 10007) % 1000000007;
return x;
}
void initAB() {
for (int i = 0; i < n; i++)
a[i] = i + 1;
for (int i = 0; i < n; i++)
swap(a[i], a[getnext() % (i + 1)]);
for (int i = 0; i < n; i++) {
if (i < d)
b[i] = 1;
else
b[i] = 0;
}
for (int i = 0; i < n; i++)
swap(b[i], b[getnext() % (i + 1)]);
}
int main() {
scanf("%d%d%d", &n, &d, &x);
initAB();
for (int i = 0; i < n; i++) {
to[a[i]] = i;
if (b[i]) q[++q[0]] = i;
}
int s = 30;
for (int i = 0; i < n; i++) {
int j;
for (j = n; j >= n - s; j--) {
if (j > 0 && i >= to[j] && b[i - to[j]]) {
printf("%d\n", j);
break;
}
}
if (j < n - s) {
int ans = 0;
for (int j = 1; j <= q[0] && q[j] <= i; j++)
ans = max(ans, a[i - q[j]]);
printf("%d\n", ans);
}
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 100005;
typedef long long ll;
inline int lson(int x) {return x<<1;}
inline int rson(int x) {return x<<1|1;}
struct Node {
int l, r;
ll sum, col, add;
int size() {return r - l + 1;}
int mid() {return (r + l)>>1;}
} node[N * 4];
void pushup(int x) {
node[x].col = (node[lson(x)].col == node[rson(x)].col?node[lson(x)].col : 0);
node[x].sum = node[lson(x)].sum + node[rson(x)].sum;
}
void pushdown(int x) {
if (node[x].add) {
node[lson(x)].add += node[x].add;
node[rson(x)].add += node[x].add;
node[lson(x)].sum += node[x].add * node[lson(x)].size();
node[rson(x)].sum += node[x].add * node[rson(x)].size();
node[lson(x)].col = node[rson(x)].col = node[x].col;
node[x].col = node[x].add = 0;
}
}
void build(int x, int l, int r) {
node[x].l = l; node[x].r = r;
node[x].sum = node[x].col = node[x].add = 0;
if (l == r) {
node[x].col = l;
return;
}
build(lson(x), l, node[x].mid());
build(rson(x), node[x].mid() + 1, r);
pushup(x);
}
void update(int x, int l, int r, ll col) {
if (node[x].l >= l && node[x].r <= r && node[x].col) {
node[x].add += abs(node[x].col - col);
node[x].sum += abs(node[x].col - col) * node[x].size();
node[x].col = col;
return;
}
pushdown(x);
if (l <= node[x].mid())
update(lson(x), l, r, col);
if (r > node[x].mid())
update(rson(x), l, r, col);
pushup(x);
}
long long query(int x, int l, int r) {
if (node[x].l >= l && node[x].r <= r)
return node[x].sum;
pushdown(x);
long long ans = 0;
if (l <= node[x].mid())
ans += query(lson(x), l, r);
if (r > node[x].mid())
ans += query(rson(x), l, r);
return ans;
}
int n, m;
int main() {
scanf("%d%d", &n, &m);
build(1, 1, n);
int q, l, r;
ll x;
while (m--) {
scanf("%d", &q);
if (q == 1) {
scanf("%d%d%lld", &l, &r, &x);
update(1, l, r, x);
}
else {
scanf("%d%d", &l, &r);
printf("%lld\n", query(1, l, r));
}
}
return 0;
}Codeforces Round #254 (Div. 2),布布扣,bubuko.com
Codeforces Round #254 (Div. 2)
原文地址:http://blog.csdn.net/accelerator_/article/details/37580125