问题 A: 棋盘V

时间限制: 1 Sec  内存限制: 128 MB
提交: 150  解决: 3
[提交] [状态] [讨论版] [命题人:]

题目描述

有一块棋盘,棋盘的边长为100000,行和列的编号为1到100000。棋盘上有n个特殊格子,任意两个格子的位置都不相同。
现在小K要猜哪些格子是特殊格子。她知道所有格子的横坐标和纵坐标,但并不知道对应关系。换言之,她只有两个数组,一个存下了所有格子的横坐标,另一个存下了所有格子的纵坐标,而且两个数组都打乱了顺序。当然,小K猜的n个格子的位置也必须都不相同。
请求出一个最大的k,使得无论小K怎么猜,都能猜对至少k个格子的位置。

输入

输入数据第一行包含一个整数n。
接下来n行,每行描述一个特殊格子的位置。第i行含有两个整数xi和yi ,代表第i个格子的坐标。保证任意两个格子的坐标都不相同。 

输出

输出一行,包含一个整数,代表最大的k。

样例输入

2
1 1
2 2

样例输出

0

提示

小K有可能会猜(1,2),(2,1),此时一个都没对
对于30%的数据,n≤8。
另外有5%的数据,所有横坐标和纵坐标均不相同。
另外有15%的数据,所有横坐标或者纵坐标均不相同。
对于100%的数据,n≤50,1≤xi,yi≤100000。

分析:费用流板子题,从裤裆里掏出费用流板子,魔改了两小时,终于能跑了。不说了,自闭了。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#define LL long long
#define equal ==
#define inf 0x3f3f3f3f
#define fr first
#define sc second
#define range(i,a,b) for(auto i=a;i<=b;++i)
#define itrange(i,a,b) for(auto i=a;i!=b;++i)
#define rerange(i,a,b) for(auto i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
const int mxn=int(1e5+);
int n,x[mxn],y[mxn],p[mxn],cnt,flag[][],ans;
namespace MCMF{
struct edge{
int head,to,nxt,cost,weight;
}edges[mxn];
bool vis1[mxn],vis2[mxn];
int S,T,sum1[mxn],sum2[mxn],d[mxn],tol=;
void add(int x,int y,int z,int p){
edges[tol].cost=p;edges[tol+].cost=-p;
edges[tol].weight=z;edges[tol+].weight=;
edges[tol].to=y;edges[tol+].to=x;
edges[tol].nxt=edges[x].head;edges[tol+].nxt=edges[y].head;
edges[x].head=tol++;edges[y].head=tol++;
}
bool spfa(){
fill(vis1,);fill(vis2,);fill(d,inf);
queue<int>q;
q.push(S);
d[S]=;
vis1[S]=;
while(not q.empty()){
int head=q.front();
q.pop();
vis1[head]=false;
for(int i=edges[head].head;i;i=edges[i].nxt){
int to=edges[i].to;
if(edges[i].weight and d[to]>d[head]+edges[i].cost){
d[to]=d[head]+edges[i].cost;
if(!vis1[to]){
vis1[to]=true;
q.push(to);
}
}
}
}
return d[T]!=inf;
}
int dfs(int to,int fs){
if(to equal T){
ans+=d[to]*fs;
return fs;
}
int ret=;
vis2[to]=true;
for(int i=edges[to].head;i;i=edges[i].nxt){
int tmp=edges[i].to;
if(edges[i].weight and not vis2[tmp] and d[tmp] equal d[to]+edges[i].cost){
int ntmp(dfs(tmp,min(fs-ret,edges[i].weight)));
edges[i].weight-=ntmp;
edges[i^].weight+=ntmp;
ret+=ntmp;
if(ret==fs)return ret;
}
}
return ret;
}
}
void init(){
scanf("%d",&n);
MCMF::S=(n<<)+;
MCMF::T=MCMF::S+;
range(i,,n){
scanf("%d%d",x+i,y+i);
p[++cnt]=*(x+i);
p[++cnt]=*(y+i);
}
sort(p+,p++cnt);
cnt=int(unique(p+,p++cnt)-p-);
range(i,,n){
x[i]=int(lower_bound(p+,p++cnt,x[i])-p);
y[i]=int(lower_bound(p+,p++cnt,y[i])-p);
using namespace MCMF;
++sum1[x[i]];
++sum2[y[i]];
flag[x[i]][y[i]]=true;
}
}
void solve(){
using namespace MCMF;
range(i,,cnt){
if(sum1[i])add(S,i,sum1[i],);
if(sum2[i])add(i+(n<<),T,sum2[i],);
}
range(i,,cnt)
range(j,,cnt){
if(flag[i][j])add(i,j+(n<<),,);
else add(i,j+(n<<),,);
}
while(spfa())dfs(S,inf);
printf("%d\n",ans);
}
int main() {
init();
solve();
return ;
}

