题目:

把1~n(n≤500)放到一个圆盘里,每个数恰好出现一次。每次可以选4个连续的数字翻转顺序。问能不能变成1.2.3....n的顺序。

思路:

这样的题的规律真的是一点都不好推,看了网上的博客知道只有n为奇数且给出的序列的逆序数为奇数的时候,这种情况下是不能完成的,其余的情况都可以。

如果n为偶数,那么在这个环中总有4个连续的数字的逆序数是偶数,假设4个数的逆序数是x,翻转之后逆序数变成了6-x(为什么是6-x自己还没有搞懂),逆序数的变化为6-2x为偶数。最后升序的逆序数是0为偶数。根据偶数+(-)偶数=偶数,奇数+(-)偶数=奇数,可以得知当序列的逆序数为偶数时,那就可以通过翻转是逆序数变为0.

代码:

树状数组求逆序数

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = ;
int a[maxn],n,tree[maxn]; int lowbit(int x){
return x&(-x);
} void add(int x){
while(x<=n){
tree[x]++;
x += lowbit(x);
}
} int getSum(int x){
int res = ;
while(x>){
res+=tree[x];
x -= lowbit(x);
}
return res;
} int main(){
//FRE();
int kase;
scanf("%d",&kase);
while(kase--){
memset(tree,,sizeof(tree));
scanf("%d",&n);
int cnt = ;
for(int i=; i<n; i++){
scanf("%d",&a[i]);
add(a[i]);
cnt += i+-getSum(a[i]);
}
if(cnt%== && n%==){
printf("impossible\n");
}else{
printf("possible\n");
}
}
return ;
}

暴力求逆序数

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = ;
int a[maxn],n; int main(){
int kase;
scanf("%d",&kase);
while(kase--){
scanf("%d",&n);
for(int i=; i<n; i++){
scanf("%d",&a[i]);
}
int cnt = ;
for(int i=; i<n; i++){
for(int j=; j<i; j++){
if(a[j]>a[i]){
cnt++;
}
}
}
if(cnt%== && n%==){
printf("impossible\n");
}else{
printf("possible\n");
}
}
return ;
}

最新文章

  1. sonn_game网站开发01:写在最前面
  2. what is service?
  3. 64位系统里的IIS运行32位ODP.NET的方法
  4. Spring JdbcTemplate 的使用与学习
  5. July 20th, Week 30th Wednesday, 2016
  6. Modified LCS
  7. 2.linux下Makefile编写规范
  8. 利用python 提取log 文件里的关键句子,并进行统计分析
  9. 【python】__new__和__init__区别
  10. destoon框架二次开发【整理】
  11. python3中用HTMLTestRunner.py报ImportError: No module named &#39;StringIO&#39;解决办法
  12. org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.
  13. 浅谈.net中数据库操作事务
  14. maven整合ssh框架笔记
  15. .NET Core修改监听端口
  16. cacti客户端snmp设置
  17. PAT 1007 素数对猜想 C语言
  18. c+内存管理机制
  19. Linux内核设计与实现——内核同步
  20. 快速搭建hadoop,学习使用

热门文章

  1. uva11542
  2. nginx - ubutun下安装nginx(详述编译方法)
  3. E20180124-hm
  4. js最全的十种跨域解决方案
  5. 个人微信号二次开发SDK协议,个人微信号二次开发api接口
  6. vim 跳行查看日志
  7. CSS左侧固定右侧自适应
  8. laravel ORM 只开启created_at的方法
  9. 429c Leha and Function
  10. .Net MVC 前台验证跟后台验证