2018.8.7 正睿暑期集训营 Day4

时间:5h(实际)

期望得分:...

实际得分:...

_(:зゝ∠)_

比赛链接

A 世界杯(贪心)

题目链接

设法国队赔率为x,克罗地亚赔率为y,则一个人会在x>=1/p时下注法国队(\(x*pi*ai\geq ai\))。

那么按1/p从小到大排序,下注法国的一定是一个前缀。同理,下注克罗地亚队的一定是一个后缀(1/(1-p))。

一个人下注相当于得到ai收益,但是可能会付 \(赔率*ai\) 的代价。当x增大时,法国赢了时代价就会变大,要让y适当增大来获得收益。

即y随x增大而增大。可以枚举x。

设投法国收益为w1,代价cost1=w1x;克罗地亚收益w2,代价cost2=w2x。

某种情况的收益是min(w1-cost2, w2-cost1),x增大w1,cost1增大,要最大化min就要增大w2,即y一定单调增大。

三分套三分套二分为什么WA呢。。

  1. //365ms 16532kb(rank2 800+ms 学了一波double read() 233)
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 400000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. const int N=1e6+5;
  9. int n;
  10. char IN[MAXIN],*SS=IN,*TT=IN;
  11. struct Node
  12. {
  13. double a,p;
  14. bool operator <(const Node &node)const{
  15. return p>node.p;
  16. }
  17. }A[N];
  18. inline double read()
  19. {
  20. double x=0,y=0.1; register char c=gc();
  21. for(; !isdigit(c)&&c!='.'; c=gc());
  22. for(; isdigit(c); x=x*10+c-'0',c=gc());
  23. for(c=='.'&&(c=gc()); isdigit(c); x+=(c-'0')*y,y*=0.1,c=gc());
  24. return x;
  25. }
  26. int main()
  27. {
  28. // freopen("a.in","r",stdin);
  29. // freopen("a.out","w",stdout);
  30. n=read();
  31. for(int i=1; i<=n; ++i) A[i].a=read(), A[i].p=read();//scanf("%lf%lf",&A[i].a,&A[i].p);
  32. std::sort(A+1,A+1+n);
  33. double Ans=0,s1=0,s2=A[n].a/*初始肯定有的啊(or 0)*/,x,y1,y2;
  34. for(int i=1,j=n; i<=n; ++i)
  35. {
  36. s1+=A[i].a, x=1.0/A[i].p;
  37. y1=1.0/(1-A[j].p);
  38. while(j>1)
  39. {
  40. y2=1.0/(1-A[j-1].p);
  41. if(std::min(s1-(y1-1)*s2,s2-(x-1)*s1)<std::min(s1-(y2-1)*(s2+A[j-1].a),s2+A[j-1].a-(x-1)*s1))
  42. y1=y2, s2+=A[--j].a;
  43. else break;
  44. }
  45. Ans=std::max(Ans,std::min(s1-(y1-1)*s2,s2-(x-1)*s1));
  46. }
  47. printf("%.6lf\n",Ans);
  48. return 0;
  49. }

B 数组(线段树)

题目链接

暴力的话,枚举每个左端点,然后找到\(\min\{nxt_j\}-1\),加上这段区间长度。(枚举右端点,求\(max\{las_j\}+1\)也一样)

如果不考虑区间内其它数的限制(只考虑本身重复的限制),如果我们能维护每个位置上次出现的位置\(las\)(set就可以),以\(i\)为右端点的区间长度就为\(i-las+1\)。

如果是算非法区间个数的话,\(las\)就是\(i\)的答案,so直接算非法的好了(这样枚举右端点更方便些)。

现在考虑区间\([las_i,i-1]\)内其它数对\(i\)延伸距离的限制,记其中最靠右的它第二次(从右往左)出现的位置为\(right\)(就是\(\max\{las_j\}\))。

若\(right<las_i\),则答案就是\(las_i\);否则会将\(i\)拦住,\(i\)的答案就为\(right\)。

对于一个区间\(i\),答案的更新同理,只是在\(right[before\ i]<right[i]\)时,答案的更新可能分成几部分,一部分会被\(right[before\ i]\)限制,一部分其区间本身限制。递归即可。

用线段树维护。

记\(sum[rt](l,r)\)为只考虑\([l,r]\)中数的限制,右端点\(i\in [l,r]\)时它们的贡献和,\(sum[1]\)就是全局非法区间数。