棋盘V的更多相关文章

  1. 棋盘V(最小费用最大流)

    棋盘V 时间限制: 1 Sec  内存限制: 128 MB提交: 380  解决: 44[提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100000,行和列的 ...

  2. TYVJ1035 棋盘覆盖

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩 ...

  3. codevs2171 棋盘覆盖

    题目描述 Description 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖. 输入描述 Input Description 第一 ...

  4. BZOJ2706 : [SDOI2012]棋盘覆盖

    A类数据: 将棋盘黑白染色,相邻的点之间连边,求出二分图最大匹配即可. B类数据: 答案为$\lfloor\frac{n^2-1}{3}\rfloor$,用FFT加速计算即可,时间复杂度$O(L\lo ...

  5. codevs 1049 棋盘染色

    题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一 ...

  6. OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

    读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...

  7. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  8. NOI2012 魔幻棋盘

    http://www.lydsy.com/JudgeOnline/problem.php?id=2877 二维线段树. 好恶...... B类数据: 棋盘是一维的. 我们有一个结论: $gcd(a_{ ...

  9. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

随机推荐

  1. Windows关机过程分析与快速关机

    原文链接:http://blog.csdn.net/flyoxs/article/details/3710367 Windows开机和关机慢,很多时候慢得令人抓狂.特别是做嵌入式开发时(如XPE和Wi ...

  2. 【BZOJ3038】上帝造题的七分钟2 线段树

    根据一个数六次√必死,我们可以打标记死了就不管他了,于是有贡献的操作复杂度为O(n*logn*6),然而我们还有由于盲目修改造成的多余代价我们把每次查询的区间分成三部分前全死,中残,后全死,对于中残, ...

  3. Vim使用小记(二)插件管理

    By francis_hao    Mar 8,2017 Vundle Vundle,全称为Vim bundle,是一个插件管理器.可以对vim插件进行安装和卸载. Vundle的安装方法看这里[参考 ...

  4. [uva 1350]数位dp+二分

    题目链接:https://vjudge.net/problem/38405 #include<bits/stdc++.h> using namespace std; ][]; ]; lon ...

  5. Linux设置虚拟内存-创建和启用Swap交换区

    如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,如果是SSD硬盘,正常读写速度都在300M ...

  6. MySQL 配置文件及逻辑架构

    配置文件: linux:/etc/my.cnf              默认配置文件:/usr/share/mysql/my-default.cnf windows:my.ini 主要日志文件: 二 ...

  7. Java中中英文对齐输出问题,以及Java中的格式化输出

    一 中英文对齐输出问题 问题,要求控制台输出如下: abcefg  def 森林 阿狗 其实就是要求对齐输出,各种查找java的格式化输出,然后发现只要一个简单的“\t”就可以实现. 代码如下: Sy ...

  8. 我在开发中所遇到的iOS7新特性以及iOS7与iOS6的适配问题总结

      ⓵UIImageView 1. // iOS7添加的对图像颜色处理的功能,过滤颜色的功能 2. _imageView.tintColor = [UIColor blueColor]; 3. //重 ...

  9. VC6.0显示行号的插件

    VC6.0显示行号的插件,很好很强大的显行号插件,使用VC编程的朋友再也不用烦恼VC6.0没有行号的编程环境了. VC显示行号插件使用说明:1. 如果你的VC安装在C盘,请拷贝文件VC6LineNum ...

  10. Security+考试通过心得

    Security+ Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA:是和CISSP.CISA等共同包含在内的国际IT业热门认证之一,和CISSP偏重信息安全 ...