[考试反思]1005csp-s模拟测试60:招魂


最近总是好一场烂一场的。没有连续两场排名波动小于20的。。。
没人管。反正大脸一点脸没有就又AK了。
但是T3爆零这种事情吧。。。
爆搜不是很难打,但是想优化想了半天剩的时间不够结果赶忙打出来了,然后就挂了。
合理安排时间,要把码暴力的时间也考虑到,要检查。
T1T2仍然挂上了对拍,所以没有全盘爆炸。
总体来说是相对简单的一套题。
T1:嘟嘟噜
我的思路不太一样。但是复杂度是相似的。
$O(m+log_{\frac{m}{m-1}}\frac{n}{m})$
因为题面里说开无限栈了,然后我就想到了递归打法。
int winner(int n)函数处理剩下n个人时最终胜者的目前编号。
那么如果剩余人数n>m,那么你就可以把n/m个人同时干掉,从第n/m*m+1个人开始数来计算胜者
如果n<=m的话,那就干掉一个人然后继续递归,和约瑟夫一样。
这样的话每次递归,人数会在$-1$和$\times \frac{m-1}{m}$里选一个来 让它快速减小,可以得到上面的复杂度。
据$o0O$打表证明,使n为1e9,当m取到大约1e6时函数的增长速度达到峰值,再之后的增长速度大约为线性。
而本题数据范围1e5时的函数值仅仅是1e5多一点。
总之O(可过)。
#include<cstdio>
int m,n,t;
int winner(int n){
if(n==)return n;
if(n<m)return (winner(n-)+m-)%n+;
int N=n/m,w=winner(n-N);
if(N*m+w<=n)return N*m+w;
w-=n-N*m;return (w-)/(m-)*m+(w-)%(m-)+;
}
main(){
scanf("%d",&t);
while(t--)scanf("%d%d",&n,&m),printf("%d\n",winner(n));
}
T2:天才绅士少女助手克里斯蒂娜
这道题是放假前让zkq出数据的那道题(这数据不是现成的嘛,还白给他送了个AC)
化式子,拆平方,最后发现要求的就是$\sum\limits_{i=l}^r \sum\limits_{j=l}^r x_i^2 y_j^2 - x_i y_i x_j y_j$
乘法分配律,得到的就是区间$(\sum\limits_{i=l}^{r}x_i^2)\times(\sum\limits_{i=l}^{r}y_i^2) - (\sum\limits_{i=l}^{r}x_iy_i)^2$
线段树或树状数组维护区间$x^2,y^2,xy$的和即可。注意常数。
#include<cstdio>
#define mod 20170927
int cl[],cr[],x2[],y2[],xy[],x[],y[],XY,X2,Y2;
int read(){
register int p=;register char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')p=(p<<)+(p<<)+ch-,ch=getchar();
return p;
}
#define lc p<<1
#define rc p<<1|1
int Mod(int p){return p>=mod?p-mod:p;}
void up(int p){x2[p]=Mod(x2[lc]+x2[rc]);y2[p]=Mod(y2[lc]+y2[rc]);xy[p]=Mod(xy[lc]+xy[rc]);}
void build(int p,int l,int r){
cl[p]=l;cr[p]=r;
if(l==r){long long x=read(),y=read();x2[p]=x*x%mod;y2[p]=y*y%mod;xy[p]=x*y%mod;return;}
build(lc,l,l+r>>);build(rc,(l+r>>)+,r);up(p);
}
void chg(int p,int pos){
if(cl[p]==cr[p]){long long x=read(),y=read();x2[p]=x*x%mod;y2[p]=y*y%mod;xy[p]=x*y%mod;return;}
chg(cr[lc]>=pos?lc:rc,pos);up(p);
}
void ask(int p,int l,int r){
if(l<=cl[p]&&cr[p]<=r){XY=Mod(XY+xy[p]);X2=Mod(X2+x2[p]);Y2=Mod(Y2+y2[p]);return;}
if(l<=cr[lc])ask(lc,l,r);if(r>=cl[rc])ask(rc,l,r);
}
main(){
int n=read(),m=read(),opt,p;
build(,,n);
while(m--){opt=read();p=read();
if(opt==)chg(,p);
else XY=X2=Y2=,ask(,p,read()),printf("%d\n",Mod((1ll*X2*Y2-1ll*XY*XY)%mod+mod));
}
}
T3:凤凰院凶真
没想到。《算法竞赛进阶指南》上的原题竟然也不会做了。
想的是三维,表示a串到了i位,b串到了j位,匹配的最大值是k的最大值。
然而最后一维可以压掉,可以发现最后一维与前两维有关。
我们只要强制b串的第j位必选就行了,这样就能得知最后一个选的是几,即最大值是几。
简单的n3枚举。
#include<cstdio>
int n,m,x[],y[],fr[][],sta[],top;
short dp[][];
void upd(int i,int j,int li,int lj,int w){
if(dp[i][j]>dp[li][lj]+)return;
dp[i][j]=dp[li][lj]+w;
fr[i][j]=lj;
}
void get_back(int i,int j){if(i==||j==)return;
int lj=fr[i][j];
if(j!=lj)sta[++top]=y[j];
get_back(i-,lj);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%d",&x[i]);
scanf("%d",&m);
for(int i=;i<=m;++i)scanf("%d",&y[i]);
for(int i=;i<=n;++i)for(int j=;j<=m;++j)
if(x[i]==y[j]){for(int k=;k<j;++k)if(y[k]<x[i])upd(i,j,i-,k,);}
else upd(i,j,i-,j,);
int M=;for(int i=;i<=m;++i)if(dp[n][i]>dp[n][M])M=i;
printf("%d\n",dp[n][M]);
get_back(n,M);
for(int i=top;i;--i)printf("%d ",sta[i]);puts("");
}
优化,边扫边记录上一层的最优决策。n2。
#include<cstdio>
int n,m,x[],y[],fr[][],sta[],top;
short dp[][];
void upd(int i,int j,int li,int lj,int w){
if(dp[i][j]>dp[li][lj]+)return;
dp[i][j]=dp[li][lj]+w;
fr[i][j]=lj;
}
void get_back(int i,int j){if(i==||j==)return;
int lj=fr[i][j];
if(j!=lj)sta[++top]=y[j];
get_back(i-,lj);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%d",&x[i]);
scanf("%d",&m);
for(int i=;i<=m;++i)scanf("%d",&y[i]);
for(int i=;i<=n;++i){
int bst=,bp=;
for(int j=;j<=m;++j){
if(x[i]==y[j])upd(i,j,i-,bp,);
else upd(i,j,i-,j,);
if(y[j]<x[i]&&dp[i-][j]>bst)bst=dp[i-][j],bp=j;
}
}
int M=;for(int i=;i<=m;++i)if(dp[n][i]>dp[n][M])M=i;
printf("%d\n",dp[n][M]);
get_back(n,M);
for(int i=top;i;--i)printf("%d ",sta[i]);puts("");
}
回溯统计答案没什么好说的。
思路积累:
- 当dp维数过多导致复杂度高时,要考虑每维之间是否有联系,能否用一维表示另外一维。
[考试反思]1005csp-s模拟测试60:招魂的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- csp-s模拟测试60
csp-s模拟测试60 2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...
- [CSP-S模拟测试60]题解
回去要补一下命运石之门了…… A.嘟嘟噜 给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$. 考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了.问题在于如何找到 ...
- csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解
题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0719NOIP模拟测试6 + 0722NOIP模拟测试7
连续爆炸,颇为愉快. 第6次:Rank #4 第7次:Rank #9 对于第6次考试,个人比较满意,因为T1只是差了一个卡常. 因为在考试前两天刚讲了矩阵,满脑子都是矩阵,还想到了循环矩阵优化. 整个 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
随机推荐
- [Tricks] 为文件夹右键菜单增加 【使用VS Code 打开】
传统的IDE安装之后都会在文件夹的右键菜单中增加如[Open in Visual Studio]或者[Open Folder as IntelliJ IDEA Project]这样的选项 但VS Co ...
- Python3 Linux安装(Redhat)
Python3 Linux安装(Redhat): 下载Python-3.6.4.tgz: https://www.python.org/downloads/release/python-364/ Y ...
- MongoDB 学习笔记之 匹配完整数组
匹配完整数组: 创建一个集合(包含数组) db.ArrayTest.insert({name: "Sky" , address: [{"street" : &q ...
- 深入理解SpringCloud之Gateway
虽然在服务网关有了zuul(在这里是zuul1),其本身还是基于servlet实现的,换言之还是同步阻塞方式的实现.就其本身来讲它的最根本弊端也是再此.而非阻塞带来的好处不言而喻,高效利用线程资源进而 ...
- ES6——新增数据结构Set与Map的用法
ES6 提供了新的数据结构 Set以及Map,下面我们来一一讲解. 一.Set 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 1.单一 ...
- javascript进阶-《原型对象和原型链》
原创发布 by @一像素 2015.12 在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象Object 和 函数对象Function. 一般而言,通过new Fun ...
- Java 语言特点
引入<Java核心技术:Ⅰ> 1. 简单性 Java 语法是 C++ 语法的一个“ 纯净” 版本.这里没有头文件. 指针运算(甚至指 针语法).结构. 联合.操作符重载. 虚基类等.如果你 ...
- Mybatis入门简版(补充)
一.Mybatis 中$与#的区别 #相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#, ...
- 客户端 SOCKET 编程
建立客户端的 Socket: 客户端应用程序首先也是调用 WSAStartup() 函数来初始化 Winsock 的动态连接库,然后同样 调用 socket() 来建立一个 TCP 或 UDP Soc ...
- 数据结构5_java---二叉树,树的建立,树的先序、中序、后序遍历(递归和非递归算法),层次遍历(广度优先遍历),深度优先遍历,树的深度(递归算法)
1.二叉树的建立 首先,定义数组存储树的data,然后使用list集合将所有的二叉树结点都包含进去,最后给每个父亲结点赋予左右孩子. 需要注意的是:最后一个父亲结点需要单独处理 public stat ...