• 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
    ", 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
    ", gg);
    
    	int kk;
    	scanf("%d", &kk);
    	gg = 1.00 / (1 - a[kk][kk]);
    
    	printf("%.8f
    ", gg);
    
    	scanf("%d", &kk);
    	gg = 1.00 / (1 - a[kk][kk]);
    
    	printf("%.8f
    ", 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
    ", 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
    ", 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
    ", 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
    ", ans);
    	return 0;
    }
  • 相关阅读:
    小能客服
    bootstrap 字体图标
    在线绘图(PS)(海报)
    UI教程
    免费在线设计网站
    测量史上首个易语言工程测量模块
    在ado.net中实现oracle存储过程调用两种方式
    VS一些快捷键
    解决Win10家庭版没有‘本地用户和组’问题
    参照示例搭建一个Quertz + Topshelf的一个作业调度服务(基础)
  • 原文地址:https://www.cnblogs.com/cxhscst2/p/7594655.html
Copyright © 2020-2023  润新知