[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\ ...
随机推荐
- python day1 基本语法作业
一.过7 start =1 while start<=10: if start !=7: print(start) start +=1 二.100以内的和 sum = 0 start = 1 w ...
- [USACO4.1]麦香牛块Beef McNuggets
https://www.luogu.org/problemnew/show/P2737 给出n个数ai,求这n个数不能累加出的最大的数 最大的数无限大或能凑出所有的自然数则输出0 n<=10,a ...
- nyoj 阶乘0
阶乘的0 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N< ...
- LeetCode & Q35-Search Insert Position-Easy
Array Binary Search Description: Given a sorted array and a target value, return the index if the ta ...
- 第一次制作和使用图标字体-IcoMoon
开题:之前就有所耳闻,最近两天第一次运用到图标字体.刚开始嘛,一脸懵逼的状态.成功运用之后就来记录一下使用过程咯! 1. 打开在线生成工具:https://icomoon.io/app/#/selec ...
- python 人工智能资源推荐
原创 2017-06-05 玄魂工作室 玄魂工作室 我翻了翻我自己曾经看过的书,还是放弃了推荐.原因很简单,我对这个领域并不是很熟悉,我来推荐资源有点误人子弟.so,简单推点其他人建议给我的内容,希望 ...
- 使用 HttpClient 请求 Web Api
1.获取 post 请求 body 内容 [HttpPost] public string GetId() { //如果方法参数里面有 [FromBody],则需要重新调整内容指针,再进行读取. // ...
- js控制表格实时编辑
点击添加,在表格的最后一行添加一行表单元素,右侧按钮变为保存和取消.(点击保存,数据用ajax无刷新添加到界面,点击取消,取消此行的添加.)点击编辑,在本行改为表单,带有原来的值,右侧按钮变为确认和取 ...
- SpringCloud的DataRest(四)restful特性展示
一.get - list - http://10.110.20.16:8391/BusiSys/company?page=0&size=5&sort=comp_id,asc 二.pos ...
- python入门(9)字符串和编码
python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...