AMPPZ-2015 (MIPT Workshop Open 1)
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)$。
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int N=555555;
- const double inf=1e100;
- int m,n,i,a[N],b[N];char op[N][9];
- double s[N],p[N];
- void build(int x,int a,int b){
- p[x]=1;
- if(a==b)return;
- int mid=(a+b)>>1;
- build(x<<1,a,mid);
- build(x<<1|1,mid+1,b);
- }
- void change(int x,int a,int b,int c,int o){
- if(a==b){
- p[x]+=o;
- s[x]=::a[a]*(p[x]-1)/p[x];
- return;
- }
- int mid=(a+b)>>1;
- if(c<=mid)change(x<<1,a,mid,c,o);else change(x<<1|1,mid+1,b,c,o);
- p[x]=min(p[x<<1]*p[x<<1|1],inf);
- s[x]=s[x<<1]+s[x<<1|1]/p[x<<1];
- }
- int main(){
- scanf("%d",&m);
- for(i=1;i<=m;i++){
- scanf("%s%d",op[i],&b[i]);
- a[i]=b[i];
- }
- sort(a+1,a+m+1);
- for(i=1;i<=m;i++)if(i==1||a[i]!=a[i-1])a[++n]=a[i];
- build(1,1,n);
- for(i=1;i<=m;i++){
- change(1,1,n,lower_bound(a+1,a+n+1,b[i])-a,op[i][0]=='+'?1:-1);
- printf("%.15f\n",s[1]*(1.0+1.0/(p[1]-1)));
- }
- }
B. Well Off
对$x[i]$和$-x[i]$建图,若$a+b>0$,则连边$a>-b$,$b>-a$,拓扑排序判断是否存在环。
- #include<cstdio>
- const int N=200010,M=1000010;
- int n,m,i,g[N],v[M],nxt[M],ed,d[N],q[N],h,t;
- inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;d[y]++;}
- inline int read(){
- char s[9];
- int x;
- scanf("%s%d",s,&x);
- x--;
- x<<=1;
- if(s[0]=='-')x++;
- return x;
- }
- int main(){
- scanf("%d%d",&n,&m);
- while(m--){
- int x=read();
- int y=read();
- add(x,y^1);
- add(y,x^1);
- }
- n*=2;
- for(h=1,i=0;i<n;i++)if(!d[i])q[++t]=i;
- while(h<=t){
- int x=q[h++];
- for(i=g[x];i;i=nxt[i])if(!(--d[v[i]]))q[++t]=v[i];
- }
- puts(t<n?"NIE":"TAK");
- }
C. Accurate Shots (8Mb TL!)
若$m>\sqrt{n}$,则可以直接枚举$m$的所有倍数暴力判断。
否则考虑折半爆搜,枚举左半边对$m$的余数,就知道右半边对$m$的余数,分别枚举出所有解即可。
时间复杂度$O(\sqrt{n})$。
D. Prom
排序后双指针。
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int N=250010;
- int n,m,lim,i,j,k,a[N],b[N];long long ans;
- int main(){
- scanf("%d%d%d",&n,&m,&lim);
- for(i=1;i<=n;i++)scanf("%d",&a[i]);
- for(i=1;i<=m;i++)scanf("%d",&b[i]);
- sort(a+1,a+n+1);
- sort(b+1,b+m+1);
- for(i=j=k=1;i<=n;i++){
- while(j<=m&&b[j]<=a[i]+lim)j++;
- while(k<=m&&b[k]<a[i]-lim)k++;
- ans+=j-k;
- }
- printf("%lld",ans);
- }
E. Impressive Graphs
在$O(nk\log n)$的时间里维护出杨氏图表的前$k$行,则最终个数即为前$k$行的元素个数。
输出方案部分留坑。
F. Pen
用栈进行括号匹配,栈为空时往左补充,最后将栈中未配对左括号配上右括号。
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- using namespace std;
- const int N=1000010;
- int n,i,t,cb;char a[N],q[N],b[N];
- void NO(){
- puts("NIE");
- exit(0);
- }
- int main(){
- scanf("%s",a+1);
- n=strlen(a+1);
- for(i=1;i<=n;i++){
- if(a[i]=='('||a[i]=='{'||a[i]=='['){
- q[++t]=a[i];
- }
- if(a[i]==')'){
- if(t){
- if(q[t]=='(')t--;
- else NO();
- }else{
- b[++cb]='(';
- }
- }
- if(a[i]=='}'){
- if(t){
- if(q[t]=='{')t--;
- else NO();
- }else{
- b[++cb]='{';
- }
- }
- if(a[i]==']'){
- if(t){
- if(q[t]=='[')t--;
- else NO();
- }else{
- b[++cb]='[';
- }
- }
- }
- for(i=cb;i;i--)putchar(b[i]);
- for(i=1;i<=n;i++)putchar(a[i]);
- for(i=t;i;i--){
- if(q[i]=='(')putchar(')');
- if(q[i]=='[')putchar(']');
- if(q[i]=='{')putchar('}');
- }
- }
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)$。
- #include<cstdio>
- typedef long long ll;
- const int N=2005;
- const ll inf=1LL<<60;
- int M,n,i,j,a[N],g;
- ll f[N][N];
- inline void up(ll&a,ll b){if(a>b)a=b;}
- struct ZKW{
- ll v[4100];
- inline void ask(int x,int y,ll&t){
- if(x>y)return;
- for(x+=M-1,y+=M+1;x^y^1;x>>=1,y>>=1){
- if(~x&1)up(t,v[x^1]);
- if(y&1)up(t,v[y^1]);
- }
- }
- inline void ins(int x,ll y){for(x+=M;x;x>>=1)up(v[x],y);}
- inline void build(){for(int i=1;i<=n+M;i++)v[i]=inf;}
- }T1[N],T2[N];
- inline void add(int x,int y){
- if(x>1)T1[y].ins(x-1,f[x][y]+a[x-1]);
- if(y<n)T2[x].ins(y+1,f[x][y]+a[y+1]);
- }
- int main(){
- scanf("%d",&n);
- for(M=1;M<n+2;M<<=1);
- for(i=1;i<=n;i++)scanf("%d",&a[i]),T1[i].build(),T2[i].build();
- for(i=1;i<=n;i++)add(i,i-1);
- for(i=1;i<=n;i++)f[i][i]=a[i],add(i,i);
- for(i=n;i;i--)for(g=i,j=i+1;j<=n;j++){
- while(g<=j&&f[i][g-1]<f[g+1][j])g++;
- f[i][j]=inf;
- T1[j].ask(i,g-1,f[i][j]);
- T2[i].ask(g,j,f[i][j]);
- add(i,j);
- }
- printf("%lld",f[1][n]);
- }
I. Insects
最大权闭合子图。
- #include<cstdio>
- const int N=2010,inf=1e9;
- struct E{int t,f;E*nxt,*pair;}*g[N],*d[N],pool[500000],*cur=pool;
- int n,m,i,j,k,x,y,S,T,h[N],gap[N],ans;
- inline void add(int s,int t,int f){
- E*p=cur++;p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
- p=cur++;p->t=s;p->f=0;p->nxt=g[t];g[t]=p;
- g[s]->pair=g[t];g[t]->pair=g[s];
- }
- inline int min(int a,int b){return a<b?a:b;}
- int sap(int v,int flow){
- if(v==T)return flow;
- int rec=0;
- for(E*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
- int ret=sap(p->t,min(p->f,flow-rec));
- p->f-=ret;p->pair->f+=ret;d[v]=p;
- if((rec+=ret)==flow)return flow;
- }
- if(!(--gap[h[v]]))h[S]=T;
- gap[++h[v]]++;
- d[v]=g[v];
- return rec;
- }
- int main(){
- int _p,_ca,_ck,_ct;
- scanf("%d%d%d%d%d",&n,&_p,&_ca,&_ck,&_ct);
- S=256*3+n+1;
- T=S+1;
- ans=_p*n;
- for(i=1;i<=n;i++){
- add(S,i,_p);
- int x,y,z;
- scanf("%d%d%d",&x,&y,&z);x++,y++,z++;
- add(i,x+n,inf);
- add(i,y+n+256,inf);
- add(i,z+n+512,inf);
- }
- for(i=1;i<=256;i++){
- add(i+n,T,_ca);
- add(i+n+256,T,_ck);
- add(i+n+512,T,_ct);
- }
- for(gap[0]=T,i=1;i<=T;i++)d[i]=g[i];
- while(h[S]<T)ans-=sap(S,inf);
- printf("%d",ans);
- }
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)$。
- #include<cstdio>
- const int N=50010,K=210,P=1000000007;
- int Case,n,A,B,i,j,f[N][K+5],ans,C[K][K];
- inline void up(int&a,int b){a=a+b<P?a+b:a+b-P;}
- int main(){
- f[1][1]=1;
- for(i=1;i<N;i++)for(j=1;j<K;j++)if(f[i][j]){
- //inside
- up(f[i+1][j],1LL*(i-1)*f[i][j]%P);
- //outside
- up(f[i+1][j+1],f[i][j]);
- }
- 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;
- scanf("%d",&Case);
- while(Case--){
- scanf("%d%d%d",&n,&A,&B);
- ans=1LL*f[n][A+B-1]*C[A+B-2][A-1]%P;
- printf("%d\n",ans);
- }
- }
L. Postman
固定起点之后按DFS序走最优,两遍树形DP求出每个点作为起点的答案即可。
时间复杂度$O(n)$。
- #include<cstdio>
- typedef long long ll;
- const int N=1000010;
- int n,i,x,y,g[N],v[N<<1],nxt[N<<1],ed,size[N];
- ll f[N],h[N],s[N],ans;
- inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
- void dfs(int x,int y){
- for(int i=g[x];i;i=nxt[i]){
- int u=v[i];
- if(u==y)continue;
- dfs(u,x);
- f[x]+=f[u]+1LL*size[u]*(size[x]*2+1);
- size[x]+=size[u];
- }
- size[x]++;
- }
- void dfs2(int x,int y){
- if(y){
- h[x]=s[y]-f[x]-1LL*size[x]*((n-size[x]-1)*2+1);
- h[x]+=n-size[x];
- }
- s[x]=f[x]+h[x]+1LL*(n-size[x])*(size[x]-1)*2;
- if(s[x]<ans)ans=s[x];
- for(int i=g[x];i;i=nxt[i]){
- int u=v[i];
- if(u==y)continue;
- dfs2(u,x);
- }
- }
- int main(){
- scanf("%d",&n);
- for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
- dfs(1,0);
- ans=f[1];
- dfs2(1,0);
- printf("%lld",ans);
- }
AMPPZ-2015 (MIPT Workshop Open 1)的更多相关文章
- HDU-AcmKeHaoWanLe训练实录
菜鸡队训练实录. 现场赛记录:[名称:奖项/排名] 2017: ICPC Shenyang:Gold/3 CCPC Hangzhou:Gold/3 ICPC Beijing:Gold/13 CCPC ...
- BLSTM的训练算法、解码算法以及模型的改进
摘要 BLSTM解码时,解码器需要等待整个音频到达后才开始解码,因为时间反方向的前向传播需要末尾的历史信息.BLSTM这一延时问题使其不适用与实时语音识别.context-sensitive-chun ...
- caffeModels--models-caffes-大全
caffe的伯克利主页:http://caffe.berkeleyvision.org/caffe的github主页:https://github.com/BVLC/caffe caffe的model ...
- 论文翻译: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 复杂网络的联合声学回声消除和语音增强 摘要 随着对音频通信和在线会议的需求日益增加,在包括 ...
- 2016 MIPT Pre-Finals Workshop Taiwan NTU Contest
2016弱校联盟十一专场10.5 传送门 A. As Easy As Possible 假设固定左端点,那么每次都是贪心的匹配\(easy\)这个单词. 从\(l\)开始匹配的单词,将\(y\)的位置 ...
- 大规模视觉识别挑战赛ILSVRC2015各团队结果和方法 Large Scale Visual Recognition Challenge 2015
Large Scale Visual Recognition Challenge 2015 (ILSVRC2015) Legend: Yellow background = winner in thi ...
- Productivity tips, tricks and hacks for academics (2015 edition)
Productivity tips, tricks and hacks for academics (2015 edition) Contents Jump to: My philosophy: Op ...
- Computer Vision_33_SIFT:SAR-SIFT: A SIFT-LIKE ALGORITHM FOR SAR IMAGES——2015
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- WWW 2015:一个神奇的会议
2015:一个神奇的会议" title="WWW 2015:一个神奇的会议"> 作者:微软亚洲研究院研究员 袁进辉 WWW 2015(24th Internatio ...
随机推荐
- java正则表达式取出匹配字符串
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public s ...
- 13-jQuery的ajax
什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据,并在网页 ...
- Unity 动画系统
Legacy动画系统:Animation组件(旧) Mecanim动画系统:Animator组件(新) 动画播放过程: //动画片段 [System.Serializable] public clas ...
- ASP.NET Web API 2 之路由配置
Ø 简介 ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的.不过,在平常的开发过程中,对它有基本的了解就足够了.因为我们主要关注点并不在 ...
- python数据结构之堆(heap)
本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
- ng-app&data-ng-app
来源stackoverflow 区别:在验证html5时,ng-app会抛出一个错误,而对带data-前缀的特性不会抛出.其它方面这两个属性一样.
- monkeyrunner环境配置
1.安装JDK.android SDK.Python (安装完成后,配置环境变量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%ANDROID_HOME%\platfor ...
- CF1119A Ilya and a Colorful Walk
题目地址:CF1119A Ilya and a Colorful Walk \(O(n^2)\) 肯定过不掉 记 \(p_i\) 为从下标 \(1\) 开始连续出现 \(i\) 的个数 那么对于每一个 ...
- CDQ分治求不知道多少维偏序 (持续更新 ]
求三维偏序的模板 : //Author : 15owzLy1 //luogu3810.cpp //2018 12 25 16:31:58 #include <cstdio> #includ ...
- css之字体的引用
font-family 属性设置文本的字体系列. font-family 属性应该设置几个字体名称作为一种"后备"机制,如果浏览器不支持第一种字体,他将尝试下一种字体. 注意: 如 ...