复杂度\(O(n\log^2n)\)。

  1. #include <set>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 300000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. typedef long long LL;
  9. const int N=1e5+5;
  10. int n,A[N],las[N],las_v[N];
  11. std::set<int> st[N];
  12. char IN[MAXIN],*SS=IN,*TT=IN;
  13. struct Segment_Tree
  14. {
  15. #define ls rt<<1
  16. #define rs rt<<1|1
  17. #define lson l,m,rt<<1
  18. #define rson m+1,r,rt<<1|1
  19. #define S N<<2
  20. int right[S];
  21. LL ans[S];
  22. LL Calc(int l,int r,int rt,int Right)
  23. {
  24. if(l==r) return std::max(right[rt],Right);
  25. int m=l+r>>1;
  26. if(right[ls]<Right) return 1ll*(m-l+1)*Right+Calc(rson,Right);
  27. return ans[rt]-ans[ls]+Calc(lson,Right);//部分左区间和整个右区间受限制,右区间此时的答案是ans[rt]-ans[ls]而不是ans[rs](rt已经限制住rs了)。
  28. }
  29. inline void Update(int l,int r,int m,int rt)
  30. {//考虑左区间对右区间的限制
  31. if(right[ls]>=right[rs]) right[rt]=right[ls], ans[rt]=ans[ls]+1ll*(r-m)*right[ls];
  32. else right[rt]=right[rs], ans[rt]=ans[ls]+Calc(m+1,r,rs,right[ls]);
  33. }
  34. void Build(int l,int r,int rt)
  35. {
  36. if(l==r) {ans[rt]=right[rt]=las[l]; return;}
  37. int m=l+r>>1;
  38. Build(lson), Build(rson), Update(l,r,m,rt);
  39. }
  40. void Modify(int l,int r,int rt,int p,int v)
  41. {
  42. if(l==r) {ans[rt]=right[rt]=v; return;}
  43. int m=l+r>>1;
  44. if(p<=m) Modify(lson,p,v);
  45. else Modify(rson,p,v);
  46. Update(l,r,m,rt);
  47. }
  48. }T;
  49. inline int read()
  50. {
  51. int now=0;register char c=gc();
  52. for(;!isdigit(c);c=gc());
  53. for(;isdigit(c);now=now*10+c-'0',c=gc());
  54. return now;
  55. }
  56. void Modify(int val,int pos)
  57. {
  58. static std::set<int>::iterator pre,nxt;
  59. int vp=A[pos];
  60. pre=st[vp].lower_bound(pos), --pre;
  61. nxt=st[vp].upper_bound(pos);
  62. if(nxt!=st[vp].end()) T.Modify(1,n,1,*nxt,*pre);
  63. st[vp].erase(pos);
  64. pre=nxt=st[val].upper_bound(pos), --pre;
  65. st[val].insert(pos), T.Modify(1,n,1,pos,*pre);
  66. if(nxt!=st[val].end()) T.Modify(1,n,1,*nxt,pos);
  67. A[pos]=val;
  68. }
  69. int main()
  70. {
  71. // freopen("b.in","r",stdin);
  72. // freopen("my.out","w",stdout);
  73. n=read();
  74. for(int i=1; i<=n; ++i) st[i].insert(0);
  75. for(int i=1,a; i<=n; ++i)
  76. a=A[i]=read(), st[a].insert(i), las[i]=las_v[a], las_v[a]=i;
  77. T.Build(1,n,1); LL tot=1ll*n*(n+1)>>1;
  78. for(int Q=read(); Q--; )
  79. if(!read()) printf("%lld\n",tot-T.ans[1]);
  80. else Modify(read(),read());
  81. return 0;
  82. }

C 淘汰赛

题目链接

生成函数+倍增+常系数线性递推。。


考试代码

