特别行动队

Description

 
  这个好像斜率优化不是一般地明显了啊...只不过要分a的正负两种情况考虑是维护上凸还是下凸
  1. /**************************************************************
  2. Problem: 1911
  3. User: mjy0724
  4. Language: C++
  5. Result: Accepted
  6. Time:1688 ms
  7. Memory:24248 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstdlib>
  12. #include<cstring>
  13. const int maxn=;long long INF=;
  14. long long n,a,b,c,sum[maxn],opt[maxn],f[maxn];
  15. long long g(int j,int k){
  16. if (*a*(sum[j]-sum[k])==)
  17. {
  18. if (f[j]+a*sum[j]*sum[j]-b*sum[j]-(f[k]+a*sum[k]*sum[k]-b*sum[k])>) return INF;
  19. else return -INF;
  20. }
  21. 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]));
  22. }
  23.  
  24. int main(){
  25. scanf("%lld",&n);
  26. scanf("%lld%lld%lld",&a,&b,&c);
  27. for (int i=;i<=n+;i++) scanf("%lld",&sum[i]),sum[i]+=sum[i-];
  28. int head=,tail=;opt[]=;f[]=;
  29. for (int i=;i<=n+;i++){
  30. if (a>=) while (head<tail&&g(opt[head],opt[head+])>sum[i]) head++;
  31. else while (head<tail&&g(opt[head],opt[head+])<sum[i]) head++;
  32. int j=opt[head];
  33. f[i]=f[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c;
  34. if (a>=) while (head<tail&&g(opt[tail-],opt[tail])<g(opt[tail],i)) tail--;
  35. else while (head<tail&&g(opt[tail-],opt[tail])>g(opt[tail],i)) tail--;
  36. opt[++tail]=i;
  37. }
  38. printf("%lld\n",f[n+]);
  39. return ;
  40. }

patrol 巡逻

Description

 
  首先对于k=1的情况,稍微观察就可以看出来,假设连上这条边之后原图形成了一个由n个点组成的环
  原先经过这些点的边数为2(n-1),如今为n,所以减少的路径为(n-2)
  
  如果是再连一条边的话,如果不与第一条形成的环相交(指有边重合),那么显然规律不变
  如果有边重叠了,设重叠的边数为x,那么原先经过这些点的边数为2(n--1-x),如今为n,所以减少的路径为n-2-2x
  也就是相对于第一种规律,每重叠一条边,减少的路径数-2
  
  那么我们不妨令每条边初始边权为1,第一问可以通过求树的直径得到
  对于第一问经过的路径,边权改为-1,也就实现了每重叠一条边,减少的路径数-2的效果
 
  1. /**************************************************************
  2. Problem: 1912
  3. User: mjy0724
  4. Language: C++
  5. Result: Accepted
  6. Time:708 ms
  7. Memory:5288 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstdlib>
  12. #include<cstring>
  13. const int maxn=,maxm=;
  14. int n,k,e,link[maxn],next[maxm],fa[maxm],pos1[maxn],pos2[maxn],w[maxm],ans,sum,s;
  15. void add(int x,int y){
  16. fa[++e]=y;next[e]=link[x];link[x]=e;w[e]=;
  17. fa[++e]=x;next[e]=link[y];link[y]=e;w[e]=;
  18. }
  19.  
  20. int dfs(int p,int fat){
  21. int max1=,max2=;
  22. for (int i=link[p];i;i=next[i]) if (fa[i]!=fat){
  23. int tmp=dfs(fa[i],p)+w[i];
  24. if (tmp>max1){
  25. max2=max1;max1=tmp;pos2[p]=pos1[p];pos1[p]=i;
  26. }else if (tmp>max2) max2=tmp,pos2[p]=i;
  27. }
  28. if (max1+max2>ans) {
  29. ans=max1+max2;s=p;
  30. }
  31. return max1;
  32. }
  33.  
  34. int main(){
  35. scanf("%d%d",&n,&k);
  36. int e=,x,y;
  37. for (int i=;i<n;i++) scanf("%d%d",&x,&y),add(x,y);
  38. dfs(,);sum=ans;
  39. if (k==){printf("%d\n",*(n-)-(ans-));return ;}
  40. for (int i=pos1[s];i;i=pos1[fa[i]]) w[i]=-;
  41. for (int i=pos2[s];i;i=pos1[fa[i]]) w[i]=-;
  42. ans=;dfs(,);
  43. printf("%d\n",*(n-)-(ans-)-(sum-));
  44. return ;
  45. }

signaling 信号覆盖

Description

  我们考虑四边形
  如果是凸的四边形,当对角和>180度的时候能够信号覆盖4个,也就是一个凸四边形能带来2种答案为4的取法
  凹多边形只要取外面的3个点可以带来1种答案为4的取法 剩下的情况答案都为3
  凹多边形的取法与凸多边形的取法是已知一个可以计算出另一个的
  于是我们可以先考虑计算凹多边形的取法
  先枚举位于中间的点,容易看出,剩下三个点构成的三角形能够包含中间点
  相反的,不能包含的就是不能构成凹多边形的,于是我们可以计算这些不包含的方案数
  对所有的点按照中间点进行极角排序,然后单调队列维护每个点能够到达的最远点,使得两点间的所有点的极角差都在180度之间
  可以用叉积简化运算
  最后注意一些乘法加法运算的细节就可以了
  1. /**************************************************************
  2.     Problem: 1913
  3.     User: mjy0724
  4.     Language: C++
  5.     Result: Accepted
  6.     Time:1996 ms
  7.     Memory:1356 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstdlib>
  12. #include<cstring>
  13. #include<cmath>
  14. #include<algorithm>
  15. #include<iostream>
  16. #define ll long long
  17. #define maxn 1510
  18. struct point{
  19.     ll x,y;
  20.     double angle;  
  21. };
  22. ll n,an,b;
  23. point p[maxn],a[maxn];
  24. ll cross(point p0,point p1,point p2){
  25.     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
  26. }
  27. void sortf(int l,int r){
  28.     int i=l,j=r;double mid=p[(l+r) >> ].angle;
  29.     do{
  30.         while (i<r&&p[i].angle<mid) i++;
  31.         while (l<j&&p[j].angle>mid) j--;
  32.         if (i<=j){
  33.             point tmp=p[i];p[i]=p[j];p[j]=tmp;
  34.             i++;j--;
  35.         }
  36.     }while (i<=j);
  37.     if (i<r) sortf(i,r);
  38.     if (l<j) sortf(l,j);
  39. }
  40. ll calc(int x){
  41.     int tot=;
  42.     for (int i=;i<=n;i++) {if (i!=x) p[++tot]=a[i];else p[]=a[i];}
  43.     for (int i=;i<=tot;i++) p[i].angle=atan2(p[i].y-p[].y,p[i].x-p[].x);
  44.     sortf(,tot);
  45.     ll ans=(n-)*(n-)*(n-)/;
  46.     ll tail=,t=;
  47.     for (int i=;i<=tot;i++){   
  48.         while (cross(p[],p[i],p[tail])>=) {tail=tail%tot+;t++;if (tail==i) break;}       
  49.         ans-=t*(t-)/;t--;
  50.     }  
  51.     return ans;
  52. }
  53.  
  54. int main(){
  55.     scanf("%lld",&n);  
  56.     for (int i=;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);   
  57.     ll an=;for (int i=;i<=n;i++) an+=calc(i); 
  58.     ll b=n*(n-)*(n-)*(n-)/-an,c=*b+an,d=(n-)*n*(n-)/;
  59.     printf("%lf",(double)(c*+(d-c)*)/d);
  60.     return ;
  61. }

[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. 经典SQL语句基础50题

    很全面的sql语句大全.都是很基础性的,今天特意整理了下.大家互相学习.大家有好的都可以分享出来,  分享也是一种快乐. --创建数据库 create database SQL50 --打开SQL50 ...

  2. v-for & duplicate key bug

    v-for & duplicate key bug vue warn & v-for & duplicate key bug <span class="audi ...

  3. Java线程间怎么实现同步

    1.Object#wait(), Object#notify()让两个线程依次执行 /** * 类AlternatePrintDemo.java的实现描述:交替打印 */ class NumberPr ...

  4. Vue 取出记录数后,页面显示刚开始显示部分,点击更多显示全部

    实例的实现,是使用computed计算属性,还有对数组使用.slice函数,不改变原数据对象. <div id="app"> <ul> <li v-f ...

  5. HDU4802_GPA

    水题. #include <iostream> #include <cstdio> #include <cstring> using namespace std; ...

  6. bzoj4770 图样

    题意 n个点的完全图,每个点的点权是在m位的二进制数中随机选取的.每条边的边权是两个点的点权的异或值. 问最小生成树的边权和的期望.模一个质数输出. 分析 考试的时候写这个题,然后期望得分100-&g ...

  7. 自动化生成html报告

    package Utils; import java.io.File; import java.util.Date; import org.apache.commons.lang3.time.Date ...

  8. QoS专题-第3期-QoS实现之报文简单分类与标记

    QoS实现之报文简单分类与标记 上一期专题我们讲到,MQC中的流分类可以实现报文的分类,流行为可以对报文进行重标记,从而实现对流量的精细化差分服务.而优先级映射则可以根据802.1p优先级.DSCP优 ...

  9. Qt的编程风格与规范

    Qt的编程风格与规范 来源: http://blog.csdn.net/qq_35488967/article/details/70055490 参考资料: https://wiki.qt.io/Qt ...

  10. 转:SVM与SVR支持向量机原理学习与思考(一)

    SVM与SVR支持向量机原理学习与思考(一) 转:http://tonysh-thu.blogspot.com/2009/07/svmsvr.html 弱弱的看了看老掉牙的支持向量机(Support ...