构造

因为题目只要求两位相同,所以可以暴力枚举这两位所有的可能性,方案数为\(O(n^2)\)。

但是,这么做是显然不优的,因为完全没有用到第三位。

观察题目条件:n为偶数。

就想一想能不能奇数偶数分开来做呢?

注意到一共有三位,总共放到奇偶两个抽屉中,必有一个抽屉有两个位,即存在两位同奇偶。

我们就想办法枚举到这两位同奇偶的数对。

一个有序三元组\((a,b,c)\)可以覆盖三个有序的二元组\((a,b,?),(?,b,c),(a,?,c)\)

这样的有序二元组取值为\([1,n]\)时共有\(3n^2\)

由于我们分奇偶讨论,所以每种有\(\frac{3}{4}n^2\)个,总计\(\frac{3}{2}n^2\)个

如果两两不相同,那么一次性可以排除三个,总共需要排除\(\frac{n^2}{2}\)次。

可以很容易构造出两两不同的方案,详情见代码。

此时我们感觉答案已经很优了。

证明

设你使用了猜了\(t\)个答案

所有答案为\((a_i,b_i,c_i)\)这样的三元组

按照\(a_i\)划分为\(n\)个集合\(S_i\),\(S_i\)中每个三元组的\(a\)等于\(i\)

设\(s_i=|S_i|\)

显然这些答案要求覆盖所有的\(n^3\)个三元组

一个答案\((a,b,c)\)可以覆盖所有形如\((a,b,?),(?,b,c),(a,?,c)\)的三元组,不难发现有\(3n-2\)个

考察每个集合内部重复覆盖的三元组

如:

\((a,b,c)\)和\((a,d,e)\)共同覆盖了\((a,b,e),(a,d,c)\)两个三元组

\((a,b,c)\)和\((d,b,e)\)共同覆盖了\((d,b,c),(a,b,e)\)两个三元组

\((a,b,c)\)和\((a,b,d)\)共同覆盖了\((a,b,?)\)共\(n\)个三元组(只考虑\(n\ge4\)的情况)

所以同一集合内的两个三元组至少重复覆盖了2个三元组

按\(a\)和按\(b\)分类算两次并不会使答案变得比实际更小。(只有前两项相同的三元组才会重复减去,而需要减去的\(n\ge2+2\),所以不会重复)

发现:

\[\sum_{i=1}^{n}{2(_{2}^{s_i})}\ge n*(\frac{t}{n})^2-t
\]

所以总共覆盖的三元组至多有

\[(3n-2)t-2*(n*(\frac{t}{n})^2-t)\ge n^3
\]

这样就可以解出来\(t\ge\frac{n^2}{2}\)了

代码

#include<bits/stdc++.h>
using namespace std;
int n,k;
int main(){
scanf("%d",&n);
k=n/2;
printf("%lld\n",1ll*n*n/2);
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
printf("%d %d %d\n",2*i-1,2*j-1,2*((j+i)%k+1)-1);
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
printf("%d %d %d\n",2*i,2*j,2*((i+j)%k+1));
}

P5562 [Celeste-B]Center of the Earth 题解的更多相关文章

  1. 五、Pandas玩转数据

    Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s ...

  2. [转]DCM Tutorial – An Introduction to Orientation Kinematics

    原地址http://www.starlino.com/dcm_tutorial.html Introduction This article is a continuation of my IMU G ...

  3. 算法教程(3)zz

    First off, we can use our Line-Point Distance code to test for the "BOUNDARY" case. If the ...

  4. TangoAreaDescriptionMetaData区域描述元数据

    TangoAreaDescriptionMetaData com.google.atap.tangoservice Class TangoAreaDescriptionMetaData java.la ...

  5. POJ 3488 &amp; HDU 1915 Arne Saknussemm(模拟)

    题目链接: POJ:http://poj.org/problem? id=3488 HDU:pid=1915">http://acm.hdu.edu.cn/showproblem.ph ...

  6. UVALive 6124 Hexagon Perplexagon 题解

    http://vjudge.net/problem/viewProblem.action?id=37480 East Central Regional Contest Problem C: Hexag ...

  7. LeetCode OJ 题解

    博客搬至blog.csgrandeur.com,cnblogs不再更新. 新的题解会更新在新博客:http://blog.csgrandeur.com/2014/01/15/LeetCode-OJ-S ...

  8. Codeforces Gym 100513D D. Data Center 前缀和 排序

    D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...

  9. 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

随机推荐

  1. vue + element-ui实现简洁的导入导出功能

    1.安装ElementUI模块 cnpm install element-ui -S 2.在main.js中引入 import ElementUI from 'element-ui' import ' ...

  2. iPhoneX适配随笔

    1.安全区域 2.NavigationBar 和 TabBar的xib示意图 两个View要相同的效果,坐标不同 UIButton *btn = [UIButton buttonWithType:UI ...

  3. 07_springmvc校验

    一.概述 项目中,通常使用较多是前端的校验,比如页面中js校验.对于安全要求较高点建议在服务端进行校验. 服务端校验: 控制层conroller:校验页面请求的参数的合法性.在服务端控制层conrol ...

  4. java实现从实体到SQL语句的转换

    使用过Hibernate,EF之类的ORM框架都知道一般的CRUD之类的简单操作,只要调用框架封装好了的方法,框架就自动生成相应的SQL语句了,参照实习公司给的代码,那个是C#版的,今天弄了一下jav ...

  5. C# 把十六进制表示的ASCII码转换为对应的字符组成的字符串

    0x30表示字符‘0’的ASCII码.

  6. Leetcode300. Longest Increasing Subsequence最长上升子序列

    给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说 ...

  7. 原生js封装ajax代码

    方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...

  8. 修改mysql字段类型,修改字段名

    修改字段类型(数据类型,长度,默认值) alter table user modify user_name 类型 修改字段名 方法一:alter table 表 change 旧字段名 新字段名 新数 ...

  9. 【DM8168学习笔记4】ezsdk安装过程记录

    安装文件 ezsdk_dm816x-evm_5_05_02_00_setuplinux DM8168-EZSDK文件结构如图所示.               (图片来自:http://process ...

  10. ajax无刷新上传文件

    网页上传文件最简单的方式就是通过表单上传了,但是在提交表单的时候会导致网页刷新,但有的时候我们不想网页刷新,有什么办法呢,我们可以使用ajax上传文件来做到这一点.只有ajax还不行,还需要JavaS ...