A. Album of Numbers

设$cnt[i]$表示数字$i$的个数,则$ans=\frac{\sum_{i} i\times cnt[i]\prod_{j>i}(cnt[j]+1)}{\prod_{i}(cnt[i]+1)-1}$。

不妨忽略分母的减$1$,那么只需要维护出答案以及$cnt+1$的乘积即可得到最终答案。

用线段树维护每个区间内的答案以及$cnt+1$的乘积,注意到乘积很大时对答案的影响变化很小,所以可以直接对$10^{100}$取$\min$。

时间复杂度$O(n\log n)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=555555;
  5. const double inf=1e100;
  6. int m,n,i,a[N],b[N];char op[N][9];
  7. double s[N],p[N];
  8. void build(int x,int a,int b){
  9. p[x]=1;
  10. if(a==b)return;
  11. int mid=(a+b)>>1;
  12. build(x<<1,a,mid);
  13. build(x<<1|1,mid+1,b);
  14. }
  15. void change(int x,int a,int b,int c,int o){
  16. if(a==b){
  17. p[x]+=o;
  18. s[x]=::a[a]*(p[x]-1)/p[x];
  19. return;
  20. }
  21. int mid=(a+b)>>1;
  22. if(c<=mid)change(x<<1,a,mid,c,o);else change(x<<1|1,mid+1,b,c,o);
  23. p[x]=min(p[x<<1]*p[x<<1|1],inf);
  24. s[x]=s[x<<1]+s[x<<1|1]/p[x<<1];
  25. }
  26. int main(){
  27. scanf("%d",&m);
  28. for(i=1;i<=m;i++){
  29. scanf("%s%d",op[i],&b[i]);
  30. a[i]=b[i];
  31. }
  32. sort(a+1,a+m+1);
  33. for(i=1;i<=m;i++)if(i==1||a[i]!=a[i-1])a[++n]=a[i];
  34. build(1,1,n);
  35. for(i=1;i<=m;i++){
  36. change(1,1,n,lower_bound(a+1,a+n+1,b[i])-a,op[i][0]=='+'?1:-1);
  37. printf("%.15f\n",s[1]*(1.0+1.0/(p[1]-1)));
  38. }
  39. }

  

B. Well Off

对$x[i]$和$-x[i]$建图,若$a+b>0$,则连边$a>-b$,$b>-a$,拓扑排序判断是否存在环。

  1. #include<cstdio>
  2. const int N=200010,M=1000010;
  3. int n,m,i,g[N],v[M],nxt[M],ed,d[N],q[N],h,t;
  4. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;d[y]++;}
  5. inline int read(){
  6. char s[9];
  7. int x;
  8. scanf("%s%d",s,&x);
  9. x--;
  10. x<<=1;
  11. if(s[0]=='-')x++;
  12. return x;
  13. }
  14. int main(){
  15. scanf("%d%d",&n,&m);
  16. while(m--){
  17. int x=read();
  18. int y=read();
  19. add(x,y^1);
  20. add(y,x^1);
  21. }
  22. n*=2;
  23. for(h=1,i=0;i<n;i++)if(!d[i])q[++t]=i;
  24. while(h<=t){
  25. int x=q[h++];
  26. for(i=g[x];i;i=nxt[i])if(!(--d[v[i]]))q[++t]=v[i];
  27. }
  28. puts(t<n?"NIE":"TAK");
  29. }

  

C. Accurate Shots (8Mb TL!)

若$m>\sqrt{n}$,则可以直接枚举$m$的所有倍数暴力判断。

否则考虑折半爆搜,枚举左半边对$m$的余数,就知道右半边对$m$的余数,分别枚举出所有解即可。

时间复杂度$O(\sqrt{n})$。

D. Prom

排序后双指针。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=250010;
  5. int n,m,lim,i,j,k,a[N],b[N];long long ans;
  6. int main(){
  7. scanf("%d%d%d",&n,&m,&lim);
  8. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  9. for(i=1;i<=m;i++)scanf("%d",&b[i]);
  10. sort(a+1,a+n+1);
  11. sort(b+1,b+m+1);
  12. for(i=j=k=1;i<=n;i++){
  13. while(j<=m&&b[j]<=a[i]+lim)j++;
  14. while(k<=m&&b[k]<a[i]-lim)k++;
  15. ans+=j-k;
  16. }
  17. printf("%lld",ans);
  18. }

  

