10.31-11.1Test

题目 描述 做法
\(BSOJ5177\) 求在\(n\)个数里选\(K\)个的所有方案的异或和之和 按位讨论,组合数算
\(BSOJ5178\) 化简\(\displaystyle{f_i=\max_{0\le j<i\vee c_j\mid (i-j)}\{f_j+\frac{c_j}{i-j}\times v_j\}}\) 用单调栈实现斜率优化
\(BSOJ5121\) 同6318 同6318
\(BSOJ5180\) 询问一个矩形元素和/最大值/最小值 二维\(RMQ\)变形,八矩形拼凑
\(BSOJ5181\) 给出\(n\)条形如\(x\)在\(y\)左边信息,求方案数 树形\(DP\)
\(BSOJ5182\) 可以\(BAN\)一些区域,增加一个位置人数,动态询问所有人到\(x\)距离和最小的\(x\) 树状数组维护带权中位数,线段树线段覆盖

\(\text{Day1}\)

\(T1\)

校庆志愿者小Z在休息时间和同学们玩卡牌游戏。一共有n张卡牌,每张卡牌上有一个数Ai,每次可以从中选出k张卡牌。一种选取方案的幸运值为这k张卡牌上数的异或和。小Z想知道所有选取方案的幸运值之和除以998244353的余数。

考虑异或只与每一位上的结果有关

若第\(k\)位上有\(cnt\)个\(1\)

则贡献为\(\displaystyle{2^k\sum_{i=K+cnt-n}^{cnt}\begin{pmatrix}cnt\\i\end{pmatrix}\begin{pmatrix}n-cnt\\K-i\end{pmatrix}}\)

\(T2\)

城市中有一条长度为n的道路,每隔1的长度有一个公交车站,编号从0到n,学校在0号车站的位置。其中每个公交车站(除了n号车站)有两个属性ci和vi,代表从这个公交车站出发的公交车的性质。ci代表这个从i出发的公交车,相邻两个停靠站之间的距离。vi表示每坐1站的花费。

注意,一辆公交车出发后会向n号车站的方向行进。同时,一名乘客只能从起点站上车,但可以从任意停靠站下车。校庆志愿者小Z为了帮助校友查询有关城市交通费用的问题,想知道从0号车站(也就是学校)出发,到达每个公交车站的最小花费,于是他找到了你。

考虑斜率优化

\(T3\)

同6318

\(\text{Day2}\)

\(T1\)

为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出。

  这个方阵是一个nm的矩形,第i行第j列有一名学生,他有一个能力值Ai,j。

  校长会定期检查一个p
q的方阵,询问这个方阵的学生能力值之和,或是学生能力值的最大值,或是学生能力值的最小值。由于校长不喜欢一个方阵长宽之比差太多,他每次询问的方阵的长不会超过宽的两倍。作为校庆筹办组组长的你,应该迅速并准确的回答校长所问的问题。

