A.牛牛的mex

题目传送门

牛牛的mex

题目大意

给你一个长度为n的序列a1~an(0<=ai<n且ai互不相同),有q次询问,每次想询问区间[l,r]中最小的未出现的自然数。

思路

由于每个0~n-1每个数字都只出现了一次,于是我们可以记下每个数字出现的位置,然后每次询问都从小到大进行遍历,如果该数不在询问范围内,那么它就是答案。

AC Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,q,a[N],b[N];
int main()
{scanf("%d%d",&n,&q);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[a[i]]=i;}while(q--){int l,r;int flag=0;scanf("%d%d",&l,&r);for(int i=0;i<n;i++){if(b[i]>r||b[i]<l){flag=1;printf("%d\n",i);break;}}if(flag==0) printf("%d\n",n);}system("pause");return 0;
}

B.牛牛的算术

题目传送门

牛牛的算术

题目大意

题目简洁清晰,截图贴上

思路

推一下式子

我们可以发现当n>=199999时,因为是连乘,所以取模后答案肯定是0,所以只需要考虑n<199999的情况。

然后计算这个式子只需维护两个前缀和即可
1、1+2+3+…+j==j(j+1)/2

2、j * j(j+1)/2

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=199999,N=2e5+10;
LL sum[N],res[N];
char str[N];
int main()
{int T;scanf("%d",&T);getchar();sum[1]=1;for(int i=2;i<=N;i++)sum[i]=(sum[i-1]+i)%mod;LL ans=1;res[1]=1;for(int i=2;i<=mod;i++){res[i]=res[i-1]*(ans+sum[i]*i%mod)%mod*i%mod;ans=(ans+sum[i]*i%mod)%mod;}while(T--){gets(str);int len=strlen(str);if(len>6||(len==6&&str[0]>='2')) printf("0\n");else{int k=0;for(int i=0;i<len;i++)k=k*10+str[i]-'0';if(k==199999) printf("0\n");else printf("%d\n",res[k]);}}system("pause");return 0;
}

C.牛牛的无向图

题目传送门

牛牛的无向图

题目大意

有一张n个点,m条边的无向图,每条边有边权wi。定义一条路径的权值是这条路径上边的最大值。定义d(u,v)是点u到点v的所有路径中权值最小的路径。多次询问,每次给出一个L,问有多少无序点对的d不超过L。

思路

(比赛中没有做出,赛后参照了别人的想法)
由定义,d(u,v)等于最小瓶颈生成树上(我也是第一次接触这个名词,如果你也不知道,可以自行百度一下),u到v路径上权值最大的边。而最小生成树是最小瓶颈生成树。所以问题就转化为:对于每个L,有多少最小生成树上的点对,满足点对路径上权值最大的边的权值不超过L。

由于最小生成树至多n-1条边,权值至多n-1种。因此可以按照树上边权从小到大的顺序维护点对个数的前缀和。这个可以用并查集统计,即在跑Kruskal的时候维护连通块大小,如果要用权值为w的把A,B两个连通块合并,那么A中的每个点和B 中的每个点间路径上权值最大的边的权值恰为w,即w产生的点对个数贡献为A*B。
处理出前缀和,每次进行二分就可以快速找到答案。

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10,M=5e5+10;
unsigned int SA, SB, SC;
int n, m, q, LIM;//n个点,m条边,q个询问
LL L[M];
struct node{LL u,v,w;
}line[M];
LL num[M],ans[N],fa[N];
LL choose[N],th=n,sh=0;
bool cmp(node a,node b)
{return a.w<b.w;
}
LL find(LL x)
{//并查集if(fa[x]==x) return x;else return fa[x]=find(fa[x]);
}
unsigned int rng61(){SA ^= SA << 16;SA ^= SA >> 5;SA ^= SA << 1;unsigned int t = SA;SA = SB;SB = SC;SC ^= t ^ SA;return SC;
}
void gen(){scanf("%d%d%d%u%u%u%d", &n, &m, &q, &SA, &SB, &SC, &LIM);for(int i = 1; i <= m; i++){line[i].u = rng61() % n + 1;line[i].v = rng61() % n + 1;line[i].w = rng61() % LIM;}for(int i = 1; i <= q; i++){L[i] = rng61() % LIM;}
}
LL solve(LL k)
{//二分函数LL l=0,r=sh;while(l<r){LL mid=(l+r+1)/2;if(choose[mid]>k) r=mid-1;else l=mid;}return num[l];
}
int main()
{gen();sort(line+1,line+1+m,cmp);//按边权从小到大排序for(int i=1;i<=n;i++){ans[i]=1;//每个集合的点的数量fa[i]=i;//并查集数组初始化}num[0]=0;th=n,sh=0;for(int i=1;i<=m&&th>1;i++){int du=find(line[i].u),dv=find(line[i].v);if(du==dv) continue;else{th--;sh++;fa[dv]=du;//合并num[sh]=num[sh-1]+1LL*ans[du]*ans[dv];//加上以这条边为路径权值的点集ans[du]+=ans[dv];choose[sh]=line[i].w;}}LL res=0;for(int i=1;i<=q;i++)res^=solve(L[i]);printf("%lld\n",res);system("pause");return 0;
}

