BZOJ1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
2024-08-23 21:14:30
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次就出来。就是在一个已知有序数列中二分插入一个数,只是人工处理的情况下不需要进行区间移动之类的。
最新文章
- 一个不错的php验证码的类
- hdu 1087 Super Jumping! Jumping! Jumping! 简单的dp
- Codevs p1004 四子连棋
- BaseServlet
- 深入浅出ES6(十一):生成器 Generators,续篇
- POJ 2114 - Boatherds
- 国外主流PHP框架比较
- C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
- javascript笔记09:javascript的下拉式导航菜单
- Truck History
- SPSS与聚类分析
- JS学习之闭包的理解
- document.createElement在IE和Firefox下的差异
- 彻底卸载McAfee和Agent的方法
- socket套接字TCP API
- RabbitMQ基本管理(上)
- isset()和empty()的区别
- 关于Android路由的实现
- 使用Jquery.js框架和CSS3实现3D相册的制作
- Java集合:HashMap底层实现和原理(源码解析)