普通二维\(RMQ\)

  1. inline int Query_max(re int x1,re int y1,re int x2,re int y2){
  2. re int lenx=log[x2-x1+1],leny=log[y2-y1+1];
  3. return max(mx[x1][y1][lenx][leny],max(mx[x2-(1<<lenx)+1][y1][lenx][leny],max(mx[x1][y2-(1<<leny)+1][lenx][leny],mx[x2-(1<<lenx)+1][y2-(1<<leny)+1][lenx][leny])));
  4. }
  5. inline int Query_min(re int x1,re int y1,re int x2,re int y2){
  6. re int lenx=log[x2-x1+1],leny=log[y2-y1+1];
  7. return min(mi[x1][y1][lenx][leny],min(mi[x2-(1<<lenx)+1][y1][lenx][leny],min(mi[x1][y2-(1<<leny)+1][lenx][leny],mi[x2-(1<<lenx)+1][y2-(1<<leny)+1][lenx][leny])));
  8. }
  9. inline void Read(void){
  10. re int i,j,x,y;
  11. read(n);read(m);
  12. *log=-1;for(i=1;i<=max(n,m);++i)log[i]=log[i>>1]+1;
  13. memset(mx,-INF,sizeof mx);
  14. memset(mi,INF,sizeof mi);
  15. for(i=1;i<=n;++i)
  16. for(j=1;j<=m;++j){read(x);mx[i][j][0][0]=mi[i][j][0][0]=x;sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+x;}
  17. for(i=1;i<=log[n];++i)
  18. for(x=1;x+(1<<i)-1<=n;++x)
  19. for(y=1;y<=m;++y){
  20. mx[x][y][i][0]=max(mx[x][y][i-1][0],mx[x+(1<<(i-1))][y][i-1][0]);
  21. mi[x][y][i][0]=min(mi[x][y][i-1][0],mi[x+(1<<(i-1))][y][i-1][0]);
  22. }
  23. for(i=1;i<=log[m];++i)
  24. for(x=1;x<=n;++x)
  25. for(y=1;y+(1<<i)-1<=m;++y){
  26. mx[x][y][0][i]=max(mx[x][y][0][i-1],mx[x][y+(1<<(i-1))][0][i-1]);
  27. mi[x][y][0][i]=min(mi[x][y][0][i-1],mi[x][y+(1<<(i-1))][0][i-1]);
  28. }
  29. for(i=1;i<=log[n];++i)
  30. for(j=1;j<=log[m];++j)
  31. for(x=1;x+(1<<i)-1<=n;++x)
  32. for(y=1;y+(1<<j)-1<=m;++y){
  33. mx[x][y][i][j]=max(mx[x][y][i][j],max(mx[x][y][i-1][j-1],mx[x+(1<<(i-1))][y][i-1][j-1]));
  34. mx[x][y][i][j]=max(mx[x][y][i][j],max(mx[x][y+(1<<(j-1))][i-1][j-1],mx[x+(1<<(i-1))][y+(1<<(j-1))][i-1][j-1]));
  35. mi[x][y][i][j]=min(mi[x][y][i][j],min(mi[x][y][i-1][j-1],mi[x+(1<<(i-1))][y][i-1][j-1]));
  36. mi[x][y][i][j]=min(mi[x][y][i][j],min(mi[x][y+(1<<(j-1))][i-1][j-1],mi[x+(1<<(i-1))][y+(1<<(j-1))][i-1][j-1]));
  37. }
  38. }

注意到条件方阵的长不会超过宽的两倍

因此我们并不需要保存任意长宽比的矩形,而是可以把长拆成两半

\(\color{blue}{\text{Code}}\)

\(T2\)

经过一天的忙碌,志愿者们结束了他们的工作,准备站在一排合影留念。

  现在总共有n名志愿者留下来准备合影。不过,进程并不是那么顺利,有些同学提出了一些奇奇怪怪的要求(每个人最多只会提出一个):他必须站在另外一个同学的左边(不一定相邻)。这时,其中一位来自11班的同学小Z陷入了沉思:总共有多少种不同的合法方案数呢?(两种方案不同当且仅存在至少一名同学他在这两个方案当中站的位置不同。)小Z很快就算出来了,于是就把自己的这个问题告诉了好朋友小C。不过,由于小C的数学功底不足,小Z只要求他算出这个答案模质数p的余数就可以了。可就算这样,小C也不会做。为了显示自己的水平很高(实际上很低),他找到了你,并把你得出的答案报给小Z,所以你可一定要算对啊!

对条件\((x,y)\),连边\(y\rightarrow x\)表示\(y\)限制\(x\)

首先可以证明如果没有环,这就是一个森林

因此我们拿\(0\)向根连边

\(DP\)转移类似数列归并

