Sicily 14514. Bread Sorting
题目
思路
题意是说将一组数排列成另外一组数,排序的方式是每次取出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相关推荐
- BNUOJ-26474 Bread Sorting 逆序对
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26474 题意:给一个数列,可以对三个数操作:把最后一个数放到第一个,前两个数后移一位.问最 ...
- NCPC 2012 Problem B Bread Sorting
题意是给一个数列,可以对三个数操作:把最后一个数放到第一个,前两个数后移一位.问最后能否到达相应的目标序列. 比如 1 2 3 会转换为3 1 2,多了两个逆序对. 给出两列数a和b,问a是否能变成b ...
- BNUOJ 26474 Bread Sorting
1 /*给出n个原始顺序的数,再给出要排成目标状态顺序,每次从第一个数列中选择三个,把这三个数中最右边的数放在最左边,然后其他两个数右 2 移一个单位,为你从原始状态能不能排序成目标状态. 3 本人Y ...
- sicily题目分类
sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...
- [sicily]部分题目分类
sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...
- Sicily 题目分类
依照自己水平挑着做→ →~~ 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 ...
- 中大SICILY分类
原文出处:http://linguifan2010.blog.163.com/blog/static/1315127442010102131322482/ ********************** ...
- Soj题目分类 python代码)
正值期末复习,刷点soj放松下 但想看看能不能在找点关于数据结构的题目来做一下. 在网上看到有不少人上传过那些关于部分SOJ题目的描述,但是说实话有些乱 不过我看到有个网页中包含的一个类似文档的东西, ...
- 编程题目分类(剪辑)
1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代 ...
最新文章
- MAS 714课程笔记12: 线性规划
- matlab播放 视频帧,如何把连续视频帧转为视频的matlab代码 | 学步园
- 【JS第34期】BOM-window对象
- 关于直播学习笔记-005-nginx-rtmp-win32在Win10上使用
- Object-c 中字符串与数组的处理
- 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~二 DBContext实例中,表实体对象是怎么被加入的...
- 关于excel密码 工作表密码 工作簿密码 工程密码
- Android Dialog Activity
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
- python 仪表盘 ppt_python仪表盘
- ALSA子系统(十四)------snd_pcm_drain和snd_pcm_drop
- termux python turtle_如何在termux上安装Python的turtle库?
- ChIPseeker包对ChIP-seq peaks可视化
- python图像算法工程师_图像算法工程师的岗位职责
- android仿抖音礼物列表实现,Android仿抖音列表效果
- leetcode零散题汇总
- Kotlin高仿微信-第20篇-个人信息
- 【C++】最近公共祖先 LCA
- 【Linux】创建、修改和删除用户(useradd | usermod | userdel)
- 【Git的学习笔记】老板让我用Git提交,但我还没学过Git