A

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define INF 1e14
  4. #define eps (1e-8)
  5. typedef long double ld;
  6. const int N=1e6+5;
  7. //#define double ld
  8. int n;
  9. struct Node
  10. {
  11. double a,p;
  12. bool operator <(const Node &x)const{
  13. return p>x.p;
  14. }
  15. }A[N];
  16. double sum[N],sum2[N],Ans,W1,C1,W2,C2;
  17. void Calc1(double x)
  18. {
  19. int l=1,r=n,mid,ans=0;
  20. while(l<=r)
  21. {
  22. mid=l+r>>1;
  23. if((ld)x*A[mid].p>=1) ans=mid, l=mid+1;
  24. else r=mid-1;
  25. }
  26. W1=sum[ans], C1=W1-x*sum[ans];
  27. }
  28. void Calc2(double x)
  29. {
  30. int l=1,r=n,mid,ans=0;
  31. while(l<=r)
  32. {
  33. mid=l+r>>1;
  34. if((ld)x*(1-A[mid].p)>=1) ans=mid, r=mid-1;
  35. else l=mid+1;
  36. }
  37. W2=sum2[ans], C2=W2-x*sum2[ans];
  38. }
  39. inline double Get_Ans(double x)
  40. {
  41. Calc2(x); Ans=std::max(Ans,std::min(C1+W2,C2+W1));
  42. return std::min(C1+W2,C2+W1);
  43. }
  44. inline double Get_Ans2(double x)
  45. {
  46. Calc1(x);
  47. double l=0,r=1e7,lmid,rmid;
  48. while(r-l>eps)
  49. {
  50. lmid = l+(r-l)/3, rmid = r-(r-l)/3;
  51. if(Get_Ans(lmid)>Get_Ans(rmid)) r=rmid;
  52. else l=lmid;
  53. }
  54. return Get_Ans(l);
  55. }
  56. int main()
  57. {
  58. // freopen("a2.in","r",stdin);
  59. // freopen("a.out","w",stdout);
  60. scanf("%d",&n);
  61. for(int i=1; i<=n; ++i) scanf("%lf%lf",&A[i].a,&A[i].p);
  62. std::sort(A+1,A+1+n);
  63. for(int i=1; i<=n; ++i) sum[i]=sum[i-1]+A[i].a;
  64. for(int i=n; i; --i) sum2[i]=sum2[i+1]+A[i].a;
  65. double l=0,r=1e7,lmid,rmid;
  66. while(r-l>eps)
  67. {
  68. lmid = l+(r-l)/3, rmid = r-(r-l)/3;
  69. if(Get_Ans2(lmid)>Get_Ans2(rmid)) r=rmid;
  70. else l=lmid;
  71. }
  72. printf("%.6lf\n",Ans);
  73. return 0;
  74. }

B

  1. #include <set>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 400000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. typedef long long LL;
  9. const int N=1e5+5;
  10. int n,A[N];
  11. char IN[MAXIN],*SS=IN,*TT=IN;
  12. inline int read()
  13. {
  14. int now=0;register char c=gc();
  15. for(;!isdigit(c);c=gc());
  16. for(;isdigit(c);now=now*10+c-'0',c=gc());
  17. return now;
  18. }
  19. namespace Subtask1
  20. {
  21. bool vis[N];
  22. inline void Query()
  23. {
  24. vis[A[n+1]]=1;//n+1
  25. LL res=0;
  26. for(int i=1; i<=n; ++i)
  27. {
  28. int j=i;
  29. while(!vis[A[j]]) vis[A[j++]]=1;
  30. res+=j-i;
  31. for(int k=i; k<j; ++k) vis[A[k]]=0;
  32. }
  33. printf("%lld\n",res);
  34. }
  35. void Main()
  36. {
  37. int Q=read();
  38. for(int i=1; i<=Q; ++i)
  39. if(!read()) Query();
  40. else A[read()]=read();
  41. }
  42. }
  43. namespace Subtask2
  44. {
  45. std::set<int> pos[1005];
  46. }
  47. int main()
  48. {
  49. // freopen("b2.in","r",stdin);
  50. // freopen("my.out","w",stdout);
  51. n=read();
  52. for(int i=1; i<=n; ++i) A[i]=read();
  53. if(n<=1000) {Subtask1::Main(); return 0;}
  54. return 0;
  55. }