牛客练习赛68题解 A-C相关推荐

  1. 牛客练习赛68 B.牛牛的算术

    牛客练习赛68 B.牛牛的算术 题目链接 题目描述 牛牛最近学习了取模是什么 于是他看到了下面这一道题: 多次询问:每次询问包含一个正整数 n 要求你输出下列结果 ∏i=1n∑j=1i∑k=1ji×j ...

  2. 牛客练习赛68 A.牛牛的mex

    牛客练习赛68 A.牛牛的mex 题目链接 题目描述 牛牛现在有一个长度为 nnn 的序列 a1,a2,-,ana_1,a_2,\ldots,a_na1​,a2​,-,an​.现在牛牛有 qqq 次询 ...

  3. 牛客练习赛29 题解

    牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...

  4. 牛客练习赛24题解(搜索,DP)

    A题,C题不讲,基础题(但是我要抨击一下这次比赛,卡cin,cout,卡的太狠了,根本就不让过的那种,QAQ) 链接:https://www.nowcoder.com/acm/contest/157/ ...

  5. 牛客练习赛94F题解

    链接:登录-专业IT笔试面试备考平台_牛客网 令sec(x)表示mex为x的最小区间,假设当前插入到t,只需维护x = 1 ~ t的sec(x)的左右端点位置即可(这里端点位置定义为在当前已经存在的数 ...

  6. 回文数(牛客练习赛71)题解

    题目描述 Froggy 分别给出 10 个数码的出现次数,你需要找到一个由这些数码组成的最小的数,满足: 1. 这个数是回文的. 2. 不能有前导 0. 注:假设这个数字长度是 LL,那么这个数是回文 ...

  7. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 妄想集合(牛客练习赛90)

    妄想集合(牛客练习赛90) 题意: 开始有 n 个可重集合,开始时每一个集合中都有一个数,有 m 个操作. Quant l r x\text{Quant l r x}Quant l r x:往编号在 ...

  9. 牛客练习赛54(A,B,C(ATCG相同的分在一起 暴力加巧妙差分))

    牛客练习赛54 日常刷一套牛客练习赛题 A-乘积 n这么小 暴力即可,不知道unsinged long long 操作,用java大数写了: import java.math.BigInteger; ...

最新文章

  1. [导入]郁闷`````[原]
  2. 《Clojure数据分析秘笈》——2.6节调整词频值的度量
  3. [C#]非阻塞监听键盘输入
  4. 【C++】38.类成员变量声明为 对象与指针的区别
  5. 日志处理两大生态Splunk和ELK深度对比
  6. sqlserver 事务例子
  7. 您的apple id 暂时不符合使用此应用程序_Mac相机不工作时该怎么办
  8. js判断一个字符串 是否存在在另一个字符串
  9. java垃圾回收机制的理解
  10. HDU 折线分割平面
  11. SSM学习系列(五) Spring MVC 几种跳转方式
  12. 计算机图形学E6——倒水问题emm和OpenGL没啥关系
  13. minio 搭建blob
  14. leetcode记录-回文数
  15. 28天打造专业红客(四)
  16. Zint生成多种条码及二维码
  17. labelImg使用教程
  18. 北京市三级医院电话预约挂号一览表
  19. 物联网关键技术————传感器技术
  20. Android好看的动画欢迎界面(附有详细代码)

热门文章

  1. (转)如何将数据上传到onenet服务器(https://blog.csdn.net/qq_29219435/article/details/78471448)
  2. 一个冒号和两个冒号的区别
  3. 秘钥登录ssh改密码登录
  4. Netgear wndr3700v2 路由器刷OpenWrt打造全能服务器(四)花生壳服务
  5. 脚本语言实现自动关闭应用
  6. 为什么说百度价值亟待被重估?
  7. 火车头使用PHP插件过滤emoji四字节字符
  8. iPad,Surface,Ultrabook:我们到了吗?
  9. Android N+ 安装apk
  10. JSONArray解析