\(\displaystyle{f_x=\sum_{y\in son_x}f_y\begin{pmatrix}size_x'\\size_y\end{pmatrix}}\)

其中\(size_x'\)表示\(x\)在归并\(y\)之前的子树大小

\(T3\)

校庆筹备组的老师们正在寻找合适的地方来举办校庆庆典。

  学生们的位置和可以举办庆典的位置在x轴的正半轴取值在[1,n]的整数位置上。

  老师们选择的地点是会根据参加典礼的学生位置来决定的,具体来说:定义一个位置的距离和为该位置到所有参加学生的距离之和。如果一个位置的距离和最小,且它比所有和它距离和相等的位置的位置更靠左,则老师们会选择这个位置。

  开始时,所有的位置都可以举办庆典。但很可惜的是,并不是所有的位置都能举办庆典,有些奇怪的事件会使[L,R]这段区间不能举办庆典,不过有时也会使[L,R]可以重新举办庆典(并不保证[L,R]之前的每个位置都不能举办庆典)。

  有时一些学生会因为某些原因不能参加庆典,有时一些学生会主动报名参加庆典。

  作为一名合格的老师,你需要求出每个事件发生后庆典应该选择的位置,如果没有合法位置,请输出-1。

\(Step~1\)

首先我们表示出选\(x\)的代价

\(\displaystyle{w_x=\sum_{i=1}^n \mid i-x\mid a_i}\)

\(\displaystyle{=\sum_{i=1}^{x-1} (x-i)a_i+\sum_{i=x+1}^{n} (i-x)a_i}\)

  1. inline void Add(re int x,re ll v){
  2. re int i;
  3. for(i=x;i<=n;i+=lowbit(i)){c1[i]+=v;c2[i]+=v*x;}
  4. }
  5. inline ll Ask(re ll sum[],re int x){re ll res=0;while(x){res+=sum[x];x-=lowbit(x);}return res;}
  6. inline ll Calc(re int x){if(abs(x)==INF)return 0x3f3f3f3f3f3f3f3fll;return 1ll*x*(2*Ask(c1,x)-Ask(c1,n))+(Ask(c2,n)-2*Ask(c2,x));}

然后很轻易的可以得到\(x\)取带权中位数(可以为区间)最优

因此我们可以用树状数组+二分\(O(log^2_2n)\)求出这个中位数

\(\color{red}{Trick}\):

考虑二分求前缀和的过程实际上有必要每次\(O(log_2n)\)重跳吗

不,考虑二分的过程实际上是对值域的划分

如果在一个位置我们向后跳\(2^k\)个位置,后面就不会再跳了

  1. inline int Getkth(re ll k){
  2. re int i,x=0;
  3. for(i=lg;~i;--i)if(c1[x|(1<<i)]<k&&((x|(1<<i))<=n)){x|=(1<<i);k-=c1[x];}
  4. return x+1;
  5. }

\(Step~2\)

这部分区域可能被\(\text{BAN}\)掉,可以简单得到备选点只可能位离中位数(区间)最近的点

用线段树来做到这一点

  1. inline void pushdown(re int x,re int l,re int r){
  2. if(!lz[x])return ;
  3. if(lz[x]&1){lz[ls(x)]=lz[rs(x)]=cs[ls(x)]=cs[rs(x)]=1;l0[ls(x)]=l;r0[ls(x)]=(l+r)>>1;l0[rs(x)]=((l+r)>>1)+1;r0[rs(x)]=r;}
  4. else{lz[ls(x)]=lz[rs(x)]=cs[ls(x)]=cs[rs(x)]=2;l0[ls(x)]=l0[rs(x)]=INF;r0[ls(x)]=r0[rs(x)]=-INF;}
  5. lz[x]=0;
  6. }
  7. inline void pushup(re int x){
  8. cs[x]=cs[ls(x)]&cs[rs(x)];
  9. l0[x]=min(l0[ls(x)],l0[rs(x)]);
  10. r0[x]=max(r0[ls(x)],r0[rs(x)]);
  11. }
  12. inline void Query(re int pos,re int l,re int r,re int&ql,re int&qr,re int x){
  13. re int mid=(l+r)>>1;
  14. if(l==r){if(cs[pos]&1)ql=qr=l;return ;}
  15. pushdown(pos,l,r);
  16. if(x<=mid){Query(ls(pos),l,mid,ql,qr,x);qr=min(qr,l0[rs(pos)]);}
  17. else {Query(rs(pos),mid+1,r,ql,qr,x);ql=max(ql,r0[ls(pos)]);}
  18. pushup(pos);
  19. }
  20. inline void Change(re int pos,re int l,re int r,re int ql,re int qr,re int v){
  21. re int mid=(l+r)>>1;
  22. if(cs[pos]==v+1)return ;
  23. if(l>=ql&&r<=qr){
  24. lz[pos]=cs[pos]=v+1;//纯
  25. if(v){l0[pos]=INF;r0[pos]=-INF;}
  26. else {l0[pos]=l;r0[pos]=r;}
  27. return ;
  28. }
  29. pushdown(pos,l,r);
  30. if(ql<=mid)Change(ls(pos),l,mid,ql,qr,v);
  31. if(qr>mid)Change(rs(pos),mid+1,r,ql,qr,v);
  32. pushup(pos);
  33. }

\(\color{blue}{\text{Code}}\)

10.31-11.1Test(未完)的更多相关文章

  1. 17.10.31&11.01

    10.31模拟考试 Prob.1(AC)裸的矩阵幂 Prob.2(WA)(类似括号匹配求合法方案数) 卡特兰数的一个模型运用.可以推出一个式子(推导方法一个erge讲的,一个骚猪讲的) Prob.3( ...

  2. 《C程序设计的抽象思维》2.10编程练习(未完)

    本文地址:http://www.cnblogs.com/archimedes/p/programming-abstractions-in-c-2.html,转载请注明源地址. 2.按照规定求圆柱的表面 ...

  3. 小白的python之路10/31&11/1文件操作系统

    文件操作系统的介绍 ext4的superblock块是超级快,innode 块是专门存放文件信息的, block count将硬盘做成block块,对操作系统而言写在block块上就可了,eg:文件1 ...

  4. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  5. CocoStuff—基于Deeplab训练数据的标定工具【一、翻译】(未完)

    一.CocoStuff简介 CocoStuff是一款为deeplab设计的,运行在Matlab中的语义标定工具,其标定结果和结合Deeplab训练出的结果均为mat文件格式,该项目源码已在github ...

  6. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  7. [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續)

    [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續) a10036it 发表于 2015-7-27 21:11:19 https://www.itsk.com/t ...

  8. jQuery 学习笔记(未完待续)

    一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById()函数        2.使 ...

  9. 2017-2-17,c#基础,输入输出,定义变量,变量赋值,int.Parse的基础理解,在本的初学者也能看懂(未完待续)

    计算机是死板的固定的,人是活跃的开放的,初学c#第一天给我的感觉就是:用人活跃开放式的思维去与呆萌的计算机沟通,摸清脾气,有利于双方深入合作,这也是今晚的教训,细心,仔细,大胆 c#基础 1.Hell ...

随机推荐

  1. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

  2. 利用MySQL存储过程批量插入100W条测试数据

    DROP PROCEDURE IF EXISTS insert_batch; CREATE PROCEDURE insert_batch() BEGIN ; loopname:LOOP '); ; T ...

  3. Window中C++进行精确计时的方法

    嗯,程序员一个永恒的追求就是性能吧? 为了衡量性能,自然需要计时. 奈何无论C标准库还是C++标准库,因为通用性的考虑,其time API精度都不高.基本都是毫秒级的. 所以如果要真正精确地衡量程序的 ...

  4. 阿里云主机centos7系统创建SWAP区,并启动挂载(适合无SWAP区虚拟化平台)

    以root用户登录建立交换区文件: fallocate -l 2G /swapfile /swapfile //赋予仅root用户的权限,确保安全 mkswap /swapfile swapon /s ...

  5. sso cas 坑

    一个中文文档地址: http://www.cassso-china.cn/apereo_github_cas_5.2/apereo.github.io/cas/5.2.x/ ============= ...

  6. IQueryable,IEnumerable,IList区别

    IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution)IQueryable和IEnumerable ...

  7. c#利用定时器自动备份数据库(mysql)

    1:引用dll MySql.Data.dll,   MySqlbackup.dll 2:建一个数据连接静态类 public static class mysql{public static strin ...

  8. EFCore自动迁移

    2019/05/14,EFCore 2.2.4 有两种方式: 使用Migrate()方法 if (DbContext.Database.GetPendingMigrations().Any()) { ...

  9. Matlab状态模式

    状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据https://blog.csdn.net/lm324114/article/details/78819602 ...

  10. PYTHON 文件读写、坐标寻址、查找替换

    读文件 打开文件(文件需要存在) #打开文件 f = open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() ...