POJ
来源:互联网 发布:9.3越狱软件源 编辑:程序博客网 时间:2024/06/16 00:41
题目链接点这里
最近真是很怠情啊,不想动手。。。
偶尔敲一题,,都是敲一个小时,,调试2个小时的状态,,,,心累,,
#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#include<map>#include<set>#include<bitset>#include<stack>#include<queue>#include<string.h>#include<cstring>#include<vector>#include<time.h>#include<stdlib.h>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define fuck(x) cout<<"x"<<endl;#define MX 111111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;const double eps=1e-5;int n,k;const int M=2222,U=1000;//M为U-(y-x)取到的最大值;struct Point { int x,y,id; bool operator <(const Point a)const { if(x!=a.x)return x<a.x; return y-x<a.y-a.x; }} w[MX];struct Edge { int u,v,dist; bool operator <(const Edge a)const { return dist<a.dist; } Edge() {} Edge(int u,int v,int dist):u(u),v(v),dist(dist) {}} E[10*MX];int cnt;struct Tree { int val,id;} tree[MX];void tree_add(int x,int val,int id) { while(x<=M) { if(tree[x].val>val) { tree[x].val=val; tree[x].id=id; } x+=-x&x; }}PII tree_query(int x) { int minn=INF,id=-1; while(x) { if(tree[x].val<minn) { minn=tree[x].val; id=tree[x].id; } x-=-x&x; } return PII(minn,id);}void build() { for(int i=0; i<=M; i++)tree[i].id=-1,tree[i].val=INF; sort(w,w+n); for(int i=n-1; i>=0; i--) { PII u=tree_query(U-(w[i].y-w[i].x)); if(u.second!=-1) E[cnt++]=Edge(w[i].id,u.second,u.first-(w[i].x+w[i].y)); tree_add(U-(w[i].y-w[i].x),w[i].y+w[i].x,w[i].id); }}int bin[MX];int Find(int x) { return x==bin[x]?x:bin[x]=Find(bin[x]);}int main() { FIN; while(cin>>n>>k) { for(int i=0; i<n; i++) { scanf("%d%d",&w[i].x,&w[i].y); w[i].id=i; } cnt=0; build(); //以x=y翻转 for(int i=0; i<n; i++)swap(w[i].x,w[i].y); build(); //以x=0翻转 for(int i=0; i<n; i++)w[i].x=-w[i].x; build(); //以x=y翻转 for(int i=0; i<n; i++)swap(w[i].x,w[i].y); build(); //求最小生成树部分 sort(E,E+cnt);//有重边 for(int i=1; i<=n; i++)bin[i]=i; int t=0,ans=0; k=n-1-k+1; for(int i=0; i<cnt; i++) { int fa=Find(E[i].u),fb=Find(E[i].v); if(fa!=fb)t++,bin[fa]=fb; if(t==k) { ans=E[i].dist; break; } } cout<<ans<<endl; } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- hdu 4712 Hamming Distance
- zigbee如何设置重发次数
- 线程-Linux下的轻量级进程
- Ant脚本将web项目打war包、远程备份更新线上项目
- 漫画说算法--动态规划算法二(绝对通俗易懂,非常棒)
- POJ
- Java基础-files(2)
- Android7.0中文文档(API)--- ViewFlipper
- ios搜索(可实现模糊搜索 支持拼音检索 首字母等)
- IPC-信号量
- 面膜使用心得
- POJ2112_Optimal Milking_最大流解决匹配问题
- 详解应对平台高并发的分布式调度框架TBSchedule
- PostgreSQL间隔时间(单位:分钟)