来自FallDream的博客,未经允许,请勿转载,谢谢。


话说这一段时间算是过去了,好久好久之后终于又有联考了  没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量勉强吧。

upd:代码已经更新

A.种树

有一棵二叉树,有点权,你要从节点1出发前往一个节点,如果路上的节点权值和他相等就结束,否则比他小向左,比他大向右,问能不能找到。

需要支持多组询问,单点修改,子树反转

n,m<=10^5

  1. #include<iostream>
  2. #include<cstdio>
  3. #define pa pair<int,int>
  4. #define mp(x,y) make_pair(x,y)
  5. #define MN 100000
  6. #define INF 2000000000
  7. using namespace std;
  8. inline int read()
  9. {
  10. int x = , f = ; char ch = getchar();
  11. while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
  12. while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
  13. return x * f;
  14. }
  15.  
  16. struct data{int lmn,lmx,rmn,rmx;
  17. friend data operator +(data a,data b)
  18. {
  19. data c;
  20. c.lmn=min(a.lmn,b.lmn);
  21. c.rmx=max(a.rmx,b.rmx);
  22. c.lmx=(a.lmx==INF)?b.lmx:(b.lmx==INF?a.lmx:max(a.lmx,b.lmx));
  23. c.rmn=(a.rmn==-INF)?b.rmn:(b.rmn==-INF?a.rmn:min(a.rmn,b.rmn));
  24. return c;
  25. }
  26. void rev()
  27. {
  28. swap(lmn,rmn);if(lmn==-INF) lmn=INF;if(rmn==INF) rmn=-INF;
  29. swap(lmx,rmx);if(rmx==INF) rmx=-INF;if(lmx==-INF)lmx=INF;
  30. }
  31. };
  32. struct Tree{int l,r,rev;data x;}T[MN*+];
  33. int l[MN+],r[MN+],num[MN+],fa[MN+],top[MN+],n,m,w[MN+],dn=,nl[MN+],nr[MN+],size[MN+];
  34. pa p[MN+];
  35.  
  36. void Dfs1(int x)
  37. {
  38. if(l[x]) Dfs1(l[x]),fa[l[x]]=x;
  39. if(r[x]) Dfs1(r[x]),fa[r[x]]=x;
  40. size[x]=size[l[x]]+size[r[x]]+;
  41. }
  42.  
  43. void Dfs2(int x,int tp)
  44. {
  45. if(!x) return;top[x]=tp;num[nl[x]=++dn]=x;
  46. if(size[l[x]]>size[r[x]]) Dfs2(l[x],tp),Dfs2(r[x],r[x]);
  47. else Dfs2(r[x],tp),Dfs2(l[x],l[x]);
  48. p[l[x]]=mp(,w[x]);p[r[x]]=mp(,w[x]);
  49. nr[x]=dn;
  50. }
  51.  
  52. void build(int x,int l,int r)
  53. {
  54. if((T[x].l=l)==(T[x].r=r))
  55. {
  56. int now=num[l];
  57. if(p[now].first==)
  58. T[x].x=(data){p[now].second,p[now].second,-INF,-INF};
  59. else
  60. T[x].x=(data){INF,INF,p[now].second,p[now].second};
  61. return;
  62. }
  63. int mid=l+r>>;
  64. build(x<<,l,mid);build(x<<|,mid+,r);
  65. T[x].x=T[x<<].x+T[x<<|].x;
  66. }
  67.  
  68. inline void Mark(int x)
  69. {
  70. T[x].rev^=;
  71. T[x].x.rev();
  72. }
  73.  
  74. inline void pushdown(int x)
  75. {
  76. Mark(x<<);Mark(x<<|);
  77. T[x].rev=;
  78. }
  79.  
  80. void Modify(int x,int v,pa k)
  81. {
  82. if(T[x].l==T[x].r)
  83. {
  84. if(k.first==^T[x].rev)
  85. T[x].x=(data){k.second,k.second,-INF,-INF};
  86. else
  87. T[x].x=(data){INF,INF,k.second,k.second};
  88. return;
  89. }
  90. if(T[x].rev) pushdown(x);
  91. int mid=(T[x].l+T[x].r)>>;
  92. if(v<=mid) Modify(x<<,v,k);
  93. else if(v>mid) Modify(x<<|,v,k);
  94. T[x].x=T[x<<].x+T[x<<|].x;
  95. }
  96.  
  97. void Reverse(int x,int l,int r)
  98. {
  99. if(T[x].l==l&&T[x].r==r){Mark(x);return;}
  100. int mid=(T[x].l+T[x].r)>>;
  101. if(T[x].rev) pushdown(x);
  102. if(r<=mid) Reverse(x<<,l,r);
  103. else if(l>mid) Reverse(x<<|,l,r);
  104. else Reverse(x<<,l,mid),Reverse(x<<|,mid+,r);
  105. T[x].x=T[x<<].x+T[x<<|].x;
  106. }
  107.  
  108. data Query(int x,int l,int r)
  109. {
  110. if(T[x].l==l&&T[x].r==r) return T[x].x;
  111. if(T[x].rev) pushdown(x);
  112. int mid=(T[x].l+T[x].r)>>;
  113. if(r<=mid) return Query(x<<,l,r);
  114. else if(l>mid) return Query(x<<|,l,r);
  115. else return Query(x<<,l,mid)+Query(x<<|,mid+,r);
  116. }
  117.  
  118. data Solve(int x)
  119. {
  120. data res=(data){INF,INF,-INF,-INF};
  121. for(;x;x=fa[top[x]]) res=res+Query(,nl[top[x]],nl[x]);
  122. return res;
  123. }
  124.  
  125. int main()
  126. {
  127. n=read();m=read();
  128. for(int i=;i<=n;++i) w[i]=read(),l[i]=read(),r[i]=read();
  129. Dfs1();Dfs2(,);p[]=mp(,INF);build(,,n);
  130. for(int i=;i<=m;++i)
  131. {
  132. int op=read(),x=read();
  133. if(op==)
  134. {
  135. int y=read();
  136. if(l[x]) Modify(,nl[l[x]],mp(,y));
  137. if(r[x]) Modify(,nl[r[x]],mp(,y));
  138. w[x]=y;
  139. }
  140. if(op==)
  141. {
  142. if(nl[x]!=nr[x])
  143. Reverse(,nl[x]+,nr[x]);
  144. }
  145. if(op==)
  146. {
  147. data y=Solve(x);
  148. if(w[x]<y.lmn&&w[x]>y.rmx) puts("YES");
  149. else puts("NO");
  150. }
  151. }
  152. return ;
  153. }

