非常带劲之计算几何

写的头晕= =

就是平面图转对偶图然后最小割

由于p非常小我们枚举所有保护状态然后割一下

建图真的烦 就是把区域划分出来看一下每一个古迹点是否被小区域包含【好像也可以写点定位】

然后我好像判左右叉积又双叒叕的写反了?

整个画出图来然后发现好像没建错图= = 然后把!删掉竟然过了= =于是愉快改成onright= =

区域划分就是双向直线然后每次找反向的极角的最近的就可以了 可以画个图大概就是这个样子

红的就是反向边 找的就是蓝色的 找一圈就一定会找回来

然后别忘了记录那个外边的无限平面

写起来带劲2333

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #include<set>
  8. #include<vector>
  9. #define inf 20021225
  10. #define ll long long
  11. #define db double
  12. #define eps 1e-8
  13. using namespace std;
  14. #define mxm 200000
  15. #define mxn 1100
  16. struct poi
  17. {
  18. db x,y;
  19. poi(){}
  20. poi(db _x,db _y){x=_x,y=_y;}
  21. };
  22. typedef poi vec;
  23. vec operator +(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
  24. vec operator -(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
  25. vec operator *(vec a,db b){return vec(a.x*b,a.y*b);}
  26. db cross(vec a,vec b){return a.x*b.y-a.y*b.x;}
  27. db value(vec a){return a.x*a.x-a.y*a.y;}
  28. db len(vec a){return sqrt(a.x*a.x+a.y*a.y);}
  29. struct line
  30. {
  31. poi p; vec v; db ang;
  32. int x,y,w,another,flag;
  33. line(){}
  34. line(poi _p,vec _v){p=_p,v=_v,ang=atan2(v.y,v.x);flag=0;}
  35. };
  36. bool onright(poi p,line l){return cross(l.p+l.v-p,l.p-p)>0;}
  37. vector<int> e[mxn];
  38. poi spc[mxn],stk[mxn];
  39. bool v[mxn],out[mxn];
  40. int n,m,p,bel[mxn];
  41. line li[mxm];
  42. bool cmp(int a,int b)
  43. {
  44. return li[a].ang<li[b].ang||abs(li[a].ang-li[b].ang)<eps&&cross(li[a].v,li[b].v)>0;
  45. }
  46. void find(int tmp,int id)
  47. {
  48. memset(v,true,sizeof(v));
  49. for(int i=1;i<=p;i++)
  50. if(v[i]) v[i]=onright(spc[i],li[tmp]);
  51. int start = li[tmp].x, now = li[tmp].y; li[tmp].flag=id;
  52. db area = cross(stk[start],stk[now]);
  53. do
  54. {
  55. vector<int>::iterator it = upper_bound(e[now].begin(),e[now].end(),li[tmp].another,cmp);
  56. if(it==e[now].end()) it=e[now].begin();
  57. //if(id==1) printf("===%d %lf %lf===\n",now,li[li[tmp].another].ang,li[*it].ang);
  58. tmp =*it; now=li[tmp].y;
  59. li[tmp].flag = id; area += cross(stk[li[tmp].x],stk[li[tmp].y]);
  60. for(int i=1;i<=p;i++) if(v[i]) v[i]=onright(spc[i],li[tmp]);
  61. }while(start!=now);
  62. for(int i=1;i<=p;i++) if(v[i]) bel[i]=id;
  63. if(area>0) out[id]=1;
  64. }
  65. int ed,blk;
  66. struct Edge
  67. {
  68. int x,y,w;
  69. Edge(){}
  70. Edge(int _x,int _y,int _w){x=_x,y=_y,w=_w;}
  71. }E[mxm];
  72. int Ecnt;
  73. int ans[mxn];
  74. struct edge{int to,lt,f;};
  75. struct maxflow
  76. {
  77. edge e[mxm];
  78. int in[mxn],cnt=1,dis[mxn],s,t;
  79. queue<int> que;
  80. void init()
  81. {
  82. s=mxn-10; t=s+1; cnt=1;
  83. memset(in,0,sizeof(in));
  84. }
  85. void add(int x,int y,int f)
  86. {
  87. e[++cnt].to=y;e[cnt].lt=in[x];e[cnt].f=f;in[x]=cnt;
  88. e[++cnt].to=x;e[cnt].lt=in[y];e[cnt].f=0;in[y]=cnt;
  89. }
  90. bool bfs()
  91. {
  92. memset(dis,0,sizeof(dis));
  93. while(!que.empty()) que.pop();
  94. dis[s]=1; que.push(s);
  95. while(!que.empty())
  96. {
  97. int x=que.front(); que.pop();
  98. for(int i=in[x];i;i=e[i].lt)
  99. {
  100. int y=e[i].to;
  101. if(!dis[y]&&e[i].f)
  102. dis[y]=dis[x]+1,que.push(y);
  103. if(dis[t]) return true;
  104. }
  105. }
  106. return false;
  107. }
  108. int dfs(int x,int flow)
  109. {
  110. if(x==t||!flow) return flow;
  111. int cur = flow;
  112. for(int i=in[x];i;i=e[i].lt)
  113. {
  114. int y=e[i].to;
  115. if(dis[y]==dis[x]+1&&e[i].f)
  116. {
  117. int tmp=dfs(y,min(cur,e[i].f));
  118. e[i].f-=tmp; e[i^1].f+=tmp;
  119. cur-=tmp; if(!cur) return flow;
  120. }
  121. }
  122. dis[x] = -1;
  123. return flow-cur;
  124. }
  125. int dinic()
  126. {
  127. int ans=0;
  128. while(bfs()) ans+=dfs(s,inf);
  129. return ans;
  130. }
  131. int build(int state)
  132. {
  133. init(); int one=0;
  134. for(int i=0;i<p;i++)
  135. if(state>>i&1)
  136. {
  137. add(s,bel[i+1],inf);
  138. one++;
  139. }
  140. for(int i=1;i<=Ecnt;i++)
  141. {
  142. int x=E[i].x,y=E[i].y,w=E[i].w;
  143. if(out[x]) x=t;
  144. if(out[y]) y=t;
  145. add(x,y,w);
  146. }
  147. return one;
  148. }
  149. }flow;
  150. int main()
  151. {
  152. int x,y,w;
  153. scanf("%d%d%d",&p,&n,&m);
  154. for(int i=1;i<=p;i++) scanf("%lf%lf",&spc[i].x,&spc[i].y);
  155. for(int i=1;i<=n;i++) scanf("%lf%lf",&stk[i].x,&stk[i].y);
  156. for(int i=1;i<=m;i++)
  157. {
  158. scanf("%d%d%d",&x,&y,&w);
  159. li[++ed] = line(stk[x],stk[y]-stk[x]);
  160. li[ed].x=x;li[ed].y=y;li[ed].w=w;
  161. li[ed].another = ed+1;
  162. e[x].push_back(ed);
  163. li[++ed] = line(stk[y],stk[x]-stk[y]);
  164. li[ed].x=y;li[ed].y=x;li[ed].w=w;
  165. li[ed].another = ed-1;
  166. e[y].push_back(ed);
  167. }
  168. for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end(),cmp);
  169. for(int i=1;i<=ed;i++) if(!li[i].flag) find(i,++blk);
  170. for(int i=1;i<=ed;i++) E[++Ecnt] = Edge(li[i].flag,li[li[i].another].flag,li[i].w);
  171. //for(int i=1;i<=ed;i++) printf("%d %d\n",i,li[i].flag);
  172. memset(ans,48,sizeof(ans));
  173. int top=(1<<p);
  174. //for(int i=1;i<=p;i++) printf("%d\n",bel[i]);
  175. for(int i=1;i<top;i++)
  176. {
  177. int one=flow.build(i);
  178. int tmp=flow.dinic();
  179. //printf("===%d %d %d\n",i,one,tmp);
  180. ans[one]=min(ans[one],tmp);
  181. }
  182. for(int i=p;i;i--) ans[i]=min(ans[i],ans[i+1]);
  183. for(int i=1;i<=p;i++) printf("%d\n",ans[i]);
  184. return 0;
  185. }

BZOJ2695 保护古迹的更多相关文章

  1. BZOJ2965 : 保护古迹

    首先要将这个图连通,方法是通过扫描线+set求出每个连通块最高的点上方的第一条边,然后向交点连边. 然后把边拆成两条双向边,每次找到一条没走过的边,找到极角排序后它的反向边的后继,直到回到这条边. 根 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. [NetworkFlow]网络流建模相关

    流 网络流问题本质上是线性规划问题的应用之中的一个,线性规划问题的标准形式是给出一组等式约束和不等式约束.要求最优化一个线性函数. 在流问题中,变量以流量的形式出如今问题中,我们给出一个流网络(以有向 ...

  4. 最小割&网络流应用

    重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...

  5. 为革命保护视力 --- 给 Visual Studio 换颜色

    “为革命,保护视力,预防近视,眼保健操开始......” 这个应该是最老版本的眼保健操了,你听过? 一堆废话 且不说上面这个眼保健操到底有木有用,让眼睛放松下还是很有必要的,尤其是现在天天对着不是手机 ...

  6. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  7. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  8. IBatisNet -- 保护你的配置文件及映射文件信息

    通常情况下我们在使用IBatisNet的时候,配置文件和映射文件都是暴露在外的,如果能进入到服务器,那么你的程序的操作数据库的SQL语句,数据库连接字符串等信息都将很轻松的被看到,这样是很危险的.然而 ...

  9. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

随机推荐

  1. 201903-2 CCF 二十四点

    题面: 考场写的30分== #include<bits/stdc++.h> using namespace std; stack<int>st; stack<char&g ...

  2. [CSP-S模拟测试]:飞(fly)(数状数组+简单几何)

    题目描述 $liu\_runda$决定提高一下知识水平,于是他去请教郭神.郭神随手就给了$liu\_runda$一道神题,$liu\_runda$并不会做,于是把这个题扔到联考里给高二的做.郭神有$n ...

  3. ::before和::after的详细介绍

    原文传送门: https://www.cnblogs.com/staro... 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类--:hover,:link,:active,: ...

  4. 前端工具【0】—— Emmet插件

    介绍:Emmet是许多流行文本编辑器的插件,它极大地改进了HTML和CSS工作流程 .为大部分流行的编辑器都提供了安装插件,核心是缩写语法+tab键(不同编辑器可自行设置),以下是我整理的常用知识点. ...

  5. DHCP服务器怎么设置怎么启动

    DHCP:动态主机配置协议,服务器用于为网络中的客户端自动分配IP地址.这种方法避免了由于手动配置IP地址导致的IP地址冲突问题,同时也减少了网络管理员的工作量. 工具/原料 在配置DHCP服务器时, ...

  6. 金山云无法ping通外网

    解决方法:在网络安全组中放行ping端口.

  7. 这才是Tomcat内存配置的正确姿势

    1.背景 虽然阅读了各大牛的博客或文章,但并没有找到特别全面的关于JVM内存分配方法的文章,很多都是复制黏贴 为了严谨,本文特别备注只介绍基于HotSpot VM虚拟机,并且基于JDK1.7的内存分配 ...

  8. Add hatch to bar plot

    function applyhatch(h,patterns,colorlist) %APPLYHATCH Apply hatched patterns to a figure % APPLYHATC ...

  9. spring cloud服务间调用feign

    参考文章:Spring Cloud Feign设计原理 1.feign是spring cloud服务间相互调用的组件,声明式.模板化的HTTP客户端.类似的HttpURLConnection.Apac ...

  10. 交换机vlan配置

    vlan:virtual LAN  虚拟局域网 作用:通过VLAN技术,可以对局域网进行隔离,互相隔离开的局域网相互之间不能进行通信,一个VLAN为一个广播域 Vlan配置 GNS3(使用路由器来模拟 ...