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

  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. HTTP协议探究(三):HTTPS

    一 复习与目标 1 复习 代理:转发通信数据(一般协议不变,作为中间人,可对报文进行过滤修改) 网关:转发通信数据(协议改变,作为资源拥有者) 隧道:转发通信数据(协议不变,作为管道,不对报文进行过滤 ...

  2. Js 判断数组中是否包含某个值

    includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. JavaScript Array includes() 方法

  3. 1、windows安装npm教程 --参考自https://www.cnblogs.com/jianguo221/p/11487532.html

    windows安装npm教程   1.在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm:  nodejs 下的包管理器. webpack: 它主要用途是通过CommonJS 的语法把所有 ...

  4. JS数组去掉重复元素

    JS数组去掉重复元素,这里提供3中写法. var arr =[1,2,3,4,5,6,3,4,7,2,4,1,8]; 输出:[1,2,3,4,5,6,7,8]; 1.使用indexOf() arr.i ...

  5. SpringMVC【二、项目搭建】

    HelloWorld搭建 1.用Maven WebApp框架创建一个项目 红框中的是后添加的 2.添加pom引用(此处因为要引用多个spring包,建议把版本号提出来放到Properties) 会导入 ...

  6. C#编程 LINQ查询

    LINQ查询表达式 约束 LINQ查询表达式必须以from子句开头,以select或group子句结束 关键字 from...in...:指定要查找的数据以及范围变量,多个from子句则表示从多个数据 ...

  7. HLS manifest standard 翻译: HTTP Live Streaming draft-pantos-http-live-streaming-23

    我为什么要干这种事 Introduction to HTTP Live Streaming 1 OVerview Multimedia presentation : specified by a Un ...

  8. nginx+tomcat实现负载均衡以及双机热备

    还记得那些年吗? 还记得更新代码之后,服务器起不来被领导训斥吗?还记得更新代码,需要停机过多的时间被渠道部们埋怨吗?还记得更新代码,代码出错时自己吓个半死吗?于是我们聪明勤快的程序员,看着电影待到夜深 ...

  9. java—锁的学习研究

    摘抄自博客:https://www.cnblogs.com/qifengshi/p/6831055.html 标题:Java中的锁分类 锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/ ...

  10. Mysql的mysqldump详解

    一.导出 1.1 导出表结构及数据 mysqldump -uroot -p --set-gtid-purged=OFF database table1 table2 > mysqldump.sq ...