Preface

多校第二场,依靠罚时优势打到了校内的Rank 2

暴力分块碾标算系列


T4 Game

题目大意:在一个数集\([1,n]\)中两个人轮流选择其中的一个数,并从数集中删去这个数所有约数。先将所有数删去的人获胜。

比赛的时候手玩了\(n<=5\)的情况发现TM的怎么总是先手赢啊,然后就认为这是个先手必胜的游戏然而真的是这样

赛后听法老讲了真正的做法,分假定情况讨论:

  • 假设这个状态先手必胜,那就让先手胜。
  • 假设这个状态后手必胜,那么先手把\(1\)取走之后相当与把这个必败态扔给了后手(因为\(1\)对后面的选取没有任何影响)

故先手必胜,CODE

  1. #include<cstdio>
  2. using namespace std;
  3. int n;
  4. int main()
  5. {
  6. while (scanf("%d",&n)!=EOF) puts("Yes");
  7. return 0;
  8. }

T10 Swaps and Inversions

题目大意:给出一个数列,你可以花费\(x\)的代价交换两个数。在交换结束之后,还要花费\(y*逆序对个数\)的代价。问最小的代价。

这个一个结论:交换次数等于逆序对个数,因此树状数组逆序对之后乘上\(\min(x,y)\)即可。

