这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀。不过还是没有闫神厉害啊。
题目链接::P

【A】MEX

题意:

Evil博士把Mahmoud和Ehab绑架到了邪恶之地,因为他们在邪恶信息学奥林匹克竞赛(EOI)中取得了优异的成绩。博士想让他们回答一些问题后才放他们走。
Evil博士对集合很感兴趣,他有一个n个非负整数的集合。如果一个集合的MEX正好等于x,那么博士认为这个集合是邪恶的。
一个非负整数集合的MEX就是最小的不属于集合的非负整数。
Evil博士想要让他的集合变得邪恶,他每次可以做一个操作:往集合中添加一个非负整数或删除集合中的某个元素。
他最少做几次操作在能让这个集合变得邪恶呢?

输入:

第一行,两个数\(n,x(1\leq n\leq100,0\leq x\leq100)\)。
第二行,\(n\)个非负整数\(a_{1},a_{2},\cdots,a_{n}\),表示集合中的元素\((0\leq a_{i}\leq100)\)。

输出:

一个数,表示最小操作数。

题解:

添加所有不在集合中的小于\(x\)的非负整数,如果\(x\)在集合中,删除\(x\)。

  1. #include<cstdio>
  2. int n,x,a[],less,ans;
  3. int main(){
  4. scanf("%d%d",&n,&x);
  5. for(int i=;i<=n;++i){
  6. scanf("%d",a+i);
  7. if(a[i]<x) ++less;
  8. if(a[i]==x) ++ans;
  9. }
  10. printf("%d",ans+x-less);
  11. return ;
  12. }

【B】二分图

题意:

Mahmoud和Ehab继续他们的旅程!在邪恶之地,众人皆知,Evil博士很喜欢二分图,特别是树。
Evil博士给定了一棵树,他想在树中加入尽量多条边,使得新图还是二分图。
求出最多添加的边数。

输入:

第一行,一个数\(n(1\leq n\leq10^5)\),表示树的顶点数。
接下来\(n-1\)行,每行两个数\(u_i,v_i(1\leq u_i,v_i\leq n)\),表示\(u_i,v_i\)间有连边。

输出:

一个整数,表示最多添加的边数。

题解:

黑白染色,答案=黑色点*白色点-(n-1)。

  1. #include<cstdio>
  2. int n,h[],nxt[],to[],tot=,vis[],sums[];
  3. inline void ins(int x,int y){nxt[++tot]=h[x];to[tot]=y;h[x]=tot;}
  4. void dfs(int u,int t){
  5. vis[u]=;
  6. ++sums[t];
  7. for(int i=h[u];i;i=nxt[i]){
  8. if(!vis[to[i]]){
  9. dfs(to[i],t^);
  10. }
  11. }
  12. }
  13. int main(){
  14. int x,y;
  15. scanf("%d",&n);
  16. for(int i=;i<n;++i) scanf("%d%d",&x,&y), ins(x,y), ins(y,x);
  17. dfs(,);
  18. printf("%I64d",1ll*sums[]*sums[]-n+);
  19. return ;
  20. }

【C】异或

题意:

Mahmoud和Ehab到达了第三站。你知道,Evil博士喜欢集合,不过这次,Evil博士不会展出任何他的集合,而是让他们创造一个新的集合,丰富自己的集合收藏。
Evil博士有着他喜欢的邪恶数字\(x\),他想让你创造一个包含\(n\)个不同的非负整数集合,使得这其中的数的异或和恰好等于\(x\)。集合中的数不大于\(10^6\)。

输入:

两个数,\(n,x(1\leq n\leq10^5,0\leq x\leq10^5)\)。

输出:

如果能创造这样的集合,先输出YES,然后输出一行\(n\)个互不相同的非负整数,表示集合,这些数不应该超过\(10^6\)。如果不能,输出NO。

题解:

当\(n=1\)时,输出\(x\)即可。
当\(n=2\)时,若\(x=0\),无解;否则输出\(0\;x\)。
当\(n=3\)时,若\(x=0\),输出\(1\;2\;3\);当\(x=1\),输出\(0\;2\;3\);当\(x>1\),输出\(0\;1\;x\oplus1\)。
当\(n>3\)时,先输出前\(n-3\)个非负整数,计算剩余的数,记为\(x_0\)。
接下来当做\(n=3\)的情况,不过输出的数要分别加上\(2^{17},2^{18},2^{17}+2^{18}\)。

  1. #include<cstdio>
  2. int a,b;
  3. int main(){
  4. scanf("%d%d",&a,&b);
  5. if(a==&&b==) {puts("NO"); return ;}
  6. puts("YES");
  7. if(a==) {printf("%d",b); return ;}
  8. if(a==) {printf("0 %d",b); return ;}
  9. if(a==) {if(b==) printf("1 2 3"); else if(b==) printf("0 2 3"); else printf("0 1 %d",b^); return ;}
  10. for(int i=;i<=a-;++i){
  11. printf("%d ",i); b^=i;
  12. }
  13. if(b==) printf("%d %d %d",+((<<)+(<<)),+(<<),+(<<));
  14. else if(b==) printf("%d %d %d",(<<)+(<<),+(<<),+(<<));
  15. else printf("%d %d %d",(<<)+(<<),+(<<),(b^)+(<<));
  16. return ;
  17. }

【D】01字串

交互题不会做XD。

【E】函数

题意:

Evil博士对数学和函数很感兴趣。
他给出了两个数组\(a_{1},\cdots,a_{n}\)和\(b_{1},\cdots,b_{m}(m\geq n)\)。
他又对满足\(0\leq j\leq m-n\)的\(j\)定义\(c_{i}=a_{i}-b_{i+j}\)和函数\(f(j)=|c_{1}-c_{2}+c_{3}-c_{4}\cdots c_{n}|\)。
也就是\(f(j)=|\sum_{i=1}^{n}(-1)^{i-1}*(a_{i}-b_{i+j})|\)。

Evil博士想要Mahmoud和Ehab去计算\(f(j)\)的最小值。他发现这太简单了。
于是他加入了\(q\)个操作,第\(i\)个操作对\(a\)数组中的\([l_i,r_i]\)段加上一个数\(x_i\)。然后再让他们计算这个函数的最小值。

题解:

简化算式:\(f(j)=|\sum_{i=1}^{n}(-1)^{i-1}*a_{i}+\sum_{i=1}^{n}(-1)^{i-1}*b_{i+j}|\)。
记第一个\(\sum\)的结果为\(Sum\)。记第二个\(\sum\)的结果为\(S_{j}\)。那么在操作间,\(Sum\)的值会改变。
改变的数值容易计算,可发现,这样交错相加减的算式,\(Sum\)这样变化:\(Sum \to Sum+x_{i}(r_{i}mod\:2-(l_{i}-1)mod\:2)\)。

而对于\(S_j\)的值,因为被绝对值包着,我们需要让\(S_j\)尽量接近\(-Sum\)。
因为\(b\)数组不会改变,故\(S_j\)也不会改变,将\(S_j\)排序后,二分查找即可。

  1. #include<cstdio>
  2. #include<algorithm>
  3. const int INF=99999999999999999ll;
  4. int n,m,q,mj;
  5. long long a[],b[],c[],sum;
  6. long long Abs(long long x){return x<?-x:x;}
  7. int main(){
  8. scanf("%d%d%d",&n,&m,&q); mj=m-n;
  9. for(int i=,f=;i<=n;++i,f^=) scanf("%I64d",a+i),sum+=f?a[i]:-a[i];
  10. for(int i=;i<=m;++i) scanf("%I64d",b+i);
  11. for(int i=,f=;i<=n;++i,f^=) c[]+=f?b[i]:-b[i];
  12. for(int i=;i<=mj;++i) c[i]=-c[i-]-b[i]+((n&)?-b[i+n]:b[i+n]);
  13. std::sort(c,c+mj+);
  14. int l,r,x,len,mid;
  15. long long ans;
  16. l=, r=mj, ans=INF;
  17. while(l<=r){
  18. mid=(l+r)>>;
  19. if(c[mid]<-sum) l=mid+;
  20. else r=mid-;
  21. if(Abs(c[mid]+sum)<ans) ans=Abs(c[mid]+sum);
  22. }
  23. printf("%I64d\n",ans);
  24. for(int i=;i<=q;++i){
  25. scanf("%d%d%d",&l,&r,&x);
  26. len=r-l+;
  27. if(len&) sum+=(l&)?x:-x;
  28. l=, r=mj, ans=INF;
  29. while(l<=r){
  30. mid=(l+r)>>;
  31. if(c[mid]<-sum) l=mid+;
  32. else r=mid-;
  33. if(Abs(c[mid]+sum)<ans) ans=Abs(c[mid]+sum);
  34. }
  35. printf("%I64d\n",ans);
  36. }
  37. return ;
  38. }

