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]的更多相关文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  2. 【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 ...

  3. 【BZOJ】【1912】【APIO2010】patrol巡逻

    树形DP 说是树形DP,其实就是求树的最长链嘛…… K=1的时候明显是将树的最长链的两端连起来最优. 但是K=2的时候怎么搞? 考虑第一次找完树的最长链以后的影响:第一次找过的边如果第二次再走,对答案 ...

  4. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  5. bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3191  Solved: 1450[Submit][Statu ...

  6. BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )

    sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...

  7. 【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)

    [BZOJ1911][APIO2010]特别行动队 题面 Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号, 要将他们拆分成若干特别行动队调入战场.出于默契的考 ...

  8. bzoj1913[Apio2010]signaling 信号覆盖 计算几何

    1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1583  Solved: 646[Subm ...

  9. bzoj1911[Apio2010]特别行动队 斜率优化dp

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5057  Solved: 2492[Submit][Statu ...

  10. 题解-APIO2010 特别行动队

    题目 洛谷 & bzoj 简要题意:给定一个长为\(n\)的序列\(\{s_i\}\)与常数\(a,b,c\),序列的一个连续子段\(s_i\)到\(s_j\)的贡献为\(at^2+bt+c\ ...

随机推荐

  1. NOIP2017 列队

    https://www.luogu.org/problemnew/show/P3960 p<=500 50分 模拟 每个人的出队只会影响当前行和最后一列 p<=500,有用的行只有500行 ...

  2. 第二篇:利用shell脚本执行webservice请求——基于soap

    1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

  3. javascript递归函数

    递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数. 这句话理解起来并不难,从概念上出发,给出以下的例子: function foo(){ console.log("函数 foo ...

  4. GIT入门笔记(7)- 修改文件并向版本库提交

    1.修改文件vi readme.txt git status 发现被修改的文件列表git diff readme.txt 2.git add readme.txt git status  --注意gi ...

  5. EasyUI中datagrid的基本用法

    EasyUI中datagrid是最常用的一个控件了,现在整理一下datagrid的基本语法,先展示下页面效果吧,如下图

  6. linux系统命令学习系列-定时任务crontab命令

    上节内容复习: at命令的使用 作业:创建一个任务10分钟后关机 at now+10 minutes at>shutdown at><EOT> 本节我们继续来说例行任务管理命令 ...

  7. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  8. Linux命令-权限

    Linux命令权限   1.新建用户natasha,uid为1000, gid为555, 备注信息为"master" 2.修改natasha用户的家目录为/Natasha 3.查看 ...

  9. html标记语言 --框架

    html标记语言 --框架 六.框架 1.什么是框架 框架将浏览器划分成不同的部分,每一部分加载不同的网页 实现同一浏览器窗口中加载多个页面的效果. 语法格式<frameset>..... ...

  10. jmeter出现卡死或内存溢出的解决方案

    故事背景:在初次使用jmeter的时候,把线程设置较大值的时候,jmeter工具很容易就卡死了,导致每次做压测的时候都无法顺利完成,非常的闹心,通过各种方法寻找解决方案,终于找到了一个比较靠谱的方法, ...