A.

找规律题。儿子的编号减去 小于它编号的最大的fibonacci数 即可得到它父亲的编号。

然后两个节点都暴力上跳就好了。预处理一下fibonacci数,每次二分查找即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int m;
ll fib[];
void pre()
{
fib[]=fib[]=;
for(int i=;i<=;i++)
fib[i]=fib[i-]+fib[i-];
}
int pos(ll x)
{
return lower_bound(fib+,fib+,x)-fib;
}
int main()
{
pre();
scanf("%d",&m);
for(int i=;i<=m;i++)
{
ll a,b;
scanf("%lld%lld",&a,&b);
while(a!=b)
{
if(a>b)a-=fib[pos(a)-];
else b-=fib[pos(b)-];
}
cout<<a<<endl;
}
return ;
}

B.

专治学树锯结垢学傻的我,对每个颜色开一个vector存放出现位置,询问时在相应颜色的vector中二分查找大于等于l与大于r的两个位置,作差即可得到中间有几个位置。

至于修改,如果x与x+1位置的颜色相同就什么都不管,因为换了之后对vector内部没有影响。

如果颜色不同,直接在内部修改坐标信息,然后把颜色和在各自颜色中的相对位置互换。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=;
int n,m,a[N],rk[N];
vector<int> col[N];
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x*f;
}
void work()
{
int op=read();
if(op==)
{
int l=read(),r=read(),c=read();
int posl=lower_bound(col[c].begin(),col[c].end(),l)-col[c].begin(),
posr=upper_bound(col[c].begin(),col[c].end(),r)-col[c].begin();
int res=posr-posl;
printf("%d\n",res);
}
else
{
int x=read();
if(a[x]==a[x+])return ;
col[a[x]][rk[x]]=x+;
col[a[x+]][rk[x+]]=x;
swap(rk[x],rk[x+]);
swap(a[x],a[x+]);
}
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
{
a[i]=read();
col[a[i]].push_back(i);
rk[i]=col[a[i]].size()-;
}
while(m--)work();
return ;
}

C.

对于$K=1$的情况,直接贪心从右往左扫,让断点尽量靠前。由于$\max a[i]$为131072,所以两种颜色之和最大为$262144=512^2$。

那么我们只需要记录一下目前在组里出现过的数,判断是否要断就直接从512开始枚举j,看$j*j-a[i]$是否在组里就行了。切断后记得清空之前出现的数,循环到上个断点即可。

$K=2$呢?也是一个道理。像关押罪犯那道题一样利用扩展域并查集维护敌对关系,即一个集合和一个敌对集合。判断到冲突时,看两个数在不在同一集合。在的话被迫断开,不在就维护敌对关系,即将对方的敌对域与自己的己域合并。

但是对于$2*a[i]=x^2$的情况,我们需要进行特判。如果这样的$a[i]$目前只出现了两次,且组里没有它的其它敌对元素,就可以先不设置断点。否则立刻断开清空。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=;
int n,K,a[N],app[N<<];
int st[N];
void work1()
{
for(int i=n;i>=;i--)
{
bool div=;
for(int j=;j>=&&j*j>a[i];j--)
if(app[j*j-a[i]])
{
div=;break;
}
if(div)
{
st[++st[]]=i;
for(int j=i+;j<=(st[]==?n:st[st[]-]);j++)
app[a[j]]=;
//continue;
}
app[a[i]]++;
}
if(!st[])
{
puts("");
printf("\n");
return ;
}
printf("%d\n",st[]+);
while(st[])
printf("%d ",st[st[]]),st[]--;
}
int fa[N],rev[N];
int findf(int x)
{
if(fa[x]==x)return x;
return fa[x]=findf(fa[x]);
}
void work2()
{
int top=;
for(int i=;i<=N-;i++)
fa[i]=i;
st[]=n;
for(int i=n;i>=;i--)
{
for(int j=;j>=&&j*j>a[i];j--)
{
int ene=j*j-a[i];//puts("YOUSA");
if(app[j*j-a[i]]==top)
{
if(a[i]==ene)
{
if(rev[a[i]])
{
for(int k=i;k<=st[top-];k++)
fa[a[k]]=a[k],rev[a[k]]=;
st[top++]=i;
break;
}
else rev[a[i]]=ene;
}
else
{
if(findf(a[i])==findf(ene)||rev[ene]==ene)
{
for(int k=i;k<=st[top-];k++)
fa[a[k]]=a[k],rev[a[k]]=;
st[top++]=i;
break;
}
if(rev[a[i]])
{
int fx=findf(rev[a[i]]),fy=findf(ene);
fa[fx]=fy;
}
else rev[a[i]]=ene;
if(rev[ene])
{
int fx=findf(a[i]),fy=findf(rev[ene]);
fa[fx]=fy;
}
else rev[ene]=a[i];
}
}
}
app[a[i]]=top;
}
printf("%d\n",top);
for(int i=top-;i>=;i--)
printf("%d ",st[i]);
printf("\n");
return ;
}
int main()
{
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
if(K==)work1();
else work2();
return ;
}