E. Impressive Graphs

在$O(nk\log n)$的时间里维护出杨氏图表的前$k$行,则最终个数即为前$k$行的元素个数。

输出方案部分留坑。

F. Pen

用栈进行括号匹配,栈为空时往左补充,最后将栈中未配对左括号配上右括号。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. using namespace std;
  5. const int N=1000010;
  6. int n,i,t,cb;char a[N],q[N],b[N];
  7. void NO(){
  8. puts("NIE");
  9. exit(0);
  10. }
  11. int main(){
  12. scanf("%s",a+1);
  13. n=strlen(a+1);
  14. for(i=1;i<=n;i++){
  15. if(a[i]=='('||a[i]=='{'||a[i]=='['){
  16. q[++t]=a[i];
  17. }
  18. if(a[i]==')'){
  19. if(t){
  20. if(q[t]=='(')t--;
  21. else NO();
  22. }else{
  23. b[++cb]='(';
  24. }
  25. }
  26. if(a[i]=='}'){
  27. if(t){
  28. if(q[t]=='{')t--;
  29. else NO();
  30. }else{
  31. b[++cb]='{';
  32. }
  33. }
  34. if(a[i]==']'){
  35. if(t){
  36. if(q[t]=='[')t--;
  37. else NO();
  38. }else{
  39. b[++cb]='[';
  40. }
  41. }
  42. }
  43. for(i=cb;i;i--)putchar(b[i]);
  44. for(i=1;i<=n;i++)putchar(a[i]);
  45. for(i=t;i;i--){
  46. if(q[i]=='(')putchar(')');
  47. if(q[i]=='[')putchar(']');
  48. if(q[i]=='{')putchar('}');
  49. }
  50. }

  

G. Board Game

将颜色分治,每次对于两边的颜色分别求出凸包,然后双指针求闵可夫斯基和的凸包。

时间复杂度$O(n\log n)$。

H. Scouts

$f[i][j]$表示仅考虑$[i,j]$区间的答案,则

$f[i][j]=\min(\max(f[i][k-1],f[k+1][j])+a[k]),i\leq k\leq j$

维护出$\max$的分界点后用一堆线段树维护即可。

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

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=2005;
  4. const ll inf=1LL<<60;
  5. int M,n,i,j,a[N],g;
  6. ll f[N][N];
  7. inline void up(ll&a,ll b){if(a>b)a=b;}
  8. struct ZKW{
  9. ll v[4100];
  10. inline void ask(int x,int y,ll&t){
  11. if(x>y)return;
  12. for(x+=M-1,y+=M+1;x^y^1;x>>=1,y>>=1){
  13. if(~x&1)up(t,v[x^1]);
  14. if(y&1)up(t,v[y^1]);
  15. }
  16. }
  17. inline void ins(int x,ll y){for(x+=M;x;x>>=1)up(v[x],y);}
  18. inline void build(){for(int i=1;i<=n+M;i++)v[i]=inf;}
  19. }T1[N],T2[N];
  20. inline void add(int x,int y){
  21. if(x>1)T1[y].ins(x-1,f[x][y]+a[x-1]);
  22. if(y<n)T2[x].ins(y+1,f[x][y]+a[y+1]);
  23. }
  24. int main(){
  25. scanf("%d",&n);
  26. for(M=1;M<n+2;M<<=1);
  27. for(i=1;i<=n;i++)scanf("%d",&a[i]),T1[i].build(),T2[i].build();
  28. for(i=1;i<=n;i++)add(i,i-1);
  29. for(i=1;i<=n;i++)f[i][i]=a[i],add(i,i);
  30. for(i=n;i;i--)for(g=i,j=i+1;j<=n;j++){
  31. while(g<=j&&f[i][g-1]<f[g+1][j])g++;
  32. f[i][j]=inf;
  33. T1[j].ask(i,g-1,f[i][j]);
  34. T2[i].ask(g,j,f[i][j]);
  35. add(i,j);
  36. }
  37. printf("%lld",f[1][n]);
  38. }

  

I. Insects