【codeforces】【比赛题解】#862 CF Round #435 (Div.2)的更多相关文章

  1. Codeforces Round #435 (Div. 2)【A、B、C、D】

    //在我对着D题发呆的时候,柴神秒掉了D题并说:这个D感觉比C题简单呀!,,我:[哭.jpg](逃 Codeforces Round #435 (Div. 2) codeforces 862 A. M ...

  2. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  3. CF Round #551 (Div. 2) D

    CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...

  4. CF Round #510 (Div. 2)

    前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...

  5. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

  6. 【Codeforces Round #435 (Div. 2) A B C D】

    CF比赛题目地址:http://codeforces.com/contest/862 A. Mahmoud and Ehab and the MEX ·英文题,述大意:      输入n,x(n,x& ...

  7. Codeforces Round #435 (Div. 2)

    A. Mahmoud and Ehab and the MEX 题目链接:http://codeforces.com/contest/862/problem/A 题目意思:现在一个数列中有n个数,每个 ...

  8. D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)

    http://codeforces.com/contest/862/problem/D 交互题 fflush(stdout) 调试: 先行给出结果,函数代替输入 #include <cstdio ...

  9. E. Mahmoud and Ehab and the function Codeforces Round #435 (Div. 2)

    http://codeforces.com/contest/862/problem/E 二分答案 一个数与数组中的哪个数最接近: 先对数组中的数排序,然后lower_bound #include &l ...

随机推荐

  1. 对\${ctx}的一点理解

    一.\${ctx}与${pageContext.request.contextPath}的区别 相同点: \${ctx}和\${pageContext.request.contextPath}都是获取 ...

  2. BZOJ5092 分割序列(贪心)

    设si为该序列的异或前缀和,则显然相当于求Σmax{sj+sj^si} (i=1~n,j=0~i).从高位到低位考虑,如果该位si为1,无论sj怎么填都是一样的:如果该位si为0,则sj该位应尽量为1 ...

  3. Trailing Zeroes (I) LightOJ - 1028(求因子个数)

    题意: 给出一个N 求N有多少个别的进制的数有后导零 解析: 对于一个别的进制的数要转化为10进制 (我们暂且只分析二进制就好啦) An * 2^(n-1) + An-1 * 2^(n-2) + `` ...

  4. Vue使用SCSS进行模块化开发

    原文地址:http://www.cnblogs.com/JimmyBright/p/7761531.html 个人认为scss最大的好处就是能将css属性设置为变量,这样让css一键更换主题成为可能. ...

  5. BZOJ 3165: [Heoi2013]Segment

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 465  Solved: 187[Submit][Sta ...

  6. Webpack 学习笔记总结

    Webpack安装 Linux系统默认已经安装了node&npm,但版本比较低,而且没法升级,可以重新下载Node然后通过软链接替换系统自带的node和npm; ln -s /path_to/ ...

  7. 【trie树】【P4551】 最长异或路径

    Description 给定 \(n\) 个点的带边权树,求一条异或和最大的简单路径 Input 第一行是点数 \(n\) 下面 \(n - 1\) 行每行三个整数描述这棵树 Output 输出一个数 ...

  8. 用ladon框架封装Python为Webservice接口以及调用接口的方法

    一.用ladon框架封装Python为Webservice接口 功能实现的同时,希望将接口开放给别人,而封装python接口的一个再简单不过的框架Ladon,而且提供不同的协议,包括SOAP和Json ...

  9. 团体程序设计天梯赛 L3-016. 二叉搜索树的结构

    #include <cstdio> #include <cstdlib> #include <string.h> #include <math.h> # ...

  10. golang 解码未知键的 json 字符串

    我们可以使用 interface 接收 json.Unmarshal 的结果,然后利用 type assertion 特性来进行后续操作. package main import ( "en ...