rp++==文化课报废

考试经过

先看T1,有被1e12吓到,但根据经验这很可能是水题,经过一番观察后直接打表,似乎看出了规律,觉得应该有了正解,写完之后顺利过掉大样例,但似乎时间稍慢一点,写上快读交了一遍,觉得应该没问题

T2看一眼就是数据结构题,先冲上30分暴力,觉得建3e5个树状数组不太现实,分块又不太会,认为动态开点线段树可做,凭借我80余次万紫千红的经验顺利打完,一遍就过了大样例,觉得稳了,交了

T3毒瘤题面,读题半小时毫无头绪。。。利用特判大法水到8分,由于不知道字典序最小怎么办,又懒得写爆搜,就拿指针乱扫,没过样例,嘎,然后我就没有梦想了,1h毫无进展,最后检查了一遍代码提交

100+70+8=178,T3完全废掉,又水成rank1了

T1.斐波那契

看那个图标出来了每一代都有谁,我们发现好像一代兔子的父亲都是递增的,理所当然的打表,可以发现对于每只兔子x,他的父亲是 $ x-fib_i $ ,fib[i]是不大于x的最大的斐波那契数,只用斐波那契前60项就够,所以我们在60以内就找到了父亲,那么一直跳就行了,这里我们只对编号大的跳父亲,一直递归就能出解。最优复杂度是O60n,我可能稍微慢一点qwq

