bzoj1007 [HNOI2008]水平可见直线
2017-02-10 21:51
447 查看
Description
在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:
L1:y=x; L2:y=-x; L3:y=0
则L1和L2是可见的,L3是被覆盖的.
给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.
Input
第一行为N(0 < N < 50000),接下来的N行输入Ai,BiOutput
从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格Sample Input
3-1 0
1 0
0 0
Sample Output
1 2正解:半平面交。这就是个板子。
//It is made by wfj_2048~ #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #define inf (1LL<<40) #define il inline #define RG register #define ll long long using namespace std; struct edge{ ll nt,to,dis; }g[1000010]; ll no[110][110],f[110],head[30],cnt[30],dis[30],q[1000010],n,m,k,e,d,num; il ll gi(){ RG ll x=0,q=0; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q ? -x : x; } il void insert(RG ll from,RG ll to,RG ll dis){ g[++num]=(edge){head[from],to,dis},head[from]=num; return; } il ll spfa(){ RG ll h=0,t=1; for (RG int i=2;i<=m;++i) dis[i]=inf; dis[1]=0,q[t]=1; while (h<t){ RG ll x=q[++h]; for (RG ll i=head[x];i;i=g[i].nt){ RG ll v=g[i].to; if (cnt[v]) continue; if (dis[v]>dis[x]+g[i].dis) q[++t]=v,dis[v]=dis[x]+g[i].dis; } } return dis[m]; } il void work(){ n=gi(),m=gi(),k=gi(),e=gi(); for (RG ll i=1;i<=e;++i){ RG ll u=gi(),v=gi(),w=gi(); insert(u,v,w),insert(v,u,w); } d=gi(); for (RG ll i=1;i<=d;++i){ RG ll id=gi(),a=gi(),b=gi(); for (RG ll j=a;j<=b;++j) no[id][j]=1; } for (RG ll i=1;i<=n;++i){ memset(cnt,0,sizeof(cnt)); for (RG ll p=1;p<=m;++p) for (RG ll q=1;q<=i;++q) if (no[p][q]){ cnt[p]=1; break; } RG ll l=spfa(); if (l<inf) f[i]=i*l; else f[i]=inf; for (RG ll j=1;j<i;++j){ memset(cnt,0,sizeof(cnt)); for (RG ll p=1;p<=m;++p) for (RG ll q=j+1;q<=i;++q) if (no[p][q]){ cnt[p]=1; break; } RG ll l=spfa(); if (l<inf) f[i]=min(f[i],f[j]+(i-j)*l+k); } } printf("%lld\n",f ); return; } int main(){ work(); return 0; }
相关文章推荐
- BZOJ 1007 HNOI2008 水平可见直线 半平面交
- bzoj 1007 [HNOI2008] 水平可见直线 题解
- 【BZOJ1007】【HNOI2008】水平可见直线
- BZOJ 1007: [HNOI2008]水平可见直线( 计算几何 )
- [bzoj1007]:[HNOI2008]水平可见直线(单调栈)
- 【BZOJ1007】[HNOI2008]水平可见直线【半平面交】
- bzoj1007: [HNOI2008]水平可见直线
- BZOJ 1007: [HNOI2008]水平可见直线
- BZOJ 1007 [HNOI2008] 水平可见直线
- BZOJ 1007 [HNOI2008]水平可见直线 (栈)
- [BZOJ 1007][HNOI2008]水平可见直线:单调栈
- BZOJ 1007 [HNOI2008]水平可见直线
- 【BZOJ1007】[HNOI2008]水平可见直线 半平面交
- 【BZOJ】【1007】【HNOI2008】水平可见直线
- 【bzoj 1007】 水平可见直线 【HNOI2008】
- BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包
- BZOJ 1007 [HNOI2008]水平可见直线===数学相关
- bzoj1007: [HNOI2008]水平可见直线 关于一类半半平面交题目的解法研究
- BZOJ1007 [HNOI2008]水平可见直线 计算几何 单调栈维护上凸包
- bzoj1007: [HNOI2008]水平可见直线