【2014 ACM/ICPC Asia Regional Shanghai Online】

1.最近开始刷刷题,没找到什么好的方法,就把之前的比赛一场一场拿出来刷刷。

2.the Sum of Cube。三次方求和,很简单,三次方求和就是pow(C(n+1,2),2).但是由于这个数比较大,高精度搞一下。我用JAVA 直接AC的。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static BigInteger Get(BigInteger a){
        return a.multiply(a.add(BigInteger.ONE)).divide(new BigInteger("2"));
    }
    public static BigInteger pow(BigInteger a){
        return Get(a).multiply(Get(a));
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        for(int ca=1;ca<=T;ca++){
            BigInteger a=cin.nextBigInteger();
            BigInteger b=cin.nextBigInteger();
            System.out.println("Case #"+ca+": "+pow(b).subtract(pow(a.subtract(BigInteger.ONE))));
        }
    }
}

3.Sawtooth。这题其实是一个很套路的题目了,n多种方法计算,其实核心就是欧拉公式,当然欧拉公司有好几个,我说的是欧拉关于平面图的公式。就是顶点数,边数,面数的关系。这个题可以这样算:

      首先直线分平面是C(n+1,2)+1.现在M可以被看做四条直线,所以把n=4n带入,但是发现其实它没有达到4n的效果,因为还有损失。这个损失其实是和边数成正比的,比例系数用n=1带入算一下,就是n=4时其实应该有11个面,但是现在只有2个,损失了九个,所以就是减掉9n。所以式子就是:C(4n+1,2)+1-9n.数据比较大,还是JAVA。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static BigInteger pow(BigInteger a){
        return a.multiply(a.multiply(new BigInteger("8")).subtract(new BigInteger("7"))).add(BigInteger.ONE);
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        for(int ca=1;ca<=T;ca++){
            BigInteger a=cin.nextBigInteger();
            System.out.println("Case #"+ca+": "+pow(a));
        }
    }
}

4.Contest。这个题做法有很多,其实最直观就是状压DP。考虑dp[i][j]表示前i道题目,做题情况为j最大的收益。这个j表示了前i道题的做题情况的一个二进制表示。但是可以发现,如果考虑前n道题目,其实是每个人都需要做一道的,那么从这个角度出发,就是可以把m道题目划分为m/n取上整段,j保存的最近n道题的情况,因为如果前n道题做完,就可以把这个j的信息滚动掉了,不需要考虑。那么到这里其实就有两种做法,对于每n题,其实就是一个dp。当然这里也可以用费用流。dp的转移式子:

                                                       dp[i+1][st]=max(dp[i+1][st],dp[i][j]+p[k][i])

这是一个人人为我的dp,最后的结果就是dp[m][i]取个最大值。p[k][i]表示第i个题目由k来做,st表示当第i个题目由k来做这i道题目做题情况达到的状态,显然st=j|(1<<k).然后就完事了。别问我代码为啥还没写完,因为一旦我分析好了咋写,就没兴趣了。毕竟我是著名的口胡大师。

---更新代码,简单的写了一下,还是比较好写的。主要是位运算的意义明白咋回事就好。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1500;
double p[15][maxn];
double dp[maxn][maxn];
int n, m;
void get() {
	for (int i = 0; i <= m; i++)
		for (int j = 0; j < (1 << n); j++)
			dp[i][j] = -1.0;
	dp[0][0] = 0;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < (1 << n); j++) {
			if (dp[i][j] < 0)continue;
			for (int k = 0; k < n; k++) {
				if (!((1 << k) & j)) {
					int st = j | (1 << k);
					if (st == ((1 << n) - 1))st = 0;
					dp[i + 1][st] = max(dp[i + 1][st], dp[i][j] + p[k][i]);
				}
			}
		}
	}
}

int main() {
	int T; scanf("%d", &T);
	for (int ca = 1; ca <= T; ca++) {
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				scanf("%lf", &p[i][j]);
			}
		}
		get();
		double ans = 0;
		for (int i = 0; i < (1 << n); i++)
			ans = max(ans, dp[m][i]);
		printf("Case #%d: %.5lf\n", ca, ans);
	}
}

5.Tree。这题有啥好说的,树链剖分裸题。剖完+树状数组/线段树,就是区间修改,单点查询。别问我代码为啥没有,因为我手写了一个树剖,还没调完。手写书剖也是很简单的嘛[狗头]。

--- 更新:这个题我想简单了,似乎没那么好过。。。。好像还卡读入,以及内存。

// 代码留坑

6.Airport。这个题开始没仔细看,选取的K个是在N个点里面选,要不然我以为是Kmeans聚类呢。。。。其实这个题就是抽象了一下,就是在这个格子里面选k个点把所有的点覆盖掉,并且花费最小。覆盖问题?最小点覆盖呗。但是距离咋算?然后偷偷看了一眼题解,原来是DLX覆盖。。。好吧,这玩意其实我只是知道,并没有用过。DLX覆盖其实还是很常见的,学习了学习了。代码?前两个都没有,这个肯定也没呀。

// 代码留坑

暂时是这五个题,后边的还没看,先把他们AC了。

--- 更新

7.Divided Land 这个题着实有点。。。。。,这场比赛可能应该叫做BigInteger知多少。。。简单概括一下就是二进制状态下的gcd,求完gcd输出这个gcd的二进制。可以转换为十进制求然后再转回来。但是JAVA 中的BigInteger 里面有这些操作。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static BigInteger pow(BigInteger a){
        return a.multiply(a.multiply(new BigInteger("8")).subtract(new BigInteger("7"))).add(BigInteger.ONE);
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        for(int ca=1;ca<=T;ca++){
            BigInteger a=cin.nextBigInteger(2);
            BigInteger b=cin.nextBigInteger(2);
            System.out.println("Case #"+ca+": "+a.gcd(b).toString(2));
        }
    }
}

8.

没怎么看懂题目的意思,懒得看了。

9.gcd pair。一个数论题,比较有意思,可以写一下。

// 代码留坑

10.Yaoge’s maximum profit大家数据结构都这么厉害吗??,这个题过的比gcd pair多了好几倍。。。大概看了一下,应该是一个LCA问题。但是考虑道又是树上路径修改,所以大概率也得树剖一下+线段树维护。

基本上感觉看了这几个题目,总的来说不是很好。码农题居多。后边应该还有一个计算几何,等把这几个AC了以后看看能不能做的动。

// 代码留坑
发布了383 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41863129/article/details/105342393