[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\ ...
随机推荐
- javascript 腾讯ABS云平台面试题及面试经历
既然说到面试前端肯定是Javascript各种问,只好各种答. 面试题肯定离不了,最近热门的Vue.js,React.js,Angular.js,Gulp,Webpack还有各种Js问题,还有令人头痛 ...
- python之路--day11---迭代器和生成器
迭代: 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 为什么要有迭代器: 数据类型的取值,字符串,列表,元组依靠索引可以取值,但是字典,集合,文件这些数据类型无法 ...
- python端口扫描用多线程+线程安全的队列+Thread类实现
用线程安全的队列Queue实现扫描端口数据存储 用多线程扫描端口 用Thread类实现程序组织 #coding:utf-8 import sys import socket import sys im ...
- js 防止重复点击
1.添加flag 适用于ajax 表单提交,提交之前flag = false , 提及中,true ,提交后false 2.事件重复点击: <script> var throttle = ...
- 解决yii2中 Class yii/web/JsonParser does not exist, ReflectionException问题
最近在调试RESTful API示例时,出现以下错误: { "name": "Exception", "message": "Cl ...
- Code::Blocks出现64-Bit mode not compled in解决方法
原因是:Settings->compilter你选了Target x86 _64(64bit),选择Target x86 _32(32bit)即可 废了老半天劲才找到原因,希望能让朋友们少走弯路
- CSS基础:块级元素与盒模型
简介 在 HTML4.01 中,元素通常可以分为块级元素( “Block-level element” ) 和内联元素 ( "Inline-level element" ) 两大类 ...
- SQL查询语句练习
最近在学习SQL嘛,所以各个地方找题目来练手,毕竟现在能离得开数据库么? Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C ...
- git 添加管理成员
git 添加管理成员 登录git后的样子: 具体操作流程看截图和说明 : * 图中1:打开设置面板: * 图中2:打开成员面板: * 图中3:添加成员功能标签: * 图中4:添加的成员,这里会弹出 ...
- POJ-3295 Tautology---栈+表达式求值
题目链接: https://vjudge.net/problem/POJ-3295 题目大意: 输入由p.q.r.s.t.K.A.N.C.E共10个字母组成的逻辑表达式WFF 其中 ...