问题 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. 12.25模拟赛T3

    可以发现,答案O(根号)(因为链上答案最大,n/2,n/3...根号种) 每次求答案要二分 优秀的做法是: 对于小于根号n的暴力nlogn找,可能二分到同一个mid,记忆化一下最小的tot值 对于大于 ...

  2. 【BZOJ3674】可持久化并查集加强版

    可持久化并查集我觉得就是可持久化数组的一种应用.可持久化数组,顾名思义,就是有历史版本的数组,那么如果我们暴力修改储存的话,修改O(n)查询O(1),空间O(n*m),这样肯定不可行,那么我们发现主席 ...

  3. ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法

    最近做手机端项目遇到一个问题,就是在ios10系统里面  safari浏览器 在touchmove 里面写e.preventDefault();不起作用 更种google 还是没有找到解决方法 最后找 ...

  4. HAOI2006 均分数据 [模拟退火]

    题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...

  5. mybatis的mapper文件的大于号特殊符号使用

    第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT * FROM test WHERE 1 = 1 AND start_date  <= CURRENT_DA ...

  6. python并发进程

    1 引言 2 创建进程 2.1 通过定义函数的方式创建进程 2.2 通过定义类的方式创建进程 3 Process中常用属性和方法 3.1 守护进程:daemon 3.2 进程终结于存活检查:termi ...

  7. 【uva11468-Substring】AC自动机+dp

    http://acm.hust.edu.cn/vjudge/problem/31655 题意:给定k个模板串,n个字符以及选择它的概率pro[i],要构造一个长度问L的字符串s,问s不包含任意一个模板 ...

  8. ZOJ 3599 K倍动态减法游戏

    下面的文字辅助理解来自http://blog.csdn.net/tbl_123/article/details/24884861 博弈论中的 K倍动态减法游戏,难度较大,参看了好多资料才懵懂! 此题可 ...

  9. js 函数分类2

    js 通用监听函数实现 // 把所有方法封装到一个对象里面,充分考虑兼容写法 var EventUtil = { // 添加DOM事件 addEvent: function(element, type ...

  10. jq TAB切换

    <a href="http://www.w3.org/1999/xhtml">" target="_blank">http://ww ...