把一条边看成一个限制条件,也就是大于或者小于某个值。那么树链剖分之后线段树维护就行了,维护区间小于限制的最大/最小值,大于限制的最大/最小值。

子树反转可以打标记实现。复杂度nlog^2n

代码貌似丢在学校了,端午过后补吧。

B.mark

C.秋之国的盛会

给定两个长度为n的序列ai,bi,可以把a向后推动0到n次。给定c,m,推动k次的时候的费用是$\sum{(\frac{ai}{bi}-c*k-m)^2}$

n<=10^5

求最小费用

把这个式子展开,很容易发现只要能快速求出不同推动状态下的$\sum{\frac{ai}{bi}}$和$\sum{(\frac{ai}{bi})^2}$即可。

把ai数组倒过来并复制一遍,b数组变成1/bi,fft求卷积即可。另一项同理。

复杂度nlogn

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #define pi acos(-1)
  5. #define ld long double
  6. #define MN 262144
  7. using namespace std;
  8. inline int read()
  9. {
  10. int x = , f = ; char ch = getchar();
  11. while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
  12. while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
  13. return x * f;
  14. }
  15.  
  16. int N,n,M;double cost;
  17. struct cp
  18. {
  19. ld r,u;
  20. cp ( double x = ,double y = ) :r(x) , u(y) {}
  21. cp operator + (const cp&y) { return cp(r+y.r,u+y.u);}
  22. cp operator - (const cp&y) { return cp(r-y.r,u-y.u);}
  23. cp operator * (const cp&y) { return cp(r*y.r-u*y.u,r*y.u+u*y.r);}
  24. cp operator * (ld y){return cp(r*y,u*y);}
  25. cp operator / (ld y){return cp(r/y,u/y);}
  26. }A[MN+],B[MN+],C[MN+],a[MN+],b[MN+],c[MN+],w[][MN+];
  27.  
  28. void fft(cp*x,int r)
  29. {
  30. for(int i=,j=;i<N;++i)
  31. {
  32. if(i>j) swap(x[i],x[j]);
  33. for(int l=N>>;(j^=l)<l;l>>=);
  34. }
  35. for(int i=;i<=N;i<<=)for(int j=;j<N;j+=i)for(int k=;k<i>>;++k)
  36. {
  37. cp t=x[j+k+(i>>)]*w[r][N/i*k];
  38. x[j+k+(i>>)]=x[j+k]-t;
  39. x[j+k]=x[j+k]+t;
  40. }
  41. if(r)for(int i=;i<N;++i) x[i]=x[i]/N;
  42. }
  43.  
  44. int main()
  45. {
  46. freopen("party.in","r",stdin);
  47. freopen("party.out","w",stdout);
  48. n=read();M=read();scanf("%lf",&cost);
  49. for(int i=n-;~i;--i) a[i].r=read(),A[i].r=a[i].r*a[i].r;
  50. for(int i=;i<n;++i) b[i].r=(ld)/read(),B[i].r=b[i].r*b[i].r;
  51. for(int i=;i<n;++i) a[i+n]=a[i],A[i+n]=A[i];
  52. for(N=;N<=n<<;N<<=);
  53. w[][]=w[][N]=cp(,);w[][]=w[][N-]=cp(cos(*pi/N),sin(*pi/N));
  54. for(int i=;i<=N;++i) w[][i]=w[][N-i]=w[][i-]*w[][];
  55. fft(a,);fft(b,);fft(A,);fft(B,);
  56. for(int i=;i<N;++i) c[i]=a[i]*b[i],C[i]=A[i]*B[i];
  57. fft(c,);fft(C,);
  58. ld ans=1e99;int mx=;
  59. for(int i=n-;i<n<<;++i)
  60. {
  61. ld j=cost*(i-n+);
  62. if(C[i].r-*c[i].r*(j+M)+(ld)n*(j+M)*(j+M)<ans) mx=i-n+;
  63. ans=min(ans,C[i].r-*c[i].r*(j+M)+(ld)n*(j+M)*(j+M));
  64. }
  65. printf("%.10lf",(double)ans);
  66. return ;
  67. }

