2017 CCPC 湘潭邀请赛

Problem A

Problem B

Problem C

Problem D

直接输出即可。

#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)

const int N = 1e2 + 10;

int c[N][N], f[N][N];
int n, m, a, b;

int main(){

	while (~scanf("%d%d%d%d", &n, &m, &a, &b)){
		rep(i, 1, n){
			rep(j, 1, m) scanf("%1d", c[i] + j);
		}

		rep(i, 1, n * a){
			rep(j, 1, m * b){
				int x = (i - 1) / a + 1;
				int y = (j - 1) / b + 1;
				printf("%d", c[x][y]);
			}
			putchar(10);
		}
	}

	return 0;
}

  

Problem E

Problem F

首先可以肯定的是 $f_{0} + f_{1} + f_{2} + f_{3} = m^{3}$

那么计算出其中的$3$个就可以得到剩余的$1$个。

显然$f_{0}$和$f_{3}$是比较好求的。

所以$f_{1}$和$f_{2}$求出一个,问题就解决了。

大概是……$f_{2}$比较好求?

求$f_{3}$的时候记录一下有哪些三元组是符合这个条件的。

首先枚举两个数,把他们放在$(1, 2)$,$(1, 3)$,$(2, 3)$的位置,然后枚举剩下那个数可以是什么。

首先在$a[]$中没有出现的并且在$[1, m]$中的数肯定可以放,这个直接单独计算。

枚举在$a[]$中出现过的数,得到一个新的三元组,根据题意这个三元组要么计入$f_{2}$要么计入$f_{3}$。

那么看一下是否计入了$f_{3}$,如果不在就计入$f_{2}$

坑点:可能出现$a_{i} > m$的情况。

#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)

typedef long long LL;

const int N = 2e2 + 10;
const int M = 1e7 + 10;

LL f0, f1, f2, f3;
bitset <M> c, d, f;
int n, nn, m;
int tot;
int a[N], b[N];

void calc_f0(){
	rep(i, 1, n) b[i] = a[i];
	sort(b + 1, b + n + 1);

	int cnt = unique(b + 1, b + n + 1) - b - 1;
	tot = cnt;
	rep(i, 1, n) a[i] = lower_bound(b + 1, b + cnt + 1, a[i]) - b;
	f0 = 0ll + m - cnt;
	f0 = 1ll * f0 * f0 * f0;
}

void calc_f1(){
	f1 = 1ll * m * m * m - f0 - f2 - f3;
}

void calc_f2(){

	f2 = 0;
	d.reset();
	f.reset();

	rep(i, 1, n - 1){
		rep(j, i + 1, n){
			int x = a[i] * tot + a[j];
			if (d[x]) continue;
			d.set(x);
			f2 += 0ll + m - tot;
			rep(k, 1, tot){
				int y = a[i] * tot * tot + a[j] * tot + k;
				if (!c[y]) f.set(y);
			}
		}
	}

	d.reset();

	rep(i, 1, n - 1){
		rep(j, i + 1, n){
			int x = a[i] * tot + a[j];
			if (d[x]) continue;
			d.set(x);
			f2 += 0ll + m - tot;
			rep(k, 1, tot){
				int y = k * tot * tot + a[i] * tot + a[j];
				if (!c[y]) f.set(y);
			}
		}
	}

	d.reset();

	rep(i, 1, n - 1){
		rep(j, i + 1, n){
			int x = a[i] * tot + a[j];
			if (d[x]) continue;
			d.set(x);
			f2 += 0ll + m - tot;
			rep(k, 1, tot){
				int y = a[i] * tot * tot + k * tot + a[j];
				if (!c[y]) f.set(y);
			}
		}
	}

	f2 += 0ll + f.count();
}

void calc_f3(){
	int cnt = 0;
	c.reset();
	rep(i, 1, n - 2){
		rep(j, i + 1, n - 1){
			rep(k, j + 1, n){
				int x = a[i] * tot * tot + a[j] * tot + a[k];
				c.set(x);
			}
		}
	}

	f3 = c.count();
}

