特别行动队

Description

 
  这个好像斜率优化不是一般地明显了啊...只不过要分a的正负两种情况考虑是维护上凸还是下凸
 /**************************************************************
Problem: 1911
User: mjy0724
Language: C++
Result: Accepted
Time:1688 ms
Memory:24248 kb
****************************************************************/ #include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn=;long long INF=;
long long n,a,b,c,sum[maxn],opt[maxn],f[maxn];
long long g(int j,int k){
if (*a*(sum[j]-sum[k])==)
{
if (f[j]+a*sum[j]*sum[j]-b*sum[j]-(f[k]+a*sum[k]*sum[k]-b*sum[k])>) return INF;
else return -INF;
}
return (f[j]+a*sum[j]*sum[j]-b*sum[j]-(f[k]+a*sum[k]*sum[k]-b*sum[k]))/(*a*(sum[j]-sum[k]));
} int main(){
scanf("%lld",&n);
scanf("%lld%lld%lld",&a,&b,&c);
for (int i=;i<=n+;i++) scanf("%lld",&sum[i]),sum[i]+=sum[i-];
int head=,tail=;opt[]=;f[]=;
for (int i=;i<=n+;i++){
if (a>=) while (head<tail&&g(opt[head],opt[head+])>sum[i]) head++;
else while (head<tail&&g(opt[head],opt[head+])<sum[i]) head++;
int j=opt[head];
f[i]=f[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c;
if (a>=) while (head<tail&&g(opt[tail-],opt[tail])<g(opt[tail],i)) tail--;
else while (head<tail&&g(opt[tail-],opt[tail])>g(opt[tail],i)) tail--;
opt[++tail]=i;
}
printf("%lld\n",f[n+]);
return ;
}

patrol 巡逻

Description

 
  首先对于k=1的情况,稍微观察就可以看出来,假设连上这条边之后原图形成了一个由n个点组成的环
  原先经过这些点的边数为2(n-1),如今为n,所以减少的路径为(n-2)
  
  如果是再连一条边的话,如果不与第一条形成的环相交(指有边重合),那么显然规律不变
  如果有边重叠了,设重叠的边数为x,那么原先经过这些点的边数为2(n--1-x),如今为n,所以减少的路径为n-2-2x
  也就是相对于第一种规律,每重叠一条边,减少的路径数-2
  
  那么我们不妨令每条边初始边权为1,第一问可以通过求树的直径得到
  对于第一问经过的路径,边权改为-1,也就实现了每重叠一条边,减少的路径数-2的效果
 
 /**************************************************************
Problem: 1912
User: mjy0724
Language: C++
Result: Accepted
Time:708 ms
Memory:5288 kb
****************************************************************/ #include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn=,maxm=;
int n,k,e,link[maxn],next[maxm],fa[maxm],pos1[maxn],pos2[maxn],w[maxm],ans,sum,s;
void add(int x,int y){
fa[++e]=y;next[e]=link[x];link[x]=e;w[e]=;
fa[++e]=x;next[e]=link[y];link[y]=e;w[e]=;
} int dfs(int p,int fat){
int max1=,max2=;
for (int i=link[p];i;i=next[i]) if (fa[i]!=fat){
int tmp=dfs(fa[i],p)+w[i];
if (tmp>max1){
max2=max1;max1=tmp;pos2[p]=pos1[p];pos1[p]=i;
}else if (tmp>max2) max2=tmp,pos2[p]=i;
}
if (max1+max2>ans) {
ans=max1+max2;s=p;
}
return max1;
} int main(){
scanf("%d%d",&n,&k);
int e=,x,y;
for (int i=;i<n;i++) scanf("%d%d",&x,&y),add(x,y);
dfs(,);sum=ans;
if (k==){printf("%d\n",*(n-)-(ans-));return ;}
for (int i=pos1[s];i;i=pos1[fa[i]]) w[i]=-;
for (int i=pos2[s];i;i=pos1[fa[i]]) w[i]=-;
ans=;dfs(,);
printf("%d\n",*(n-)-(ans-)-(sum-));
return ;
}

signaling 信号覆盖

Description

  我们考虑四边形
  如果是凸的四边形,当对角和>180度的时候能够信号覆盖4个,也就是一个凸四边形能带来2种答案为4的取法
  凹多边形只要取外面的3个点可以带来1种答案为4的取法 剩下的情况答案都为3
  凹多边形的取法与凸多边形的取法是已知一个可以计算出另一个的
  于是我们可以先考虑计算凹多边形的取法
  先枚举位于中间的点,容易看出,剩下三个点构成的三角形能够包含中间点
  相反的,不能包含的就是不能构成凹多边形的,于是我们可以计算这些不包含的方案数
  对所有的点按照中间点进行极角排序,然后单调队列维护每个点能够到达的最远点,使得两点间的所有点的极角差都在180度之间
  可以用叉积简化运算
  最后注意一些乘法加法运算的细节就可以了
 /**************************************************************
    Problem: 1913
    User: mjy0724
    Language: C++
    Result: Accepted
    Time:1996 ms
    Memory:1356 kb
****************************************************************/
 
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define ll long long
#define maxn 1510
struct point{
    ll x,y;
    double angle;  
};
ll n,an,b;
point p[maxn],a[maxn];
ll cross(point p0,point p1,point p2){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
void sortf(int l,int r){
    int i=l,j=r;double mid=p[(l+r) >> ].angle;
    do{
        while (i<r&&p[i].angle<mid) i++;
        while (l<j&&p[j].angle>mid) j--;
        if (i<=j){
            point tmp=p[i];p[i]=p[j];p[j]=tmp;
            i++;j--;
        }
    }while (i<=j);
    if (i<r) sortf(i,r);
    if (l<j) sortf(l,j);
}
ll calc(int x){
    int tot=;
    for (int i=;i<=n;i++) {if (i!=x) p[++tot]=a[i];else p[]=a[i];}
    for (int i=;i<=tot;i++) p[i].angle=atan2(p[i].y-p[].y,p[i].x-p[].x);
    sortf(,tot);
    ll ans=(n-)*(n-)*(n-)/;
    ll tail=,t=;
    for (int i=;i<=tot;i++){   
        while (cross(p[],p[i],p[tail])>=) {tail=tail%tot+;t++;if (tail==i) break;}       
        ans-=t*(t-)/;t--;
    }  
    return ans;
}
 
int main(){
    scanf("%lld",&n);  
    for (int i=;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);   
    ll an=;for (int i=;i<=n;i++) an+=calc(i); 
    ll b=n*(n-)*(n-)*(n-)/-an,c=*b+an,d=(n-)*n*(n-)/;
    printf("%lf",(double)(c*+(d-c)*)/d);
    return ;
}

[BZOJ1911][BZOJ1912][BZOJ1913]APIO2010解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 使用Python 、 go 语言测试rabbitmq的工作机制

    1:在haproxy 和 rabbitmq上安装Python.python2-pip,默认是Python2 yum install -y python python2-pip   2:在haproxy ...

  2. DNS服务器的解析

    ---恢复内容开始--- DNS前言: 英特网作为域名和IP地址相互映射的一个分不式数据库,能够使用户更方便的访问互联网.而不用去记住能够被机器直接读取的IP地址的过程叫做域名解析(或主机名解析).D ...

  3. 【Linux】- 对find,xargs,grep和管道的一些理解

    问题 相信大家都知道在目录中搜索含有固定字符串文件的命令: find . -name '*.py' |xargs grep test 刚开始的时候,我不熟悉xargs命令,所以直接使用的命令是: fi ...

  4. IPv4编址及子网划分

    在讨论IP编址之前,我们需要讨论一下主机与路由器连入网络的方法.一台主机通常只有一条链路链接到网络:当主机中的IP想发送一个数据报时,它就在链路上发送,主机与物理链路之间的边界叫做接口(interfa ...

  5. dom变成jquery对象 先获取dom对象 然后通过$()转换成jquery对象

    dom变成jquery对象   先获取dom对象 然后通过$()转换成jquery对象

  6. HUST1017-Exact Cover

    给出一个\(n\times m\)的01矩阵,每行最多有\(c\)个1,求一个精确覆盖,即选出一些行使得每列有有且仅有一个1.输出方案. 分析 被这个题坑到了啊!!第一次上HUSTOJ做题,不知道没有 ...

  7. 51nod 1503 猪和回文(多线程DP)

    虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...

  8. 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息

    题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...

  9. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

    题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...

  10. 【Java】常用POI生成Excel文档设置打印样式

    package poi_test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi ...