[APIO2010]
A.特别行动队

n<=1000000
看了数据范围和题目感觉就像是斜率优化,然后瞎推了一波式子,没想到A了。
sij表示i+1到j的权值和。
j比k优秀 $$fj+a*sij^{2}+b*sij+c>fk+a*sik^{2}+b*sik+c$$
然后乱整理$$2*a*si<\frac{fj-fk}{sj-sk}+a*(sj+sk)-b$$
si递增,维护上凸。
#include<iostream>
#include<cstdio>
#define ll long long
#define ld long double
#define MN 1000000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} ll f[MN+],s[MN+],a,b,c;
int top=,tail=,q[MN+];
int n; ll calc(ll x){return a*x*x+b*x+c;} ld solve(int x,int y)
{
return (ld)(f[x]-f[y])/(s[x]-s[y])+(ld)a*(s[x]+s[y])-(ld)b;
} void ins(int x)
{
while(top>tail&&solve(x,q[top])>solve(q[top],q[top-])) top--;
q[++top]=x;
} int get(ll x)
{
while(top>tail&&solve(q[tail+],q[tail])>x) tail++;
return q[tail];
} int main()
{
n=read();a=read();b=read();c=read();
for(int i=;i<=n;i++) s[i]=s[i-]+read();
for(int i=;i<=n;i++)
{
int from=get(1LL**a*s[i]);
f[i]=f[from]+calc(s[i]-s[from]);
ins(i);
}
cout<<f[n];
return ;
}
B.巡逻

n<=100000
题解:yy一下可以发现,k=1找的是最长链,答案是(n-1)*2+1-长度
k=2的时候,我们把最长链上的边改成-1,然后再跑最长链就行啦。答案是(n-1)*2+2-长度之和。
我一开始yy了很牛逼的树形dp,然后写了半天还是有一个点过不了。。。百度一下题解,真的妙
#include<iostream>
#include<cstdio>
#define MN 100000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} struct edge{int to,next,w;}e[MN*+];
int head[MN+],cnt=,n;
int f[MN+],w1[MN+],f1[MN+],mx[MN+],mx2[MN+],ans=,K,from; void solve(int x,int fa)
{
int from1=,from2=;mx[x]=mx2[x]=f[x]=;
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
{
solve(e[i].to,x);
if(f[e[i].to]+e[i].w>mx[x]) mx2[x]=mx[x],mx[x]=f[e[i].to]+e[i].w,from2=from1,from1=e[i].to;
else if(f[e[i].to]+e[i].w>mx2[x]) mx2[x]=f[e[i].to]+e[i].w,from2=e[i].to;
}
if(mx[x]+mx2[x]>ans) ans=mx[x]+mx2[x],from=x;
f[x]=mx[x];mx[x]=from1;mx2[x]=from2;
} void relabel(int x)
{
for(int i=head[x];i;i=e[i].next)
if(e[i].to==mx[x])
e[i].w=-,relabel(e[i].to);
} void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f],};head[f]=cnt;
e[++cnt]=(edge){f,head[t],};head[t]=cnt;
} int main()
{
n=read();K=read();
for(int i=;i<n;i++) ins(read(),read());
solve(,);if(K==)return *printf("%d",*n--ans);
n=n*-ans;ans=;
for(int i=head[from];i;i=e[i].next)
if(e[i].to==mx[from]||e[i].to==mx2[from])
e[i].w=-,relabel(e[i].to);
solve(,);
printf("%d\n",n-ans);
return ;
}
3.signaling 信号覆盖

题意:给定平面上n个点,满足没有三个点共线,没有四个点共圆。你现在随意选出三个点,求这三个点的外接圆内包含的点的期望个数。 $n\leqslant 1500$
题解:对于每一个三个点包含一个点的情况,我们都能抽象成一个四边形。我们发现凸四边形有两种方法盖住四个点,而凹多边形只有一种方法,所以凸多边形的贡献是2,凹的是1,他们的个数相加是C(n,4),所以我们只要计算凸多边形或者凹多边形的个数就行了。我们枚举凹多边形的凹点,然后按照极角排序,然后枚举一个点,找出最远的点使得他们之间的夹角不超过平角,通过组合算出个数,最后除以总的方案数C(n,3) 。
复杂度$n^{2}logn$
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MN 1500
#define ll long long
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} struct P
{
double x,y,alpha;
void getAlpha(double xx,double yy){alpha=atan2(x-xx,y-yy);}
friend double cross(P a,P b){return a.x*b.y-a.y*b.x;}
bool operator == (P b){return x==b.x&&y==b.y;}
bool operator < (const P &b) const {return alpha<b.alpha;}
P operator - (P b){return (P){x-b.x,y-b.y};}
void print()
{
cout<<x<<" "<<y<<" "<<alpha<<endl;
}
}p[MN+],pt[MN+]; int n,top;
double ans=; ll work(P th)
{
ll sum=1LL*(n-)*(n-)*(n-)/;int num=;top=;
for(int i=;i<n;i++,--num)
{
while(cross(p[i]-th,p[top]-th) <= )
{
top=top%(n-)+,num++;
if(top==i) break;
}
sum-=1LL*(num)*(num-)/;
}
return sum;
} int main()
{
n=read();if(n==) return *puts("");
for(int i=;i<=n;i++) pt[i].x=p[i].x=read(),pt[i].y=p[i].y=read();
for(int i=;i<=n;i++)
{
for(int j=;j<n;j++)
{
if(pt[i]==p[j]) swap(p[j],p[n]);
p[j].getAlpha(pt[i].x,pt[i].y);
}
sort(p+,p+n);
ans+=work(pt[i]);
}
double A=1LL*n*(n-)*(n-)/,B=1LL*n*(n-)*(n-)*(n-)/;
printf("%.6lf\n",(ans+*(B-ans))/A+);
return ;
}
[APIO2010]的更多相关文章
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 【BZOJ】【1911】【APIO2010】特别行动队commando
DP/斜率优化 嗯……第三道斜率优化的题目了. 定义 $s[i]=\sum_{k=1}^{i} x[k] $ 方程:$f[i]=max\{ f[j]+a*(s[i]-s[j])^2+b*(s[i]-s ...
- 【BZOJ】【1912】【APIO2010】patrol巡逻
树形DP 说是树形DP,其实就是求树的最长链嘛…… K=1的时候明显是将树的最长链的两端连起来最优. 但是K=2的时候怎么搞? 考虑第一次找完树的最长链以后的影响:第一次找过的边如果第二次再走,对答案 ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3191 Solved: 1450[Submit][Statu ...
- BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )
sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...
- 【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)
[BZOJ1911][APIO2010]特别行动队 题面 Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号, 要将他们拆分成若干特别行动队调入战场.出于默契的考 ...
- bzoj1913[Apio2010]signaling 信号覆盖 计算几何
1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1583 Solved: 646[Subm ...
- bzoj1911[Apio2010]特别行动队 斜率优化dp
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 5057 Solved: 2492[Submit][Statu ...
- 题解-APIO2010 特别行动队
题目 洛谷 & bzoj 简要题意:给定一个长为\(n\)的序列\(\{s_i\}\)与常数\(a,b,c\),序列的一个连续子段\(s_i\)到\(s_j\)的贡献为\(at^2+bt+c\ ...
随机推荐
- 第四十四条:为所有导出的API元素编写文档注释
简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...
- JS 转换数据类型
JavaScript 是一种动态数据类型语言,变量是没有类型的,可以随机赋予任意值,若变量要转换数据类型,有两种办法:隐式转换和显式转换. 隐式转换可转换为字符串(将一个值加上字符串) 数字(在值的前 ...
- 一个诚实的孩纸选Python的原因
我之所以会选择python语言程序设计这门课,是因为我一开始预选选的选修课都没选上,然后在补选的时候,在别人选剩的课里面选择了python. 上了两节课之后,我发现python还挺有意思的,挺喜欢py ...
- python中的赋值与深浅拷贝
Python当中对于拷贝,分为两种类型.一种是数字和字符串,另一种就是列表.元组.字典等其他类型了. 一.数字和字符串的拷贝 1.赋值 举个栗子: a1 = 123123 a2 = 123123 # ...
- iot前台开发环境:请求示例
参考链接:http://www.cnblogs.com/keatkeat/category/872790.html 编辑->update保存 一.typescipt import { Injec ...
- python入门(12)dict
python入门(12)dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例 ...
- 复习HTML+CSS(2)
n 项目符号嵌套编号思路 标签的内容(文本.项目符号.表格.图片等)必须放在最底层标记中. n 图片标记(行内元素,单边标记) l 语法:<img 属性 = "值"&g ...
- Mybatis 中的转义字符
记录以下mybatis中的转义字符,方便以后自己看一下 Mybatis转义字符表 < < 小于 > > 大于 & & 与 ' ' 单引号 &q ...
- 浅谈 Mybatis中的 ${ } 和 #{ }的区别
好了,真正做开发也差不多一年了.一直都是看别人的博客,自己懒得写,而且也不会写博客,今天就开始慢慢的练习一下写博客吧.前段时间刚好在公司遇到这样的问题. 一.举例说明 select * from us ...
- python3.6执行pip3时 Unable to create process using '"'
问题需求 由于在windows操作系统中已经安装了python2.7,要在安装python3的时候 将python3.6安装在C:\Python36目录下 然后进入C:\Python36目录下执行pi ...