最大权闭合子图。

  1. #include<cstdio>
  2. const int N=2010,inf=1e9;
  3. struct E{int t,f;E*nxt,*pair;}*g[N],*d[N],pool[500000],*cur=pool;
  4. int n,m,i,j,k,x,y,S,T,h[N],gap[N],ans;
  5. inline void add(int s,int t,int f){
  6. E*p=cur++;p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
  7. p=cur++;p->t=s;p->f=0;p->nxt=g[t];g[t]=p;
  8. g[s]->pair=g[t];g[t]->pair=g[s];
  9. }
  10. inline int min(int a,int b){return a<b?a:b;}
  11. int sap(int v,int flow){
  12. if(v==T)return flow;
  13. int rec=0;
  14. for(E*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
  15. int ret=sap(p->t,min(p->f,flow-rec));
  16. p->f-=ret;p->pair->f+=ret;d[v]=p;
  17. if((rec+=ret)==flow)return flow;
  18. }
  19. if(!(--gap[h[v]]))h[S]=T;
  20. gap[++h[v]]++;
  21. d[v]=g[v];
  22. return rec;
  23. }
  24. int main(){
  25. int _p,_ca,_ck,_ct;
  26. scanf("%d%d%d%d%d",&n,&_p,&_ca,&_ck,&_ct);
  27. S=256*3+n+1;
  28. T=S+1;
  29. ans=_p*n;
  30. for(i=1;i<=n;i++){
  31. add(S,i,_p);
  32. int x,y,z;
  33. scanf("%d%d%d",&x,&y,&z);x++,y++,z++;
  34. add(i,x+n,inf);
  35. add(i,y+n+256,inf);
  36. add(i,z+n+512,inf);
  37. }
  38. for(i=1;i<=256;i++){
  39. add(i+n,T,_ca);
  40. add(i+n+256,T,_ck);
  41. add(i+n+512,T,_ct);
  42. }
  43. for(gap[0]=T,i=1;i<=T;i++)d[i]=g[i];
  44. while(h[S]<T)ans-=sap(S,inf);
  45. printf("%d",ans);
  46. }

  

J. Caves

设$f[S][i]$表示走过了$S$集合,目前位于$i$的最优期望花费,转移带环,但是可以将不带环的部分的DP值排序后计算环的代价。

时间复杂度$O(2^nn^2)$。

K. Blocks

从$n$到$1$填数,那么若放在两侧则能被看到,否则看不到。

设$f[i][j]$表示$i$个数从两侧总计能看到$j$个的方案数,可以预处理,则

$ans=f[n][l+p-1]C(l+p-2,l-1)$

