题目


思路
题意是说将一组数排列成另外一组数,排序的方式是每次取出3个连续的的数字,然后abc可以cab,也就整体右移,超出位置的到最左边。
问能否排列成目标数组。
额,实在是不会做。在网上找到了好几个人的题解,稍加重写并比较性能好了。
好像和树状数组有关。
如代码区所示。


代码
第一种方法,用时0.9s:
by Per Austrin

//Sample solution for the Bread Sorting problem in NCPC 2012 by Per Austrin
//Rewrite by Weiping Huang
//0.9s#include <stdio.h>
#include <algorithm>
using namespace std;int n;
char text[600005];
int A[100005], B[100005], C[100005];void Readin(int * num) {gets(text);int sum = 0, k = 0;for (int i = 0; text[i] != '\0'; i++) {if (text[i] == ' ') {num[k++] = sum;sum = 0;}else {sum = 10 * sum + (text[i] & 15);}}num[k] = sum;//for (int i = 0; i < n; i++) scanf("%d", num + i);
}int inversions(int n, int * N) {if (n < 2) return 0;int m = n / 2;int r = inversions(m, N) + inversions(n - m, N + m);int x = 0, y = m;while (x < m && y < n) {if (N[y] < N[x]) {r += m - x;y++;}else x++;}sort(N, N + n);return r;
}int main() {while (~scanf("%d\n", &n)) {Readin(A);Readin(B);for (int i = 0; i < n; i++) C[B[i]] = i;for (int i = 0; i < n; i++) A[i] = C[A[i]];printf("%sossible\n", inversions(n, A) & 1 ? "Imp" : "P");}return 0;
}

第二种方法,用时0.06s:
By Lukáš Poláček (lukasP)

//Sample solution for the Bread Sorting problem in NCPC 2012 by Lukáš Poláček (lukasP)
//Rewrite by Weiping Huang
//0.06s#include <stdio.h>
#include <string.h>int n;
char text[600005];
bool seen[100005];
int A[100005], B[100005];void ReadinA(int * num) {gets(text);int sum = 0, k = 0;for (int i = 0; text[i] != '\0'; i++) {if (text[i] == ' ') {num[k++] = sum;sum = 0;}else {sum = 10 * sum + (text[i] & 15);}}num[k] = sum;//for (int i = 0; i < n; i++) scanf("%d", num + i);
}void ReadinB(int * num) {gets(text);int sum = 0, k = 0;for (int i = 0; text[i] != '\0'; i++) {if (text[i] == ' ') {num[A[k++] - 1] = sum;sum = 0;}else {sum = 10 * sum + (text[i] & 15);}}num[A[k] - 1] = sum;//for (int i = 0; i < n; i++) scanf("%d", num + i);
}int main() {while (~scanf("%d\n", &n)) {ReadinA(A);ReadinB(B);memset(seen, false, sizeof(bool) * n);int swaps = n;for (int i = 0; i < n; i++) {if (!seen[i]) {swaps--;for (int j = i; !seen[j]; j = B[j] - 1) seen[j] = true;}}printf("%sossible\n", swaps & 1 ? "Imp" : "P");}return 0;
}

第三种方法,用时0.51s:
By Lukáš Poláček (lukasP)

//Sample solution for the Bread Sorting problem in NCPC 2012 by Lukáš Poláček (lukasP)
//Rewrite by Weiping Huang
//0.51s#include <stdio.h>
#include <string.h>
#include <math.h>int n;
char text[600005];
int A[100005], B[100005];struct Buckets {int n, b_size;int s[100005];bool t[100005];void clear(int n) {b_size = int(sqrt((double)n) + 1.1);for (int i = (n + b_size - 1) / b_size - 1; i >= 0; i--) s[i] = 0;for (int i = n - 1; i >= 0; i--) t[i] = false;}void update(int pos) {t[pos] = true;s[pos / b_size]++;}int query(int val) {int b_ind = val / b_size;int res = 0;for (int i = 0; i < b_ind; i++) res += s[i];for (int i = b_ind * b_size; i < val; i++) res += t[i];return res;}
}s, t;void Readin(int * num) {gets(text);int sum = 0, k = 0;for (int i = 0; text[i] != '\0'; i++) {if (text[i] == ' ') {num[k++] = sum - 1;sum = 0;}else {sum = 10 * sum + (text[i] & 15);}}num[k] = sum - 1;//for (int i = 0; i < n; i++) scanf("%d", num + i);
}int main() {while (~scanf("%d\n", &n)) {long long ia = 0, ib = 0;s.clear(n);t.clear(n);memset(A, 0, sizeof(int) * n);memset(B, 0, sizeof(int) * n);Readin(A);for (int i = 0; i < n; i++) {ia += i - s.query(A[i]);s.update(A[i]);}Readin(B);for (int i = 0; i < n; i++) {ib += i - t.query(B[i]);t.update(B[i]);}printf("%sossible\n", ((ia & 1) != (ib & 1)) ? "Imp" : "P");}return 0;
}

第四种方法,用时0.33s:
By Andreas Björklund

