2017 ACM/ICPC Asia Regional Guangxi Online 记录

题目链接  Guangxi

感觉这场比赛完全是读题场啊……

比赛过程中丢失了一波进度,最后想开题的时候已经来不及了……

 

Problem A

按题意模拟……按照那个矩阵算就可以了

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)


double a[10][10];
int b[100010];
char s[100010];

int main(){

	rep(i, 1, 4) rep(j, 1, 4) cin >> a[i][j];
	getchar();
	fgets(s, 100010, stdin);
	int len = strlen(s);

	int n = 0;
	rep(i, 0, len - 1){
		if (s[i] >= '0' && s[i] <= '9'){
			++n;
			b[n] = s[i] - 48;
		}
	}

	double gg = 1.0000000;

	rep(i, 1, n - 1) gg = gg * a[b[i]][b[i + 1]];

	printf("%.8f\n", gg);
	fgets(s, 100010, stdin);
	len = strlen(s);

	n = 0;
	rep(i, 0, len - 1){
		if (s[i] >= '0' && s[i] <= '9'){
			++n;
			b[n] = s[i] - 48;
		}
	}

	gg = 1.0000000;

	rep(i, 1, n - 1) gg = gg * a[b[i]][b[i + 1]];

	printf("%.8f\n", gg);

	int kk;
	scanf("%d", &kk);
	gg = 1.00 / (1 - a[kk][kk]);

	printf("%.8f\n", gg);

	scanf("%d", &kk);
	gg = 1.00 / (1 - a[kk][kk]);

	printf("%.8f\n", gg);
	return 0;
}

 

Problem C

这道题限制条件比较多,比赛的最后一分钟才通过

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second

typedef long long LL;
typedef pair <int, int> PII;

const int N = 2010000;

vector <PII > a;


int n, m;
int ans[N];
int q;


bool cmp(PII a, PII b){
	return a.fi == b.fi ? a.se < b.se : a.fi > b.fi;
}

int main(){

	scanf("%d%d", &n, &m);
	rep(i, 1, n){
		a.clear();
		int x;
		scanf("%d", &x);
		int xx, yy;
		int cnt = 0;
		while (true){
			scanf("%d", &xx);
			if (xx == -1) break;
			scanf("%d", &yy);
			if (yy < x) continue;
			++cnt;
			a.push_back({yy, xx});
		}

		if (cnt == 0) continue;
		sort(a.begin(), a.end(), cmp);

		int uu = a[0].se;
		int  hhhh = 0;
		if (cnt == 1) hhhh = x; else hhhh = a[1].fi;
		int  tt = hhhh * 1.1000;
	 	int ff = min(tt, a[0].fi);
		ans[uu] += (int)ff;
	}		

	scanf("%d", &q);
	while (q--){
		int k;
		scanf("%d", &k);
		printf("%d\n", ans[k]);
	}

	return 0;
}

 

Problem F

求矩形面积并 模板题

#include <bits/stdc++.h>

using namespace std;

#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1

typedef long long LL;

const LL N = 1e5 + 10;

int n;
struct Seg {
	double l, r, h;
	LL d;
	Seg() {}
	Seg(double l, double r, double h, LL d): l(l), r(r), h(h), d(d) {}
	bool operator< (const Seg& rhs) const {return h < rhs.h;}
} a[N];

LL cnt[N << 2];
LL sum[N << 2], all[N];

void push_up(LL l, LL r, LL rt){
	if (cnt[rt]) sum[rt] = all[r + 1] - all[l];
	else if(l == r) sum[rt] = 0; //leaves have no sons
	else sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void update(LL L, LL R, LL v, LL l, LL r, LL rt) {
	if(L <= l && r <= R) {
		cnt[rt] += v;
		push_up(l, r, rt);
		return;
	}
	LL m = l + r >> 1;
	if(L <= m) update(L, R, v, lson);
	if(R > m) update(L, R, v, rson);
	push_up(l, r, rt);
}

int main() {

	while (~scanf("%d", &n)){
		if (n == 0){ putchar('*'); break;}
		for(LL i = 1; i <= n; ++i) {
			LL x1, y1, x2, y2;
			scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
			a[i] = Seg(x1, x2, y1, 1);
			a[i + n] = Seg(x1, x2, y2, -1);
			all[i] = x1; all[i + n] = x2;
		}
		n <<= 1;
		sort(a + 1, a + 1 + n);
		sort(all + 1, all + 1 + n);
		LL m = unique(all + 1, all + 1 + n) - all - 1;

		memset(cnt, 0, sizeof cnt);
		memset(sum, 0, sizeof sum);

		LL ans = 0;
		for(LL i = 1; i < n; ++i) {
			LL l = lower_bound(all + 1, all + 1 + m, a[i].l) - all;
			LL r = lower_bound(all + 1, all + 1 + m, a[i].r) - all;
			if(l < r) update(l, r - 1, a[i].d, 1, m, 1);
			ans += sum[1] * (a[i + 1].h - a[i].h);
		}
		printf("%lld\n", ans);
	}
	return 0;
}

 

Problem G

推出勾股定理的公式之后直接迭代一波

迭代的时候减掉的那个值忘记*2 WA2小时

=。=

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second


typedef long long LL;
typedef double ld;

ld r;
int k;
int l;

ld sqr(ld x){ return x * x;}

ld calc(ld r, int k){
	ld ret;
	ld now = (sqrt(3.00) - 1.00) * r;
	rep(i, 1, k){
		ret = (now * now) / (2 * now + 2 * r);
		now -= ret * 2;
	}

	return ret;
}

int main(){

	while (~scanf("%d", &l)){
		if (l == -1) break;
		cin >> r;
		rep(i, 1, l){
			cin >> k;
			double yy = calc(r, k);
			printf("%d %d\n", k, (int)(yy));
		}
	}


	return 0;
}

 

Problem L

水DP  树状数组维护

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second


typedef long long LL;

const int N = 2e5 + 10;

int va[N], w[N], b[N];
int n, x;
int c[N], f[N];


inline void update(int x, int val){
	for (; x <= n; x += x & -x) c[x] = max(c[x], val);
}

inline int query(int x){
	int ret = 0;
	for (; x; x -= x & -x) ret = max(ret, c[x]);
	return ret;
}

int main(){

	while (~scanf("%d", &x)){
		++n;
		if (x >= 10000) va[n] = x - 10000;
		else va[n] = x;
		if (x <  0) w[n] = 0; else if (x >= 10000) w[n] = 5; else w[n] = 1;
	}


	rep(i, 1, n) b[i] = va[i];
	sort(b + 1, b + n + 1);
	int cnt = unique(b + 1, b + n + 1) - b - 1;
	rep(i, 1, n) va[i] = lower_bound(b + 1, b + cnt + 1, va[i]) - b;

	memset(c, 0, sizeof c);
	rep(i, 1, n){
		f[i] = query(va[i]) + w[i];
		update(va[i], f[i]);
	}

	int ans = 0;
	rep(i, 1, n) ans = max(ans, f[i]);
	printf("%d\n", ans);
	return 0;
}
posted @ 2017-09-26 00:23  cxhscst2  阅读(171)  评论(0编辑  收藏  举报