#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
int a[65];
inline int getf(int x)
{
int i=1;
for(;i<=60;i++)
if(a[i]>=x)return a[i-1];
}
inline int get(int x,int y)
{
if(x==y)return x;
if(x<y)swap(x,y);
x=x-getf(x);
return get(x,y);
}
signed main()
{
// freopen("sb.txt","r",stdin);
// freopen("a.out","w",stdout);
a[0]=0;a[1]=1;a[2]=1;
for(int i=3;i<=63;i++)a[i]=a[i-1]+a[i-2];
int m;m=read();
for(int i=1;i<=m;i++)
{
int x,y;
x=read();y=read();
printf("%lld\n",get(x,y));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

T2.数颜色

对每个颜色动态开店建线段树,单点修改区间查询,oj慢所以开始没A,不用longlong,数组稍微大点

#include <bits/stdc++.h>
using namespace std;
const int N=300050;
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
int ls[80*N],rs[80*N],sum[80*N],num;
int add(int x,int l,int r,int p,int v)
{
if(!x)x=++num;
if(l==r)
{
sum[x]+=v;
return x;
}
int mid=(l+r)>>1;
if(p<=mid)ls[x]=add(ls[x],l,mid,p,v);
if(p>mid)rs[x]=add(rs[x],mid+1,r,p,v);
sum[x]=sum[ls[x]]+sum[rs[x]];
return x;
}
int getsum(int x,int l,int r,int pl,int pr)
{
if(!x)return 0;
if(pl<=l&&pr>=r)return sum[x];
int mid=(l+r)>>1;
if(pr<=mid)return getsum(ls[x],l,mid,pl,pr);
if(pl>mid)return getsum(rs[x],mid+1,r,pl,pr);
return getsum(ls[x],l,mid,pl,pr)+getsum(rs[x],mid+1,r,pl,pr);
}
int mp[N],b[N];
signed main()
{
// freopen("sb.txt","r",stdin);
// freopen("a.out","w",stdout);
int n,m;n=read();m=read();
for(int i=1;i<=n;i++)
{
int c;c=read();
if(!mp[c])mp[c]=++num;
add(mp[c],1,N,i,1);b[i]=c;
}
for(int i=1;i<=m;i++)
{
int op;op=read();
if(op==1)
{
int l,r,c;l=read();r=read();c=read();
printf("%d\n",getsum(mp[c],1,N,l,r));
}
if(op==2)
{
int x;x=read();
add(mp[b[x]],1,N,x,-1);
add(mp[b[x]],1,N,x+1,1);
add(mp[b[x+1]],1,N,x+1,-1);
add(mp[b[x+1]],1,N,x,1);
swap(b[x],b[x+1]);
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

其实还可以排序+二分,懒得写了就挂上战神的博客吧

T3.分组

首先这个题有若干种骗分技巧

解决字典序最小的方法就是从后往前枚举你说你T1T2都出正解了连这都想不到

那么K=1就很简单了,从后往前扫一遍就行,每次判断是否有冲突,有了就累计答案清空数组

判断的时候直接枚举定T飞,注意到131072=512*512,所以每次只要枚举x<=512,x^2-a[i]是否出现即可,40到手

对于K=2,还是从后往前分组,判定的时候相当于判定二分图,O3暴力到80虽然本蒟蒻没学过神马是二分图

正解其实是并查集,类比1e9年前做过的关押罪犯,使用扩展域的并查集判断,每次判断,处理,合并

一旦碰到冲突的就合并,然后判断是不是已经在一个集合内,如果已经重了,有两种情况:如果这个数2倍是完全平方数并且出现恰好2次,前面的数没有和他冲突的,那么没事;否则就要重新分段

这个特判的本质就是在一堆不合法情况里面把合法的排出来,细节有点多

#include <bits/stdc++.h>
using namespace std;
int a[300005];int mem[300005];
stack <int> s;
int ans[300005],num;
inline void add(int x){ans[++num]=x;}
int f[300005];int n,k;
inline int find(int x)
{
if(f[x]!=x)f[x]=find(f[x]);
return f[x];
}
inline void tu(int x,int y)//y合并到x上
{
x=find(x);y=find(y);
f[y]=x;
}
inline void clear()
{
while(!s.empty())
{
if(k==2)f[s.top()]=s.top();
if(k==2)f[s.top()+131072]=s.top()+131072;
mem[s.top()]=0;
s.pop();
}
}
bool gan(int x)
{
for(int j=ceil(sqrt(x));j<=512;j++)
{
if(mem[j*j-x]&&((j*j-x)!=x))return 0;
}
return 1;
}
signed main()
{
// freopen("sb.txt","r",stdin);
cin>>n>>k;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int an=1;
if(k==1)
{
for(int i=n;i>=1;i--)
{
for(int j=ceil(sqrt(a[i]));j<=512;j++)//注意合法,j*j>=a[i]
if(mem[j*j-a[i]])
{
an++;add(i);clear();
break;
}
mem[a[i]]++;s.push(a[i]);
}
}
if(k==2)
{
for(int i=1;i<=300000;i++)f[i]=i;
for(int i=n;i>=1;i--)
{
s.push(a[i]);
for(int j=ceil(sqrt(a[i]));j<=512;j++)
{
int p=j*j-a[i];
if(!mem[p])continue;
tu(p+131072,a[i]),tu(p,a[i]+131072);
if(find(a[i])==find(a[i]+131072))
{
if(a[i]==p&&gan(a[i])&&mem[p]==1)continue;
an++;add(i);clear();break;
}
}
mem[a[i]]++;s.push(a[i]);
}
}
printf("%d\n",an);
for(int i=num;i>=1;i--)printf("%d ",ans[i]);
return 0;
}

清空数组我用的栈,可以省时间,但一定要清干净,也可以用memset,就是慢点,可能会T1个点

考试总结

1.脑子要清晰

2.不能大意,不要以为做出来一两道就行了,发挥出最好水平

noip 模拟9 题解的更多相关文章

  1. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  2. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  3. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  4. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  5. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  6. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  7. 8.3 NOIP 模拟12题解

    话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...

  8. HZOJ 20190819 NOIP模拟26题解

    考试过程: 照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连 ...

  9. [NOIP模拟26]题解

    今天的考试题改自闭了……所以滚来写陈年题解. A.*****贪婪***** RT,出题人告诉我们这题要贪心. 最优的策略一定是拖到必须断的时候再断开(虽然并不知道为什么). 如果一段序列满足题目中的性 ...

  10. [NOIP模拟25]题解

    A.字符串 Catalan数不能再裸了 #include<cstdio> #include<iostream> #include<cstring> using na ...

随机推荐

  1. c盘爆满清理解决方案----Dism

    前言:在以前windons操作系统,很容易导致c盘爆满,原因了就那么几个,升级,app默认安装,打补丁等等.还有种蛇皮现象,就是无缘无故c盘就标红了,进去看看,又个c盘的系统文件,不敢删了,怕系统就崩 ...

  2. mysql 索引介绍与运用

    索引 (1)什么是索引? 是一种提升查询速度的 特殊的存储结构. 它包含了对数据表里的记录的指针,类似于字典的目录. 当我们添加索引时会单独创建一张表来去存储和管理索引,索引比原数据大,会占用更多的资 ...

  3. python django与celery的集成

    一.celery与django 关于celery介绍和使用可以查看上篇Python中任务队列-芹菜celery的使用 关于django的介绍和使用可查看python django框架+vue.js前后 ...

  4. MySQL | Xtrabackup 安装

    rpm方式安装 # xtrabackup 2.4.8 安装包 wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup- ...

  5. Linux | 压缩与解压详解

    tar tar 命令用于对文件进行打包压缩或解压,格式: tar [选项][文件] tar命令的参数及其作用 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 ...

  6. [转载]API网关

    1. 使用API网关统一应用入口 API网关的核心设计理念是使用一个轻量级的消息网关作为所有客户端的应用入口,并且在 API 网关层面上实现通用的非功能性需求.如下图所示:所有的服务通过 API 网关 ...

  7. python numpy 数据集合操作函数

    arrarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr1array([0, 1, 2, 3, 4])np.intersect1d(arr,arr1)#计算数组ARR A ...

  8. final修饰符(3)-基本类型变量和引用类型变量的区别

    final修饰基本类型变量 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变 final修饰引用类型变量 当使用final修饰引用类型变量时,它保存的仅仅是一 ...

  9. Day12 抽象类、接口、内部类-面向对象编程(3)

    抽象类 abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类: 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类. ...

  10. Python+Requests+Xpath(解析)爬取某站点简历图片(数据分析三)

    1.环境安装 pip install lxml 2.解析原理 使用通用爬虫爬取网页数据 实例化etree对象,且将页面数据加载到该对象中 使用xpath函数结合xpath表达式进行标签定位和指定数据提 ...