//Sample solution for the Bread Sorting problem in NCPC 2012 by Andreas Björklund
//Rewrite by Weiping Huang
//0.33s#include <stdio.h>
#include <string.h>
#include <math.h>int n, tpn;
char text[600005];
int A[1 << 17], B[1 << 17];
int sum1, sum2;int count(int* T, int who)
{int ix = who;int cnt = 0;while (ix <= tpn) {int inc = ix & -ix;cnt ^= (ix <= who) ? T[ix - 1] : 0;T[ix - 1] ^= (ix >= who);ix ^= inc;ix |= (inc << 1);}return cnt & 1;
}void ReadinAndCount() {sum1 = sum2 = 0;gets(text);int sum = 0;for (int i = 0; text[i] != '\0';) {if (text[i] == ' ') {i++;while (text[i] == ' ') i++;sum1 ^= count(A, sum);sum = 0;}else {sum = 10 * sum + (text[i] & 15);i++;}}sum1 ^= count(A, sum);sum = 0;gets(text);for (int i = 0; text[i] != '\0';) {if (text[i] == ' ') {i++;while (text[i] == ' ') i++;sum2 ^= count(B, sum);sum = 0;}else {sum = 10 * sum + (text[i] & 15);i++;}}sum2 ^= count(B, sum);sum = 0;
}int main() {while (~scanf("%d\n", &n)) {tpn = 1;while (tpn < n) tpn <<= 1;for (int i = 0; i < n; i++) A[i] = B[i] = 0;ReadinAndCount();printf("%sossible\n", sum1 != sum2 ? "Imp" : "P");}return 0;
}

Sicily 14514. Bread Sorting相关推荐

  1. BNUOJ-26474 Bread Sorting 逆序对

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26474 题意:给一个数列,可以对三个数操作:把最后一个数放到第一个,前两个数后移一位.问最 ...

  2. NCPC 2012 Problem B Bread Sorting

    题意是给一个数列,可以对三个数操作:把最后一个数放到第一个,前两个数后移一位.问最后能否到达相应的目标序列. 比如 1 2 3 会转换为3 1 2,多了两个逆序对. 给出两列数a和b,问a是否能变成b ...

  3. BNUOJ 26474 Bread Sorting

    1 /*给出n个原始顺序的数,再给出要排成目标状态顺序,每次从第一个数列中选择三个,把这三个数中最右边的数放在最左边,然后其他两个数右 2 移一个单位,为你从原始状态能不能排序成目标状态. 3 本人Y ...

  4. sicily题目分类

    sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...

  5. [sicily]部分题目分类

    sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...

  6. Sicily 题目分类

    依照自己水平挑着做→ →~~ 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 ...

  7. 中大SICILY分类

    原文出处:http://linguifan2010.blog.163.com/blog/static/1315127442010102131322482/ ********************** ...

  8. Soj题目分类 python代码)

    正值期末复习,刷点soj放松下 但想看看能不能在找点关于数据结构的题目来做一下. 在网上看到有不少人上传过那些关于部分SOJ题目的描述,但是说实话有些乱 不过我看到有个网页中包含的一个类似文档的东西, ...

  9. 编程题目分类(剪辑)

    1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代 ...

最新文章

  1. MAS 714课程笔记12: 线性规划
  2. matlab播放 视频帧,如何把连续视频帧转为视频的matlab代码 | 学步园
  3. 【JS第34期】BOM-window对象
  4. 关于直播学习笔记-005-nginx-rtmp-win32在Win10上使用
  5. Object-c 中字符串与数组的处理
  6. 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~二 DBContext实例中,表实体对象是怎么被加入的...
  7. 关于excel密码 工作表密码 工作簿密码 工程密码
  8. Android Dialog Activity
  9. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
  10. python 仪表盘 ppt_python仪表盘
  11. ALSA子系统(十四)------snd_pcm_drain和snd_pcm_drop
  12. termux python turtle_如何在termux上安装Python的turtle库?
  13. ChIPseeker包对ChIP-seq peaks可视化
  14. python图像算法工程师_图像算法工程师的岗位职责
  15. android仿抖音礼物列表实现,Android仿抖音列表效果
  16. leetcode零散题汇总
  17. Kotlin高仿微信-第20篇-个人信息
  18. 【C++】最近公共祖先 LCA
  19. 【Linux】创建、修改和删除用户(useradd | usermod | userdel)
  20. 【Git的学习笔记】老板让我用Git提交,但我还没学过Git

热门文章

  1. AI+医疗:使用神经网络进行医学影像识别分析 ⛵
  2. python怎样使用各个日期赤纬_Python常用的日期时间处理方法示例
  3. kali wmap使用教程
  4. python安装依赖库
  5. 教你如何还原本地IP
  6. soul 网关源码解析
  7. 一维连续型随机变量函数的分布例题(一)
  8. CodeForces - 940E Cashback (DP+思维模型)
  9. 咩小饬的造轮子之路(彩票篇)
  10. AMD GPU 实用工具 rocm-smi 使用方法