2016 Multi-University Training Contest 1 部分题解
第一场多校,出了一题,,没有挂零还算欣慰。
1001,求最小生成树和,确定了最小生成树后任意两点间的距离的最小数学期望。当时就有点矛盾,为什么是求最小的数学期望以及为什么题目给了每条边都不相等的条件。看了题解以后才明白:“首先注意到任意两条边的边权是不一样的,由此得知最小生成树是唯一的,最小生成树既然 是唯一的,那么期望其实也就是唯一的,不存在什么最小期望。”那么第一问最小生成树只要克鲁斯卡尔算法即可,第二问,总的路的条数是n*(n-1)/2,然后确定所有路的权值和的方法是:枚举每一条边,这一条边出现的次数是,它左右的点数之积。
1002,博弈论,用状态压缩预处理出一行的状态,然后各行的sg值异或一下即可。代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <map>
using namespace std;
typedef long long ll;
const int N = + ; int sg[<<],s[N]; void init()
{
for(int i=;i<(<<);i++)
{
int last = -;
memset(s,-,sizeof(s));
// 从右边为正
for(int j=;j<;j++)
{
if(!((i>>j) & )) // 找到第一个是0的位置(空位)
{
last = j;
}
if((i>>j) & ) // 再找到过去第一个不是空位的地方
{
if(last != -)
{
s[sg[i^(<<last)^(<<j)]] = ;
}
}
} int pos = ;
while(s[pos] != -) pos++;
sg[i] = pos;
}
} int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
int ans = ;
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int temp = ;
int m;
scanf("%d",&m);
for(int j=;j<=m;j++)
{
int t;
scanf("%d",&t);
temp ^= <<(-t); // 假设是正数过去的19,那么是1<<1,即右数过来的第二位
}
ans ^= sg[temp];
}
puts(ans?"YES":"NO");
}
}
1004,线段树,询问指定区间内的gcd以及整个1~n区间内,gcd等于这个gcd的区间的个数。即使看了题解也很懵逼,网上找了一份貌似是rmq的代码,很巧妙,具体见代码和注释吧:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <map>
using namespace std;
typedef long long ll;
const int N = + ; int T,n,m,a[N];
int mp[N][];
map<int,ll> M; int gcd(int a,int b) {return a%b?gcd(b,a%b):b;} void init()
{
M.clear();
int m = log(n)/log();
// mp的含义是从第i个数开始,长度为(1<<j)(包含自身),这个区间内数的gcd
// 以i开头的区间每次多加一个数字如果让gcd发生变小,gcd的值都至少除以2(最小因子为2)
for(int i=;i<=n;i++) mp[i][] = a[i];
for(int i=;i<=m;i++)
{
// 因为mp的值是根据后面的值来更新的,所以j从大到小
for(int j=n;j>=;j--)
{
if(j+(<<(i-)) <= n) mp[j][i] = gcd(mp[j][i-],mp[j+(<<(i-))][i-]);
else mp[j][i] = mp[j][i-];
}
}
} // 用于查询l~r区间内的gcd
int query(int l,int r)
{
int m = log(r-l+)/log();
return gcd(mp[l][m],mp[r-(<<m)+][m]);
} int main()
{
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",a+i);
init(); // 因为temp的变化是log级别的,所以总的复杂度是n(log(n))^2
for(int i=;i<=n;i++)
{
int temp = a[i]; // temp表示从i开始的这个区间,不断变化着的那个gcd的值
int l = i, r = n, mid, o = l;
while(temp > ) // temp = 1的话后面的gcd就一直是1了
{
r = n, o = l; // o是指新区间的起始点
int ans = -;
// 二分是为了找到gcd为temp的最长区间
while(l <= r)
{
mid = l + r >> ;
if(query(i,mid) < temp) r = mid - ;
else
{
l = mid + ;
ans = mid; // 这里为什么一定要用ans记录而不能直接使用mid
// 可以那样例的1 2 4 6 7举例子
// i=2时,l和r都是5时,ans还是4,mid是5
// 那么,temp=2区间应该是2-4而不是2-5的
// 原因在于如果i~mid的区间的gcd比temp小的话,ans是不能更新的,而mid仍会更新
}
}
M[temp] += ans - o + ; l = ans + ; // l移动到下一个位置,来找下一个temp的区间
if(l > n) break;
temp = query(i,l);
}
// 要加这个条件是因为可能是 l > n 才break出来的
if(temp == ) M[] += n - l + ;
} printf("Case #%d:\n",kase);
scanf("%d",&m);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
int x = query(l,r);
printf("%d %I64d\n",x,M[x]);
}
}
}
1011,纯几何题,直接丢个觉得写得不错的博客:http://blog.csdn.net/libin66/article/details/51957808。
另外,丢个觉得不错的资料:点我。其实空间四面体的内切球圆心求法和平面三角形内切圆圆心的求法很像,可以通过类比推出来,把边换成平面就行。
2016 Multi-University Training Contest 1 部分题解的更多相关文章
- 2016 Al-Baath University Training Camp Contest-1
2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...
- 2016 Multi-University Training Contest 3 部分题解
1001,只要枚举区间即可.签到题,要注意的是输入0的话也是“TAT”.不过今天补题的时候却WA了好几次,觉得奇怪.原来出现在判断条件那里,x是一个int64类型的变量,在进行(x<65536* ...
- 2016 Multi-University Training Contest 4 部分题解
1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...
- 2016 Multi-University Training Contest 2 部分题解
1009,直接贪心,只要让后面的尽量小,第一位和第二位尽量大即可. 1011,直接统计奇数的字母的个数,然后用偶数的个数平均分配到它们上面即可.代码如下: #include <stdio.h&g ...
- 2016 Al-Baath University Training Camp Contest-1 E
Description ACM-SCPC-2017 is approaching every university is trying to do its best in order to be th ...
- 2016 Al-Baath University Training Camp Contest-1 F
Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...
- 2016 Al-Baath University Training Camp Contest-1 A
Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...
- 2016 Al-Baath University Training Camp Contest-1 I. March Rain —— 二分
题目链接:http://codeforces.com/problemset/gymProblem/101028/I I. March Rain time limit per test 2 second ...
- 2018 Multi-University Training Contest 3(部分题解)
Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Ja ...
随机推荐
- Machine概念和获取帮助 【翻译】
Machine概念和获取帮助 Docker Machine 允许您在各种环境中预配 Docker 计算机,包括驻留在本地系统.云提供商或裸机服务器(物理计算机)上的虚拟机.Docker Machine ...
- MyBatis 源码篇-整体架构
MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...
- 排查RabbitMQ安装错误
1.注册表中是否有 HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv\1.1\RabbitMQ 此项.(须有) 2.安装目录是否存在中文.(不可有 ...
- 设置centos7中的mysql5.7不区分表名大小写有关操作
1.#which mysqld //查看mysql的命令路径 /usr/sbin/mysqld 2.#/usr/sbin/mysqld --verbose --help | grep ...
- 【原创】大叔问题定位分享(36)openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil
openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil This function returns nil if the request ...
- 如何使用Chrome开发者工具找到Marketing Cloud某个contact的guid
我们使用nodejs对contact进行修改时,需要指定待修改contact实例的guid. 这个guid属于technical属性,在Marketing Cloud UI上默认情况下不可见.如何找到 ...
- 【Distributed】CDN
一.概述 1.1 Web前端优化 1.2 DNS域名解析过程 1.3 传统方式请求静态资源 二.CDN内容分发 2.1 什么是CDN 2.2 CDN内容分发原理 2.3 阿里云环境实战搭建CDN内容分 ...
- MYSQL 遇见各种有意思题库
1 使用sql查询每个学生a_id最常借图书类型u_id.表名:t1 (学生图书借阅) [问题分析,1 先选出每个学生,每个类型所借数量] SELECT a_id,u_id,count(u_id) a ...
- DATASNAP双缓存下载文件
原文链接:http://www.cnblogs.com/hnxxcxg/archive/2012/12/29/2839358.html procedure TFrmMain.btnUpdateFile ...
- Linux的基础使用命令
ifconfig #查看ip地址 或者使用 ip a pwd #查看当前工作路径 man pwd #查看命令的详细信息 按q退出 mkdir /data 创建data目录 ...