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. 彻底搞懂shell的高级I/O重定向

    本文目录: 1.1 文件描述符(file description,fd) 1.2 文件描述符的复制 1.3 重定向顺序很重要:">file 2>&1"和&quo ...

  2. Python内置函数(45)——ascii

    英文文档: ascii(object) As repr(), return a string containing a printable representation of an object, b ...

  3. HashMap 的底层原理

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  4. JAVA 中一个非常轻量级只有 200k 左右的 RESTful 路由框架

    ICEREST 是一个非常轻量级只有 200k 左右的 RESTful 路由框架,通过 ICEREST 你可以处理 url 的解析,数据的封装, Json 的输出,和传统的方法融合,请求的参数便是方法 ...

  5. 新概念英语(1-47)A cup of coffee

    新概念英语(1-47)A cup of coffee How does Ann like her coffee? A:Do you like coffee, Ann? B:Yes, I do. A:D ...

  6. 记一次将公司网站http换成https

    看了博客园将近一年了,一直都只是在被动的看,总觉得应该写点什么,但是又不知道该写点什么.今天正好公司要把网站由http换成https,那我就顺便记录一下吧. 由于之前没有弄过,所以就面向百度编程. 首 ...

  7. MFC基础

    入门博客:http://www.cnblogs.com/qinfengxiaoyue/category/451679.html 消息机制:http://www.cnblogs.com/qinfengx ...

  8. MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份

    一.视图 -- view 视图:是一个虚报表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 视图有如下特点: 1.视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 ...

  9. DOM节点删除之empty和remove区别

    要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty和remove方法 empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只 ...

  10. python CSS

    CSS 一. css的四种引入方式   1.行内式  2.嵌入式  3. 链接式 将一个.css文件引入到HTML文件中 1 <link href="mystyle.css" ...