[2017/5/28]FJ四校联考的更多相关文章

  1. 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7

    此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...

  2. [四校联考P3] 区间颜色众数 (主席树)

    主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...

  3. 四校联考 tree3

    我们考虑计算红色点与非红色点的对数. 我们用f[i][j]表示i的子树中有j个红色点的概率,将i所有子树合并. 接着我们对于每一个状态,枚举i是红色还是非红色算概率. 同时我们可以求出i和i子树内一个 ...

  4. [3.19FJ四校联考]

    来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会  以后补 B.给定一 ...

  5. szoj461【四校联考0430】挑战

    传送门:(涉及版权忽略) [题解] 我们发现n的范围很小,提示我们可以折半,然后我们就会了O(T2^(n/2)*n)的做法,然而会T. 考虑如何优化.直接排序会多一个log(2^(n/2))也就是n, ...

  6. 三校联考 Day3

    三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...

  7. 【赛时总结】NOIP2018-三校联考1024

    ◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...

  8. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  9. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

随机推荐

  1. verilog学习笔记(0)

    assign赋值语句根本不允许出现在always语句块中 位于begin/end块内的多条阻塞赋值语句是串行执行的; 但是多条非阻塞赋值语句却是并行执行的,这些非阻塞赋值语句都会在其中任何一条语句执行 ...

  2. java方法的定义格式

    Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式为: [修饰符1  修饰符2  …..] 返回值类型  方法名( 形式参数列表 ){ Java 语句;… … … } 例如 ...

  3. JAVA_SE基础——25.面向对象练习

    黑马程序员入学blog ... 昨晚我写了篇面向对象的内存分析,今天我们来做个小练习.. 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数. 名字. 颜色 ,还 具备跑的功能 ...

  4. C++ 异常小记

    catch必定使用拷贝构造函数 如下代码编译不通过,因为拷贝构造被标记delete #include <stdexcept> #include <cstdlib> #inclu ...

  5. CSS基础:块级元素与盒模型

    简介 在 HTML4.01 中,元素通常可以分为块级元素( “Block-level element” ) 和内联元素 ( "Inline-level element" ) 两大类 ...

  6. python全栈开发-re模块(正则表达式)应用(字符串的处理)

    一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串集指定规则:该 ...

  7. 新概念英语(1-125)Tea for two

    Does Susan have tea by herself?A:Can't you come in and have tea now,Peter? Not yet.B:I must water th ...

  8. api-gateway实践(02)新服务网关 - 运行环境

    一.服务网关的运行环境 1.服务配置中心 1.1.服务配置中心前台 前台 http://10.110.17.20/#/login:无源码,德奎部署在10.110.17.20的DockerStatck环 ...

  9. nohup 与 & 的区别

    nohup -- invoke a utility immune to hangups : 运行命令忽略挂起信号 & 是指后台运行: nohup 的功能和& 之间的功能并不相同.其中, ...

  10. python KindEditord

    python 文本编辑器(KindEditord) 1.下载 官网下载:http://kindeditor.net/down.php 本地下载:http://files.cnblogs.com/fil ...