C

  1. #include <cstdio>
  2. #include <cassert>
  3. #include <algorithm>
  4. #define gc() getchar()
  5. #define mod (998244353)
  6. typedef long long LL;
  7. const int N=1e6+5;
  8. LL n; int m;
  9. namespace Subtask1
  10. {
  11. #define N 1005
  12. int f[N][N],ans[N][N],pw[N];
  13. bool vis[N][N];
  14. #undef N
  15. int DFS(int n,int m)
  16. {
  17. if(!m) return n==1;
  18. // if(n<pw[m]) return 0;
  19. if(vis[n][m]) return ans[n][m];
  20. LL res=0;
  21. for(int i=pw[m-1],lim=n>>1; i<=lim; ++i)
  22. res+=1ll*DFS(i,m-1)*f[n][i]%mod;
  23. vis[n][m]=1;
  24. return ans[n][m]=(int)(res%mod);
  25. }
  26. void Main()
  27. {
  28. for(int i=0; i<=m; ++i) pw[i]=1<<i;
  29. f[2][1]=f[3][1]=1;
  30. for(int i=4; i<=n; ++i)
  31. for(int j=1,lim=i>>1; j<=lim; ++j)
  32. f[i][j]=f[i-1][j]+f[i-2][j-1], f[i][j]>=mod&&(f[i][j]-=mod);
  33. printf("%d\n",DFS(n,m));
  34. }
  35. }
  36. int main()
  37. {
  38. // freopen("c2.in","r",stdin);
  39. // freopen(".out","w",stdout);
  40. scanf("%lld%d",&n,&m);
  41. if(n<=1003) {Subtask1::Main(); return 0;}
  42. putchar('0');//输出1 13分。。
  43. return 0;
  44. }

8.7 正睿暑期集训营 Day4的更多相关文章

  1. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  2. 8.6 正睿暑期集训营 Day3

    目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...

  3. 8.9 正睿暑期集训营 Day6

    目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...

  4. 8.8 正睿暑期集训营 Day5

    目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...

  5. 8.5 正睿暑期集训营 Day2

    目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...

  6. 8.4 正睿暑期集训营 Day1

    目录 2018.8.4 正睿暑期集训营 Day1 A 数对子 B 逆序对 C 盖房子 考试代码 A B C 2018.8.4 正睿暑期集训营 Day1 时间:4.5h(实际) 期望得分:30+50+3 ...

  7. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  8. 8.9 正睿暑期集训营 Day6 C 风花雪月(DP)

    题目链接 完整比赛在这儿. 杜老师tql . 求期望要抽卡的次数,也就是求期望经历了多少不满足状态.而每个不满足的状态对答案的贡献为\(1\),所以可以直接算概率.即\(Ans=\sum_{不满足状态 ...

  9. 正睿暑期培训day4考试

    链接 A 求出来到每座山的距离后,就可以计算出每只猫等待的时间与出发时间的关系. 如果出发时间为\(x\),求出来只猫的等待时间.这里用\(b_i\)表示第i只猫的等待时间.然后我们将这些时间排序.问 ...

随机推荐

  1. 转iOS UIAppearance使用详解

    iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下 ...

  2. python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类

    自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...

  3. Java 调用 groovy 脚本文件,groovy 访问 MongoDB

    groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...

  4. Docker 入门 第二部分: 容器

    目录 Docker 入门 第二部分: 容器 先决条件 介绍 你的新开发环境 使用 Dockerfile 定义一个容器 Dockerfile 应用本身 requirements.txt app.py 构 ...

  5. Java面试题系列(二)Java内存模型

    在进行Java编程时,我们通常需要通过new创建一个对象的实例.就比如有一个People的类,那么创建一个People的实例:People w_people = new People(); 此时,ne ...

  6. javascript有关this的那些事(某渣提出的问题)

    某人提出 请教下谁能解释下这个值var name = "The Window";        var object = {            name: "My O ...

  7. javascript使用事件委托

    事件委托是javascript中一个很重要的概念,其基本思路就是利用了事件冒泡的机制,给上级(父级)元素触发事件的dom对象上绑定一个处理函数.在当有需要很多dom对象要绑定事件的情况下,可以使用事件 ...

  8. JavaScript继承详解(四)

    在本章中,我们将分析Douglas Crockford关于JavaScript继承的一个实现 - Classical Inheritance in JavaScript. Crockford是Java ...

  9. Gson学习记录

    Gson是Google开发来用来序列化和反序列化json格式数据的java库,他最大的特点就是对复杂类型的支持度高,可以完美解决java泛型问题,这得益于他对泛型类型数据的特殊处理,他的缺点就是速度慢 ...

  10. FTP主动/被动原理

    FTP 主动模式 1.客户端用大于1024的高位端口发起初始化连接到vsftp服务器的21端口 2.vsftp服务器的21端口主动与客户端大于1024的高位端口建立控制连接 3.vsftp服务器的20 ...