时间复杂度$O(n(l+p)+m)$。

  1. #include<cstdio>
  2. const int N=50010,K=210,P=1000000007;
  3. int Case,n,A,B,i,j,f[N][K+5],ans,C[K][K];
  4. inline void up(int&a,int b){a=a+b<P?a+b:a+b-P;}
  5. int main(){
  6. f[1][1]=1;
  7. for(i=1;i<N;i++)for(j=1;j<K;j++)if(f[i][j]){
  8. //inside
  9. up(f[i+1][j],1LL*(i-1)*f[i][j]%P);
  10. //outside
  11. up(f[i+1][j+1],f[i][j]);
  12. }
  13. for(C[0][0]=i=1;i<K;i++)for(C[i][0]=j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
  14. scanf("%d",&Case);
  15. while(Case--){
  16. scanf("%d%d%d",&n,&A,&B);
  17. ans=1LL*f[n][A+B-1]*C[A+B-2][A-1]%P;
  18. printf("%d\n",ans);
  19. }
  20. }

  

L. Postman

固定起点之后按DFS序走最优,两遍树形DP求出每个点作为起点的答案即可。

时间复杂度$O(n)$。

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=1000010;
  4. int n,i,x,y,g[N],v[N<<1],nxt[N<<1],ed,size[N];
  5. ll f[N],h[N],s[N],ans;
  6. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
  7. void dfs(int x,int y){
  8. for(int i=g[x];i;i=nxt[i]){
  9. int u=v[i];
  10. if(u==y)continue;
  11. dfs(u,x);
  12. f[x]+=f[u]+1LL*size[u]*(size[x]*2+1);
  13. size[x]+=size[u];
  14. }
  15. size[x]++;
  16. }
  17. void dfs2(int x,int y){
  18. if(y){
  19. h[x]=s[y]-f[x]-1LL*size[x]*((n-size[x]-1)*2+1);
  20. h[x]+=n-size[x];
  21. }
  22. s[x]=f[x]+h[x]+1LL*(n-size[x])*(size[x]-1)*2;
  23. if(s[x]<ans)ans=s[x];
  24. for(int i=g[x];i;i=nxt[i]){
  25. int u=v[i];
  26. if(u==y)continue;
  27. dfs2(u,x);
  28. }
  29. }
  30. int main(){
  31. scanf("%d",&n);
  32. for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
  33. dfs(1,0);
  34. ans=f[1];
  35. dfs2(1,0);
  36. printf("%lld",ans);
  37. }

  

AMPPZ-2015 (MIPT Workshop Open 1)的更多相关文章

  1. HDU-AcmKeHaoWanLe训练实录

    菜鸡队训练实录. 现场赛记录:[名称:奖项/排名] 2017: ICPC Shenyang:Gold/3 CCPC Hangzhou:Gold/3 ICPC Beijing:Gold/13 CCPC ...

  2. BLSTM的训练算法、解码算法以及模型的改进

    摘要 BLSTM解码时,解码器需要等待整个音频到达后才开始解码,因为时间反方向的前向传播需要末尾的历史信息.BLSTM这一延时问题使其不适用与实时语音识别.context-sensitive-chun ...

  3. caffeModels--models-caffes-大全

    caffe的伯克利主页:http://caffe.berkeleyvision.org/caffe的github主页:https://github.com/BVLC/caffe caffe的model ...

  4. 论文翻译:2021_论文翻译:2018_F-T-LSTM based Complex Network for Joint Acoustic Echo Cancellation and Speech Enhancement

    论文地址:https://arxiv.53yu.com/abs/2106.07577 基于 F-T-LSTM 复杂网络的联合声学回声消除和语音增强 摘要 随着对音频通信和在线会议的需求日益增加,在包括 ...

  5. 2016 MIPT Pre-Finals Workshop Taiwan NTU Contest

    2016弱校联盟十一专场10.5 传送门 A. As Easy As Possible 假设固定左端点,那么每次都是贪心的匹配\(easy\)这个单词. 从\(l\)开始匹配的单词,将\(y\)的位置 ...

  6. 大规模视觉识别挑战赛ILSVRC2015各团队结果和方法 Large Scale Visual Recognition Challenge 2015

    Large Scale Visual Recognition Challenge 2015 (ILSVRC2015) Legend: Yellow background = winner in thi ...

  7. Productivity tips, tricks and hacks for academics (2015 edition)

    Productivity tips, tricks and hacks for academics (2015 edition) Contents Jump to: My philosophy: Op ...

  8. Computer Vision_33_SIFT:SAR-SIFT: A SIFT-LIKE ALGORITHM FOR SAR IMAGES——2015

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  9. WWW 2015:一个神奇的会议

    2015:一个神奇的会议" title="WWW 2015:一个神奇的会议"> 作者:微软亚洲研究院研究员 袁进辉 WWW 2015(24th Internatio ...

随机推荐

  1. java正则表达式取出匹配字符串

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public s ...

  2. 13-jQuery的ajax

    什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据,并在网页 ...

  3. Unity 动画系统

    Legacy动画系统:Animation组件(旧) Mecanim动画系统:Animator组件(新) 动画播放过程: //动画片段 [System.Serializable] public clas ...

  4. ASP.NET Web API 2 之路由配置

    Ø  简介 ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的.不过,在平常的开发过程中,对它有基本的了解就足够了.因为我们主要关注点并不在 ...

  5. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  6. ng-app&data-ng-app

    来源stackoverflow 区别:在验证html5时,ng-app会抛出一个错误,而对带data-前缀的特性不会抛出.其它方面这两个属性一样.

  7. monkeyrunner环境配置

    1.安装JDK.android  SDK.Python (安装完成后,配置环境变量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%ANDROID_HOME%\platfor ...

  8. CF1119A Ilya and a Colorful Walk

    题目地址:CF1119A Ilya and a Colorful Walk \(O(n^2)\) 肯定过不掉 记 \(p_i\) 为从下标 \(1\) 开始连续出现 \(i\) 的个数 那么对于每一个 ...

  9. CDQ分治求不知道多少维偏序 (持续更新 ]

    求三维偏序的模板 : //Author : 15owzLy1 //luogu3810.cpp //2018 12 25 16:31:58 #include <cstdio> #includ ...

  10. css之字体的引用

    font-family 属性设置文本的字体系列. font-family 属性应该设置几个字体名称作为一种"后备"机制,如果浏览器不支持第一种字体,他将尝试下一种字体. 注意: 如 ...