棋盘V
问题 A: 棋盘V
时间限制: 1 Sec 内存限制: 128 MB
提交: 150 解决: 3
[提交] [状态] [讨论版] [命题人:]
题目描述
现在小K要猜哪些格子是特殊格子。她知道所有格子的横坐标和纵坐标,但并不知道对应关系。换言之,她只有两个数组,一个存下了所有格子的横坐标,另一个存下了所有格子的纵坐标,而且两个数组都打乱了顺序。当然,小K猜的n个格子的位置也必须都不相同。
请求出一个最大的k,使得无论小K怎么猜,都能猜对至少k个格子的位置。
输入
接下来n行,每行描述一个特殊格子的位置。第i行含有两个整数xi和yi ,代表第i个格子的坐标。保证任意两个格子的坐标都不相同。
输出
样例输入
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的更多相关文章
- 棋盘V(最小费用最大流)
棋盘V 时间限制: 1 Sec 内存限制: 128 MB提交: 380 解决: 44[提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100000,行和列的 ...
- TYVJ1035 棋盘覆盖
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩 ...
- codevs2171 棋盘覆盖
题目描述 Description 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖. 输入描述 Input Description 第一 ...
- BZOJ2706 : [SDOI2012]棋盘覆盖
A类数据: 将棋盘黑白染色,相邻的点之间连边,求出二分图最大匹配即可. B类数据: 答案为$\lfloor\frac{n^2-1}{3}\rfloor$,用FFT加速计算即可,时间复杂度$O(L\lo ...
- codevs 1049 棋盘染色
题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一 ...
- OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图
读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...
- bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link
2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 255 Solved: 77[Submit][Status] ...
- NOI2012 魔幻棋盘
http://www.lydsy.com/JudgeOnline/problem.php?id=2877 二维线段树. 好恶...... B类数据: 棋盘是一维的. 我们有一个结论: $gcd(a_{ ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
随机推荐
- 洛谷 [FJOI2014]最短路径树问题 解题报告
[FJOI2014]最短路径树问题 题目描述 给一个包含\(n\)个点,\(m\)条边的无向连通图.从顶点\(1\)出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多 ...
- Spring validation 后端校验【转】
本文来自 下一秒升华 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u013815546/article/details/77248003?utm_source=co ...
- 从零开始学习MXnet(一)
最近工作要开始用到MXnet,然而MXnet的文档写的实在是.....所以在这记录点东西,方便自己,也方便大家. 我觉得搞清楚一个框架怎么使用,第一步就是用它来训练自己的数据,这是个很关键的一步. 一 ...
- Codeforces 937.B Vile Grasshoppers
B. Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard ...
- POJ1637:Sightseeing tour(混合图的欧拉回路)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10581 Accepted: 4466 ...
- docker compose,link,Odoo
1.报错: /usr/bin/docker-current: Error response from daemon: driver failed programming external connec ...
- VC++使用CImage在内存中Jpeg转换Bmp图片
VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...
- Ubuntu系统iptables规则的查看和清除
系统不支持service iptables restart,service iptables status,如何查看与清除iptable的规则呢? 一 iptables查看基本语法 iptables ...
- 数据结构之(HDU2051 Bitset)
Problem Description Give you a number on base ten,you should output it on base two.(0 < n < 10 ...
- [POJ1845&POJ1061]扩展欧几里得应用两例
扩展欧几里得是用于求解不定方程.线性同余方程和乘法逆元的常用算法. 下面是代码: function Euclid(a,b:int64;var x,y:int64):int64; var t:int64 ...