题目链接:点击查看

题目大意:初始时给出一个长度为 n 的序列,每个位置 a[ i ] = i ,再给出一个映射 f( x , y ) = z,现在规定每次操作可以使得:

  1. t = f( a[ i ] , a[ j ] )
  2. a[ i ] = t
  3. a[ j ] = t

对于完全相同的 x 和 y,得到的 f( x , y ) 是相同的

现在需要给出一种操作顺序,使得无论映射 f 如何定义,最后都能使得整个序列最多有两种不同的元素

题目分析:自己手玩一下不难发现,如果 n 是 2 的幂次的话,总是有办法可以将其变为同一种元素的,以 n = 8 为例:

  1. 1 2 3 4 5 6 7 8
  2. 9 9 10 10 11 11 12 12
  3. 13 13 13 13 14 14 14 14
  4. 15 15 15 15 15 15 15 15

这样可以类比于 st 表的思想,找出最大的小于等于 n 的 2 的幂次记为 k,对于区间 ( 1 , 1 + k - 1 ) 和 ( n - k + 1 , n ) 进行上述操作,就可以保证所有的 n 个元素都能被覆盖到,且最后最多有两种不同的元素了

因为对应的过程比较麻烦,写分治的话相对比较简单一些,时间复杂度是 nlogn 级别的,换句话说最后的答案也是 nlogn 级别的

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;vector<pair<int,int>>ans;void dfs(int l,int r)
{if(l==r)return;int mid=l+r>>1;dfs(l,mid);dfs(mid+1,r);for(int i=l,j=mid+1;i<=mid;i++,j++)ans.emplace_back(i,j);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);int p=1;while(p*2<=n)p*=2;dfs(1,1+p-1);if(n!=p)dfs(n-p+1,n);printf("%d\n",ans.size());for(auto t:ans)printf("%d %d\n",t.first,t.second);return 0;
}

CodeForces - 1408F Two Different(构造+分治)相关推荐

  1. codeforces 293E Close Vertices 点分治+滑窗+treap

    http://codeforces.com/contest/293/problem/E 题意:求树上合法点对的个数.合法条件为:路径长度<=W,路径边数<=L. 显然是点分治.求解的时候第 ...

  2. Codeforces 448C Painting Fence:分治

    题目链接:http://codeforces.com/problemset/problem/448/C 题意: 有n个木板竖着插成一排栅栏,第i块木板高度为a[i]. 你现在要将栅栏上所有地方刷上油漆 ...

  3. CodeForces - 287C Lucky Permutation(构造)

    题目链接:点击查看 题目大意:构造一个合法的排列,满足 ppi=n−i+1p_{p_{i}}=n-i+1ppi​​=n−i+1 题目分析:因为第四个样例的存在降低了本题的难度,不然感觉还是有点难度的一 ...

  4. CodeForces - 468C Hack it!(构造+数位dp)

    题目链接:点击查看 题目大意:求出一段区间 [l,r][l,r][l,r] 的数位和对 aaa 取模后为 000.更具体的,设 f(x)f(x)f(x) 为 xxx 的数位和,本题需要求出一对 [l, ...

  5. CodeForces - 1561E Bottom-Tier Reversals(构造)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的排列,每次操作可以选择一个奇数长度的前缀然后反转,需要构造一种方案,使得在不超过 5n2\frac{5n}{2}25n​ 次操作后使得序列有序 ...

  6. CodeForces - 1494E A-Z Graph(构造+思维)

    题目链接:https://vjudge.net/problem/CodeForces-1494E 题目大意:给出一个初始时只有 nnn 个点的有向带权图,需要执行 mmm 次操作,每次操作分为下列三种 ...

  7. CodeForces - 1494D Dogeforces(贪心+构造)

    题目链接:点击查看 题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值 ...

  8. Sereja and Brackets CodeForces - 380C (线段树+分治思路)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  9. Codeforces 833D Red-Black Cobweb [点分治]

    洛谷 Codeforces 思路 看到树上路径的统计,容易想到点分治. 虽然只有一个限制,但这个限制比较麻烦,我们把它拆成两个. 设黑边有\(a\)条,白边有\(b\)条,那么有 \[ 2a\geq ...

最新文章

  1. Verilog中for 语句怎么用
  2. 菜鸟发现--网站的皮肤 ^_^
  3. 关于事件相关电位P300应用于视频游戏的研究
  4. setting an array element with a sequence
  5. #4604. The kth maximum number(整体二分 + 树套树)
  6. 0918类对象重载,作业3
  7. 【c语言】 gets()函数不执行/被跳过
  8. mysql集群环境搭建
  9. JS实现单源点最短路径、动态规划分段图算法
  10. java 获取当前文件的路径+文件全名
  11. Matlab遗传算法工具箱的使用
  12. Spring-boot-2.1.X源码编译
  13. 手机屏幕镜像翻转软件_iPhone拍出来的视频倒过来了怎么办?这个系统自带工具全搞定,它还有更多神奇绝技!...
  14. 日志级别的选择:Debug、Info、Warn、Error还是Fatal
  15. emule服务器无响应是什么原因,为什么,一直无响应,求大神帮忙
  16. C++之定义动态二维数组
  17. 图片上的遮挡物怎么去除?
  18. 荒野白茶特点及口感如何
  19. 游戏一旦开始,结局就不是你能控制的!
  20. 江苏科技大学苏州理工学院《计算机程序设计基础实践VC++》实验报告

热门文章

  1. 深度之眼 | 《如何高效度论文》笔记
  2. 压缩图片_Word快速压缩图片大小
  3. 加减法叫做什么运算_小学四则运算基础知识,赶快给孩子存下吧!
  4. oracle语句优化pl sql语句,求oracle插入初始数据pl/sql语句优化,该怎么处理(2)
  5. Atomic Integer 原理分析-get方法
  6. 高仿真 JDK Proxy手写实现
  7. https安全传输协议
  8. ActiveMQ跟SpringBoot整合的双向队列
  9. 动态代理的概述和实现
  10. 编码引出的问题_FileReader读取GBK格式的文件