int main(){

	while (~scanf("%d%d", &n, &m)){
		nn = n;
		n  = 0;
		rep(i, 1, nn){
			int x;
			scanf("%d", &x);
			if (x >= 1 && x <= m) a[++n] = x;
		}

		calc_f0();
		calc_f3();
		calc_f2();
		calc_f1();

		printf("%lld %lld %lld %lld\n", f0, f1, f2, f3);
	}

	return 0;
}

  

Problem G

Problem H

Problem I

Problem J

原文地址:https://www.cnblogs.com/cxhscst2/p/8992768.html

时间: 2024-10-15 04:27:15

2017 CCPC 湘潭邀请赛的相关文章

XTU 1261 - Roads - [最小割][2017年湘潭邀请赛(江苏省赛)B题]

之前在网上搜了一个下午没搜到这道题的题解,然后同时又对着叉姐写的两行字题解看了一个下午: 虽然基本上已经知道了这题的思路,但愣是因为自己代码实现起来太繁复,外加不确定正确性,没敢码-- 但是一道题肝了一下午没肝出来,就要放弃的话,怕是太扎心了,忍不住就跑去ICPCCamp.Post问叉姐了(https://post.icpc-camp.org/d/715-2017-b-roads) 看了叉姐的对于我的几个问题的回复,我总算肯定了我的思路,而且叉姐还在下面给了标程,当时可以说心情非常愉悦: 听起来

2018 CCPC 湘潭邀请赛 &amp; 2018 JSCPC

Problem A Problem B Problem C Problem D Problem E Problem F Problem G Problem H Problem I Problem J Problem K 原文地址:https://www.cnblogs.com/cxhscst2/p/9062107.html

2017 CCPC 杭州赛区小结 By JSB @ Reconquista

Statistics TYPE: Onsite Contest NAME: 2017 - CCPC - Hangzhou PLAT: pc^2 TIME: 2017/11/05 09:00-14:00 LOCA: Zhejiang SCI-TECH University Xiasha Campus TEAM: Reconquista[shb,lsmll,jsb] RANK: 10/190 5.26% (*Including Unofficial Teams) SOLVE: 7/12 PENALT

2017 CCPC Final小结 By JSB @ Reconquista

Statistics TYPE: Onsite Contest NAME: 2017 - CCPC - Final PLAT: pc^2 TIME: 2017/12/03 09:00-14:00 LOCA: Harbin Institute of Technology TEAM: Reconquista [shb,lsmll,jsb] RANK: 3/117 2.56% (*Including Unofficial Teams) SOLVE: 9/11 PENALTY: 884 ? A - 11

HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_{i}}$的最小值. 首先二分答案,那么每个物品的权值就变成了$x * b_{i} - a_{i}$ 在判断的时候先把那些权值为正的物品全部选出来, 然后记录一下从$1$开始可以覆盖到的最右端点的位置. 接下来开始DP,按照区间的端点升序排序(左端点第一关键字,右端点第二关键字) 问题转化为能否用剩

HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)

题目链接  2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块.    分块的时候满足每个块是一个连通块,那么每个块就有一个共同的祖先. 把询问按照第一个点被第一棵树的哪个祖先管辖和第二个点被第二棵树的哪个祖先管辖,分成$n$类. 每一类询问一起处理,处理完后用可撤销并查集恢复到之前的状态. 每一类询问之间依次转移,每次转移,移动次数不会超过$\sqrt{n}$次. 最后总时间复杂度$O(n^{

2018年湘潭邀请赛

题目链接: http://acm.hdu.edu.cn/listproblem.php?vol=53 A题: 题意: 总共有sum(a[i])篇文章,文章含有i条引用的文章数是ai,求最大的h使得最少有h篇文章含有至少h条引用. 思路: 二分,不过一开始把i和ai的含义读反wa了几发. 代码实现如下: 1 #include <set> 2 #include <map> 3 #include <deque> 4 #include <queue> 5 #incl

2017 ICPC 广西邀请赛1004 Covering

Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 187    Accepted Submission(s): 107 Problem Description Bob's school has a big playground, boys and girls always play games here after sch

2014湘潭邀请赛 C题 湘大OJ 1205 Range (单调栈)

Problem Description For an array, the range function is defined below: Range(A)=Max(A)-Min(A)+1; For example, suppose A={1,2,3,4,5}, then Range(A)=5-1+1=5. Now, given an array A(length≤100000), you are going to calcalute the sum of all subarray's ran