CODE

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=100005;
  7. int a[N],bit[N],b[N],n,m,x,y;
  8. long long ans;
  9. inline int find(int x)
  10. {
  11. int l=1,r=m,mid;
  12. while (l<=r)
  13. {
  14. mid=l+r>>1; if (b[mid]==x) return mid;
  15. if (b[mid]<x) l=mid+1; else r=mid-1;
  16. }
  17. }
  18. inline int lowbit(int x)
  19. {
  20. return x&-x;
  21. }
  22. inline int get(int x)
  23. {
  24. int res=0; for (;x<=m;x+=lowbit(x)) res+=bit[x]; return res;
  25. }
  26. inline void add(int x)
  27. {
  28. for (;x;x-=lowbit(x)) ++bit[x];
  29. }
  30. int main()
  31. {
  32. register int i;
  33. while (scanf("%d%d%d",&n,&x,&y)!=EOF)
  34. {
  35. for (i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
  36. memset(bit,0,sizeof(bit));
  37. sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1;
  38. for (ans=0,i=1;i<=n;++i)
  39. {
  40. a[i]=find(a[i]); ans+=get(a[i]+1); add(a[i]);
  41. }
  42. printf("%lld\n",ans*(x<y?x:y));
  43. }
  44. return 0;
  45. }

T7 Naive Operations

题目大意:这题不用翻译也能看懂吧,毕竟都是常见套路。给你两个数组\(a,b\),初始时\(a\)的所有元素都为\(0\)。然后定义两种操作:

  • \(add\ l\ r\):将\(a_i,i\in[l,r]\)都加一
  • \(query\ l\ r\):询问\(\sum_{i=l}^r \lfloor \frac{a_i}{b_i}\rfloor\)

官方给出的解法是搞两棵线段树,然后一波操作反正我不会

比赛的时候YY了一个延时修改的分块,2000+ms卡过。

首先我们记录一个块内的答案,然后考虑什么时候这个值才会被修改。

当然是有个数\(i\)(或多个)的值被累加到多出一个\(b_i\)来了。

有了这个思想,我们再维护一下每一块内最少还要整块累加多少次就会使答案发生改变,记作\(v_i\)。

然后修改的时候两端还是暴力改,整块的话也弄一个标记。

然后核心的来了,我们修改的时候不更新整块标记,而是查询的时候

查询还是先暴力计算两端,然后对于被查询的块,看一下整块的累加是否已经超过\(v_i\),是的话再更新。

一般情况下速度良好,大致\(O(n\sqrt n\cdot k)\),\(k\)为常数,大致在\([In^2\ n,In\ n]\)吧,其实主要还是和\(b_i\)的关系比较大。

块乐的CODE

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<cmath>
  5. #include<cstring>
  6. using namespace std;
  7. typedef long long LL;
  8. const int N=100005,BLO=320;
  9. int n,m,a[N],b[N],l,r,blk[N],v[BLO],t[BLO],size;
  10. LL sum[BLO]; string s;
  11. inline int min(int a,int b)
  12. {
  13. return a<b?a:b;
  14. }
  15. inline void reset(int id)
  16. {
  17. register int i; v[id]=1e9;
  18. for (i=(id-1)*size+1;i<=id*size;++i)
  19. {
  20. sum[id]-=a[i]/b[i]; a[i]+=t[id];
  21. sum[id]+=a[i]/b[i]; v[id]=min(v[id],b[i]-a[i]%b[i]);
  22. } t[id]=0;
  23. }
  24. inline void modify(int l,int r)
  25. {
  26. register int i;
  27. for (i=l;i<=min(blk[l]*size,r);++i)
  28. {
  29. if (!(++a[i]%b[i])) ++sum[blk[l]]; v[blk[l]]=min(v[blk[l]],b[i]-a[i]%b[i]);
  30. }
  31. if (blk[l]!=blk[r]) for (i=(blk[r]-1)*size+1;i<=r;++i)
  32. {
  33. if (!(++a[i]%b[i])) ++sum[blk[r]]; v[blk[r]]=min(v[blk[r]],b[i]-a[i]%b[i]);
  34. }
  35. for (i=blk[l]+1;i<=blk[r]-1;++i) ++t[i];
  36. }
  37. inline LL query(int l,int r)
  38. {
  39. register int i; LL tot=0;
  40. for (i=l;i<=min(blk[l]*size,r);++i)
  41. tot+=(a[i]+t[blk[l]])/b[i];
  42. if (blk[l]!=blk[r]) for (i=(blk[r]-1)*size+1;i<=r;++i) tot+=(a[i]+t[blk[r]])/b[i];
  43. for (i=blk[l]+1;i<=blk[r]-1;++i)
  44. {
  45. if (t[i]>=v[i]) reset(i); tot+=sum[i];
  46. }
  47. return tot;
  48. }
  49. int main()
  50. {
  51. //freopen("7.in","r",stdin); freopen("7.out","w",stdout);
  52. ios::sync_with_stdio(false); register int i;
  53. while (cin>>n>>m)
  54. {
  55. memset(a,0,sizeof(a)); memset(v,63,sizeof(v));
  56. memset(t,0,sizeof(t)); memset(sum,0,sizeof(sum));
  57. for (size=sqrt(n),i=1;i<=n;++i)
  58. cin>>b[i],blk[i]=(i-1)/size+1,v[blk[i]]=min(v[blk[i]],b[i]);
  59. while (m--)
  60. {
  61. cin>>s; cin>>l>>r;
  62. if (s[0]=='a') modify(l,r); else cout<<query(l,r)<<endl;
  63. }
  64. }
  65. return 0;
  66. }

Postscript

主要是其他队伍要么没写出T7要么想线段树花了一段时间。

不过还是很高兴的,出题人用心出题目,用脚造数据

2018 Multi-University Training Contest 2 部分简单题解析的更多相关文章

  1. 2018 Multi-University Training Contest 1 部分简单题解析

    Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...

  2. 2018 Nowcoder Multi-University Training Contest 2

    目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...

  3. 2018 Nowcoder Multi-University Training Contest 1

    Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...

  4. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  5. 2018 Nowcoder Multi-University Training Contest 10

    Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...

  6. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  7. 2018 Multi-University Training Contest 2

    题目链接:2018 Multi-University Training Contest 2 6318 Swaps and Inversions 题意:sum=x*逆序个数+交换次数*y,使sum最小 ...

  8. 2018 Multi-University Training Contest 1

    比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...

  9. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

随机推荐

  1. 我的第一个个人博客网站 -> wizzie.top

    从去年下半年实习结束,到找到第一个属于自己的工作,我就开始着手搭建自己的网站. 使用阿里云学生服务器,域名,备案解析后,开始设计网站结构和页面布局. 因为临近毕业,网站真的是写的页面怎么多怎么写,所以 ...

  2. zookeeper.Net

    原文转至:http://www.cnblogs.com/shanyou/p/3221990.html 之前整理过一篇文章<zookeeper 分布式锁服务>,本文介绍的 Zookeeper ...

  3. Appium初识

    一. Appium工作原理 基本工作流程如下: Appium提供了一套web服务,Appium起一个Server(4723端口),用于与脚本client通信. server接收web driver(即 ...

  4. python第六十五天--python操作mysql

    pymysql模块对mysql进行 import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='ro ...

  5. UEditor单个图片上传遇到的问题记录

    查看了ueditor.all.js得源代码发现单图片上传是在选择文件输入框change事件执行表单Submit,但是出现一个问题请求头没有加入Cookie,导致后端身份认证失败,上传最终失败. ued ...

  6. MailKit帮助类

    public class EmailHelp { /// <summary> /// Smtp服务器地址 /// </summary> private static reado ...

  7. MySQL 8.0 —— CATS事务调度算法的性能提升

    原文地址:https://mysqlserverteam.com/contention-aware-transaction-scheduling-arriving-in-innodb-to-boost ...

  8. PHP 服务器及TP5框架遇到的几个错误

    一.Call to undefined function imagecreatefrompng(): LAMP环境搭建的博客,在提交内容的时候TP5框架报了一个错误,Call to undefined ...

  9. Hbase-2.0.0_02_常用操作

    主要是常用的hbase shell命令,包括表的创建与删除,表数据的增删查[hbase没有修改]:以及hbase的导出与导入. 参考教程:HBase教程 参考博客:hbase shell基础和常用命令 ...

  10. 【转】vue项目打包部署——nginx代理访问

    我又来了,今天部署了下vue项目,使用nginx做了代理,这样可以解决跨域的问题,这里做一个简单讲解. 1.先看vue项目打包(我这里使用的是vscode开发工具) 这里是我的项目结构: 打包之前需要 ...