n<=1000头牛各有一个未知值Ai,已知m<=10000条形如Ax>Ay的不等关系,求将整个序列排序的最少比较次数。

Aa>Ab,Ab>Ac -------> Aa>Ac,传递性,因此按m条不等关系连边建图,求出传递闭包,就是已知的关系。

求出传递闭包中的i≠j的0的个数即可。错误!连的图是有向图,而已知大于关系后其实另一边已知一个小于关系,所以用n*n,减去1的个数*2,再减(i,j),i=j的n个,再除以2得到答案。

n3不可接受,因此用bitset优化floyd。代码如下:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<bitset>
//#include<iostream>
using namespace std; int n,m;
#define maxn 1011
#define maxm 10011
struct Edge{int to,next;};
struct Graph
{
bitset<maxn> mp[maxn];
Graph() {memset(mp,,sizeof(mp));}
void insert(int x,int y) {mp[x][y]=;}
void floyd()
{
for (int j=;j<=n;j++)
for (int i=;i<=n;i++)
if (mp[i][j]) mp[i]|=mp[j];
}
int getans()
{
int one=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
one+=mp[i][j];
return (n*(n-)-one*)/;
}
}G;
int x,y;
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
G.insert(x,y);
}
G.floyd();
printf("%d\n",G.getans());
return ;
}

其实这个题是个错题,但错题错做。比如输入5 0,答案是10,但可以比较8次就出来。就是在一个已知有序数列中二分插入一个数,只是人工处理的情况下不需要进行区间移动之类的。

最新文章

  1. 一个不错的php验证码的类
  2. hdu 1087 Super Jumping! Jumping! Jumping! 简单的dp
  3. Codevs p1004 四子连棋
  4. BaseServlet
  5. 深入浅出ES6(十一):生成器 Generators,续篇
  6. POJ 2114 - Boatherds
  7. 国外主流PHP框架比较
  8. C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
  9. javascript笔记09:javascript的下拉式导航菜单
  10. Truck History
  11. SPSS与聚类分析
  12. JS学习之闭包的理解
  13. document.createElement在IE和Firefox下的差异
  14. 彻底卸载McAfee和Agent的方法
  15. socket套接字TCP API
  16. RabbitMQ基本管理(上)
  17. isset()和empty()的区别
  18. 关于Android路由的实现
  19. 使用Jquery.js框架和CSS3实现3D相册的制作
  20. Java集合:HashMap底层实现和原理(源码解析)

热门文章

  1. C++模板类头文件和实现文件分离
  2. 在docker容器中运行hello world!
  3. vue2.0组件生命周期探讨
  4. iOS猜拳游戏源码
  5. iOS开发内购全套图文教程
  6. SQLite – ORDER 子句
  7. leetcode_268.missing number
  8. k近邻法(kNN)
  9. Java BufferedReader文件读取 带缓冲区的字符流
  10. Puppeteer-常规操作一