洛谷 mNOIP 模拟赛 Day 1

t1
P3938 斐波那契
题目背景

大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg

题目描述

小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。

小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代。如果某两对兔子是同时出生的,那么小 C 会将父母标号更小的一对优先标 号。

如果我们把这种关系用图画下来,前六个月大概就是这样的:

其中,一个箭头 A → B 表示 A 是 B 的祖先,相同的颜色表示同一个月出生的兔子。

为了更细致地了解兔子们是如何繁衍的,小 C 找来了一些兔子,并且向你提出了 m 个 问题:她想知道关于每两对兔子 a_ia
i
​ 和 b_ib
i
​ ,他们的最近公共祖先是谁。你能帮帮小 C 吗?

一对兔子的祖先是这对兔子以及他们父母(如果有的话)的祖先,而最近公共祖先是指 两对兔子所共有的祖先中,离他们的距离之和最近的一对兔子。比如,5 和 7 的最近公共祖 先是 2,1 和 2 的最近公共祖先是 1,6 和 6 的最近公共祖先是 6。

输入输出格式

输入格式:
从标准输入读入数据。 输入第一行,包含一个正整数 m。 输入接下来 m 行,每行包含 2 个正整数,表示 a_ia
i
​ 和 b_ib
i
​ 。

输出格式:
输出到标准输出中。 输入一共 m 行,每行一个正整数,依次表示你对问题的答案。

输入输出样例

输入样例#1: 复制
5
1 1
2 3
5 7
7 13
4 12
输出样例#1: 复制
1
1
2
2
4
说明

【数据范围与约定】 子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。 每个测试点的数据规模及特点如下表:

特殊性质 1:保证 a_ia
i
​ , b_ib
i
​ 均为某一个月出生的兔子中标号最大的一对兔子。例如,对 于前六个月,标号最大的兔子分别是 1, 2, 3, 5, 8, 13。

特殊性质 2:保证 |a_i-b_i|\le 1∣a
i
​ −b
i
​ ∣≤1。
每一次多出f(i-2)个兔子
兔子的编号就是 爸爸的编号+f[i-2];
爸爸的编号就是 兔子的编号-f[i-2];
然后一个个跳

#include<cstdio>
#include<iostream>
#define ll long long
ll f[60],x,y;int m;
int main(){
    f[0]=f[1]=1;
    for(int i=2;f[i-1]<=1e12;i++) f[i]=f[i-2]+f[i-1];
    scanf("%d",&m);
    while(m--){
        scanf("%lld%lld",&x,&y);
        while(x!=y){
            if(x<y) std::swap(x,y); 
            x=x-f[std::lower_bound(f+0,f+60,x)-f-1];
        }
        printf("%lld\n",x);
    } 
}

t2
3939 数颜色

题目背景

大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg

题目描述

小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有 相同的颜色。小 C 把她标号从 1 到 nn 的 nn 只兔子排成长长的一排,来给他们喂胡萝卜吃。 排列完成后,第 ii 只兔子的颜色是 a_ia
i
​ 。

俗话说得好,“萝卜青菜,各有所爱”。小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而 绿色的兔子却喜欢吃酸一点的胡萝卜……为了满足兔子们的要求,小 C 十分苦恼。所以,为 了使得胡萝卜喂得更加准确,小 C 想知道在区间 [l_j,r_j][l
j
​ ,r
j
​ ] 里有多少只颜色为 c_jc
j
​ 的兔子。

不过,因为小 C 的兔子们都十分地活跃,它们不是很愿意待在一个固定的位置;与此同 时,小 C 也在根据她知道的信息来给兔子们调整位置。所以,有时编号为 x_jx
j
​ 和 x_j+1x
j
​ +1 的两 只兔子会交换位置。 小 C 被这一系列麻烦事给难住了。你能帮帮她吗?

输入输出格式

输入格式:
从标准输入中读入数据。 输入第 1 行两个正整数 nn,mm。

输入第 2 行 nn 个正整数,第 ii 个数表示第 ii 只兔子的颜色 a_ia
i
​ 。

输入接下来 mm 行,每行为以下两种中的一种:

“1\ l_j\ r_j\ c_j1 l
j
​ r
j
​ c
j
​ ” :询问在区间 [l_j,r_j][l
j
​ ,r
j
​ ] 里有多少只颜色为 c_jc
j
​ 的兔子;

“2\ x_j2 x
j
​ ”: x_jx
j
​ 和 x_j+1x
j
​ +1 两只兔子交换了位置。
输出格式:
输出到标准输出中。

对于每个 1 操作,输出一行一个正整数,表示你对于这个询问的答案。

输入输出样例

输入样例#1: 复制
6 5
1 2 3 2 3 3
1 1 3 2
1 4 6 3
2 3
1 1 3 2
1 4 6 3
输出样例#1: 复制
1
2
2
3
说明

【样例 1 说明】

前两个 1 操作和后两个 1 操作对应相同;在第三次的 2 操作后,3 号兔子和 4 号兔子

交换了位置,序列变为 1 2 2 3 3 3。

【数据范围与约定】

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。 对于所有测试点,有 1 \le l_j < r_j \le n,1 \le x_j < n1≤l
j

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> 
#define ll long long
std::vector <int> col[310000];
int n,m,opt,l,r,a[310000],c;

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),col[a[i]].push_back(i);
    while(m--){
        scanf("%d%d",&opt,&l);
        if(opt==1)
            {
                scanf("%d%d",&r,&c);
                int t1=lower_bound(col[c].begin(),col[c].end(),l)-col[c].begin();
                int t2=upper_bound(col[c].begin(),col[c].end(),r)-col[c].begin();

                printf("%d\n",t2-t1);
            }
        else {
            int t1=lower_bound(col[a[l]].begin(),col[a[l]].end(),l)-col[a[l]].begin();
            int t2=lower_bound(col[a[l+1]].begin(),col[a[l+1]].end(),l+1)-col[a[l+1]].begin();
            if(a[l]!=a[l+1]){
                col[a[l]][t1]=l+1;
                col[a[l+1]][t2]=l;
                std::swap(a[l],a[l+1]);
            }

        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值