[NOIP模拟测试12]题解的更多相关文章

  1. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  4. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  5. [NOIP模拟测试38]题解

    来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...

  6. 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」

    164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...

  7. NOIP模拟测试12

    T1 斐波那契 一道找规律题,被我做成了贼难的题. 观察图片可知x=f[i-1]+j.(j为x的父亲)且j<=f[i-1],然后就二分找父亲没了. #include<bits/stdc++ ...

  8. [NOIP模拟测试31]题解

    A.math 考场乱搞拿了95,2333. 考虑裴蜀定理:$ax+by=z$存在整数解,当且仅当$gcd(a,b)|z$. 那么如果某个数能够被拼出来,就必须满足所有$a_i$的$gcd$是它的因子. ...

  9. [NOIP模拟测试30]题解

    A.Return 出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面.可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清.(鬼知道"那么输出-1&q ...

随机推荐

  1. LCD驱动程序架构和分析

    一.LCD驱动程序架构 1.裸机驱动代码分析 ①LCD初始化:控制器初始化,端口初始化,指明帧缓冲 ②LCD图形显示:将图形数据写入帧缓冲 void lcd_init() { lcd_port_ini ...

  2. echarts(4.0版本)

    1.echarts 开发文档 :https://echarts.baidu.com/echarts2/doc/doc.html  或  https://echarts.baidu.com/option ...

  3. JS基础入门篇(三十六)—面向对象( 三 )

    1.class class es6 中 为 关键字用来声明 一个 类 1.只能通过new调用 2.不存在变量提升 3.多个方法之间直接书写,不需要,隔开 4.类的方法是直接定义在类的原型上的 5.定义 ...

  4. UML的类型

    分类 UML从考虑系统的不同角度出发,定义了用例图.类图.对象图.包图.状态图.活动图.序列图.协作图.构件图.部署图等10种图. 常见的UML图有用例图(Use Case Diagram).类图(C ...

  5. QMUI android 框架 git下载项目运行报错解决 input String“”

    1.编译源码,input String“” 解决办法: 打开qmuidemo里面的gradle文件,注释掉顶部的 //def cmd = 'git rev-list HEAD --count'//de ...

  6. 6. 使用cadvisor监控docker容器

    Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行.这里我们可以服务端和客户端都使用cadvisor 客户端 1.下 ...

  7. 2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)

    原题:https://ac.nowcoder.com/acm/contest/889/D 题意: 给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个) 思路: 直接搜 ...

  8. 力扣算法——137SingleNumberII【M】

    Given a non-empty array of integers, every element appears three times except for one, which appears ...

  9. 比较全面的CSS hack方式一览

    转载请注明来自CSDN freshlover的博客专栏<史上最全CSS Hack方式一览>   做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某 ...

  10. shell-#!

    当shell执行一个程序时,会要求UNIX内核启动一个新的进程,以便在该进程里执行所指定的程序. 当系统只有一个shell时,退回到/bin/sh 的机制非常方便,但现行的UNIX系统都会拥有好几个s ...