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

  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. Java门面模式(思维导图)

    图1 门面模式[点击查看图片] 1,实体对象类 package com.cnblogs.mufasa.demo1; //3个子系统,解决问题的实体 public class StoreA { //示意 ...

  2. winfrom_关于打印小票

    1.使用的是PrintDocument控件,在工具箱  ,将其托到窗体上: 2. private void btnprint_Click(object sender, EventArgs e) { p ...

  3. Spark RDD学习笔记

    一.学习Spark RDD RDD是Spark中的核心数据模型,一个RDD代表着一个被分区(partition)的只读数据集. RDD的生成只有两种途径: 一种是来自于内存集合或外部存储系统: 另一种 ...

  4. JavaScript Basics_Fundamentals Part 1_Variables

    JavaScript Variables JavaScript 变量(Variables)是用于存储数据值的容器. 创建一个 JavaScript 变量,可以使用关键字 let. Example le ...

  5. 0502 xss 实验

    0x01 dvwa xss(reflected) 1.1 Security Level: low use the typical <script>alert(1)</script&g ...

  6. 7.SpringMVC 配置式开发-ModelAndView和视图解析器

    ModelAndView 1.Model(模型) 1.model的本质就是HashMap,向模型中添加数据,就是往HashMap中去添加数据 2.HashMap 是一个单向查找数组,单向链表数组 3. ...

  7. hadoop中hive常用的交互式操作

    hive的帮助命令: [hadoop@master tmp]$ hive -help usage: hive -d,--define <key=value> Variable substi ...

  8. VUE【一、概述】

    早上写的忘了保存..还有很多唠叨的内容...哎又得重新写一遍..想吐槽那个自动保存有卵用.. 今天周一,早上起来继续 由于周六加了一整天班,导致周日无心学习,一天都在玩游戏看电影,到了晚上反而更加空虚 ...

  9. TensorFlow中numpy与tensor数据相互转化

    numpy与tensor数据相互转化: *Numpy2Tensor 虽然TensorFlow网络在输入Numpy数据时会自动转换为Tensor来处理,但是我们自己也可以去显式的转换: data_ten ...

  10. 一图一知-NPM&YARN常用命令