第一场多校,出了一题,,没有挂零还算欣慰。

  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 部分题解的更多相关文章

  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 题意:比赛 ...

  2. 2016 Multi-University Training Contest 3 部分题解

    1001,只要枚举区间即可.签到题,要注意的是输入0的话也是“TAT”.不过今天补题的时候却WA了好几次,觉得奇怪.原来出现在判断条件那里,x是一个int64类型的变量,在进行(x<65536* ...

  3. 2016 Multi-University Training Contest 4 部分题解

    1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...

  4. 2016 Multi-University Training Contest 2 部分题解

    1009,直接贪心,只要让后面的尽量小,第一位和第二位尽量大即可. 1011,直接统计奇数的字母的个数,然后用偶数的个数平均分配到它们上面即可.代码如下: #include <stdio.h&g ...

  5. 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 ...

  6. 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 ...

  7. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  8. 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 ...

  9. 2018 Multi-University Training Contest 3(部分题解)

    Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Ja ...

随机推荐

  1. 由[].slice.call()引发的思考

    由[].slice.call()引发的思考   经常看到大家用[].slice.call()或者Array.prototype.slice.call():  我一直是一知半解的,今天算是基本弄清楚了, ...

  2. OpenCV安装和测试

    参考链接:http://blog.csdn.net/bruce_zeng/article/details/7961153 OpenCv下载链接:http://sourceforge.net/proje ...

  3. Oracle 分页语句

    ** 写法1 :采用 ROWNUM的伪列: --查询10到20之间的数据 -- SELECT * FORM ( -- SELECT * , ROWNUM rn FROM TABLE_NAME -- W ...

  4. 2.JVM、JRE、JDK之间的关系

    诠释一. JDK(java development kit) JDK是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库. JRE(java run ...

  5. 安装笔记, caffe 、 opencv等

    1. 1.1 opencv static linux mkdir build & cd build cmake .. -LH  这句话用来查看编译选项  如果不知道编译啥  可以用这个查看一下 ...

  6. Oracle学习笔记:rank、dense_rank、row_number、ntile等排序算法

    在 oracle 中有很多函数可以实现排序的功能,但是不尽相同.下面一一解说. row_number函数 功能:可实现分组排序,为数据行添加序号,多用于分页查询. 语法:row_number() ov ...

  7. php压缩图片

    <?php header('content-type:text/html;charset=utf8'); set_time_limit(0); $imgs=scandir('./Public/u ...

  8. js获取图片内容上传

    <script> $('#pic').change(function(){ var size=document.getElementById('pic').files[0].size va ...

  9. 使用JPA完成增删改查操作

    基础的增删改查操作如下: package cn.itheima.test; import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUt ...

  10. VUE【三、指令】

    模板指令 1.数据渲染(对应data数据) {{a}} 当使用v-once指令时,数据会一次绑定,后续修改值不会变化 v-text="a" 等同于{{a}} v-html=&quo ...