题解 CF1408F 【Two Different】
难写的做法
一开始
不难发现,我们可以做以下两种操作:
1、花费
2、花费
那我们只需要合并到最后只有两个集合即可。
考虑二进制合并,然后剩下
然后利用最大的集合,把其它集合一一合并起来,这样就只剩两个集合了。
实际测试中对于
code 见我的提交
好写的做法
还有一种做法,先求出
code :
#include <bits/stdc++.h>
using namespace std;
template <typename T> void read(T &x){
static char ch; x = 0,ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0',ch = getchar();
}
inline void write(int x){if (x > 9) write(x/10); putchar(x%10+'0'); }
int ansx[500005],ansy[500005],lans;
inline void print(){
write(lans),putchar('\n');
for (int i = 1; i <= lans; ++i) write(ansx[i]),putchar(' '),write(ansy[i]),putchar('\n');
exit(0);
}
inline void add(int x,int y){ ++lans; ansx[lans] = x; ansy[lans] = y; }
inline void solve(int l,int r){
if (l == r) return; if (l+1 == r){ add(l,r); return; }
int mid = l+r>>1,i,j; solve(l,mid),solve(mid+1,r);
for (i = l,j = mid+1; i <= mid; ++i,++j) add(i,j);
}
int main(){ int n,m; read(n),m = 1; while (m<<1 < n) m <<= 1; solve(1,m),solve(n-m+1,n),print(); return 0; }