The Problem Needs 3D Arrays

题意:给你n个数, 然后1-n的数, 然后要求按顺序选出m个数, 求 逆序数/m 个数的 最大值是多少。

题解:裸的最大密度子图。逆序的2个数建边, 跑一下最大密度子图就AC了。

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const LL mod = (int)1e9+;
const int N = ;
const int M = ;
double eps = 1e-;
int head[N], deep[N], cur[N];
int u[M], v[M];
int vis[N], d[N];
double w[M]; int to[M], nx[M];
int n, m, tot;
int a[N];
void add(int u, int v,double val){
w[tot] = val; to[tot] = v;
nx[tot] = head[u]; head[u] = tot++;
w[tot] = ; to[tot] = u;
nx[tot] = head[v]; head[v] = tot++;
}
int bfs(int s, int t){
queue<int> q;
memset(deep, , sizeof(int)*(n+));
q.push(s);
deep[s] = ;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u]; ~i; i = nx[i]){
if(w[i] > && deep[to[i]] == ){
deep[to[i]] = deep[u] + ;
q.push(to[i]);
}
}
}
if(deep[t] > ) return ;
return ;
}
double Dfs(int u, int t, double flow){
if(u == t) return flow;
for(int &i = cur[u]; ~i; i = nx[i]){
if(deep[u] + == deep[to[i]] && w[i] > ){
double di = Dfs(to[i], t, min(w[i], flow));
if(di > ){
w[i] -= di, w[i^] += di;
return di;
}
}
}
return ;
} int Dinic(int s, int t){
double ans = , tmp;
while(bfs(s, t)){
for(int i = ; i <= n+; i++) cur[i] = head[i];
while(tmp = Dfs(s, t, INF)) ans += tmp;
}
return ans;
} bool check(double x){
memset(head, -, sizeof(int) * (n+));
tot = ;
int s = , t = n + ;
for(int i = ; i <= m; i++){
add(u[i], v[i], );
add(v[i], u[i], );
}
for(int i = ; i <= n; i++){
add(s, i, m);
add(i, t, m+*x-d[i]);
}
return (m*n-Dinic(s,t))/2.0 >= 1e-;
} int main(){
int T;
scanf("%d", &T);
for(int _i = ; _i <= T; _i++){
scanf("%d", &n);
for(int i = ; i <= n; i++)scanf("%d", &a[i]);
memset(d, , sizeof(int)*(n+));
m = ;
for(int i = ; i <= n; i++){
for(int j = ; j < i; j++){
if(a[j] > a[i]){
d[i]++;
d[j]++;
m++;
u[m] = i;
v[m] = j;
}
}
}
double l = , r = m, mid;
while(r - l >= eps){
mid = (l+r)/;
if(check(mid)) l = mid;
else r = mid;
}
printf("Case #%d: %.12f\n", _i, l);
//printf
} return ;
}

最新文章

  1. Notepad++使用小结
  2. Android 媒体存储服务(二)
  3. c语言结构体&amp;常指针和常量指针的区别
  4. Elasticsearch聚合 之 Terms
  5. No resource found that matches the given name &#39;Theme.AppCompat.Light 的完美解决方案
  6. 在Windows7上安装coreseek3.2同时在PHP下简单实现步骤
  7. Android 一步一步教你使用ViewDragHelper
  8. JavaScript学习笔记(10)——JavaScript语法之操作DOM
  9. LeetCode Delete Node in a Linked List (删除链表中的元素)
  10. flashback data archive (转)
  11. Inter系列处理器名称浅析
  12. macbook air 安装win7系统时,到最后一步要进入win7,需要给PC设置一个用户名,键盘没反应
  13. POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数
  14. 采购IC应该知道的十大网站
  15. ORA-16014报错解决
  16. 【Django】 视图层说明
  17. MTK 隐藏底部状态栏
  18. python3编程的一些实用技巧1
  19. QUdpSocket-Qt使用Udp通讯实现服务端和客户端
  20. HighCharts 在IE8下饼图不显示的问题

热门文章

  1. js获取手机系统语言
  2. 15分钟让你了解如何实现并发中的Barrier
  3. Java----面向对象(继承&amp;多态)
  4. 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学
  5. sed流编辑器
  6. 值得花费一周研究的算法 -- KMP算法(indexOf)
  7. [科研民工笔记1]安装Ubuntu到U盘
  8. JDK基础必备面试十问
  9. Java反射Reflect的使用详解
  10. js-获取屏幕的中各种宽高