noip2016代码
----------------------------------------------------------------------------------
以下均为AC代码
-----------------------------------------------------------------------------------
Day1 T1
#include<cstdio> #include<cstring> #include<iostream> using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=1e5+10; struct node{ int f; char s[260]; node(){ f=0; memset(s,0,sizeof s); } }e[N<<1]; int n,m; int main(){ n=read();m=read(); for(int i=1;i<=n;i++){ e[i].f=read(); scanf("%s",&e[i].s); } int zj=1; for(int i=1,opt,p;i<=m;i++){ opt=read();p=read();p%=n; if(!e[zj].f){ if(opt){ if(zj+p<=n) zj+=p; else zj=zj+p-n; } else{ if(zj<=p) zj=n-p+zj; else zj-=p; } } else{ if(!opt){ if(zj+p<=n) zj+=p; else zj=zj+p-n; } else{ if(zj<=p) zj=n-p+zj; else zj-=p; } } } printf("%s",e[zj].s); return 0; }
Day1 T2
/* 题解:by shenben 如果观察点x可以观察到u->v路径上的点: 1、u->fa:t[x]+de[x]=de[u] 2、fa->v: t[x]-de[x]=dis[u,v]-de[v] 对于每条路径:用差分去维护每个点的信息 对于答案统计:可以做dfs序,然后用主席树解决“区间有多少个某数”的问题 */ #include<cstdio> #include<cstring> #include<iostream> #define me(a) memset(a,0,sizeof a) using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=3e5+10; const int M=N*25; int le[N],ri[N],dep[N],f[N][20],ans[N],t[N],tt[N],st[N],en[N],lca[N]; int sum[M],ls[M],rs[M],root[N*3]; struct node{ int v,next; }e[N<<1]; int n,m,now,num,tot,cnt,head[N]; void add(int x,int y){ e[++tot].v=y;e[tot].next=head[x];head[x]=tot; } void dfs(int x,int fa){ le[x]=++cnt; for(int i=head[x],v;i;i=e[i].next){ if((v=e[i].v)!=fa){ dep[v]=dep[x]+1; f[v][0]=x; dfs(v,x); } } ri[x]=cnt; } int calc_lca(int a,int b){ if(dep[a]<dep[b]) swap(a,b); int t=dep[a]-dep[b]; for(int i=0;i<=18;i++){ if(1<<i&t){ a=f[a][i]; } } if(a==b) return a; for(int i=18;i>=0;i--){ if(f[a][i]!=f[b][i]){ a=f[a][i]; b=f[b][i]; } } return f[a][0]; } void change(int &rt,int l,int r,int pos,int val){ if(!pos) return ; if(!rt) rt=++num; sum[rt]+=val; if(l==r) return ; int mid=l+r>>1; if(pos<=mid) change(ls[rt],l,mid,pos,val); else change(rs[rt],mid+1,r,pos,val); } int query(int rt,int l,int r,int x,int y){ if(!rt) return 0; if(l==x&&r==y) return sum[rt]; int mid=l+r>>1; if(y<=mid) return query(ls[rt],l,mid,x,y); else if(x>mid) return query(rs[rt],mid+1,r,x,y); else return query(ls[rt],l,mid,x,mid)+query(rs[rt],mid+1,r,mid+1,y); } void Cl(){ num=0;me(ls);me(rs);me(sum);me(root); } int main(){ n=read();m=read(); for(int i=1,x,y;i<n;i++){ x=read();y=read(); add(x,y);add(y,x); } dep[1]=1; dfs(1,0); for(int j=1;j<=18;j++){ for(int i=1;i<=n;i++){ f[i][j]=f[f[i][j-1]][j-1]; } } for(int i=1;i<=n;i++) t[i]=read(); for(int i=1;i<=m;i++) st[i]=read(),en[i]=read(),lca[i]=calc_lca(st[i],en[i]); for(int i=1;i<=n;i++) tt[i]=t[i]+dep[i]; for(int i=1;i<=m;i++){ now=dep[st[i]]; change(root[now],1,n,le[st[i]],1); change(root[now],1,n,le[f[lca[i]][0]],-1); } for(int i=1;i<=n;i++) ans[i]+=query(root[tt[i]],1,n,le[i],ri[i]); Cl(); for(int i=1;i<=n;i++) tt[i]=t[i]-dep[i]+n+1; for(int i=1;i<=m;i++){ now=dep[st[i]]-(dep[lca[i]]<<1)+n+1; change(root[now],1,n,le[en[i]],1); change(root[now],1,n,le[lca[i]],-1); } for(int i=1;i<=n;i++) ans[i]+=query(root[tt[i]],1,n,le[i],ri[i]); for(int i=1;i<=n;i++) printf("%d ",ans[i]); return 0; }
Day1 T3
#include<cstdio> #include<cstring> #include<iostream> #define DB double #define inf 0x3f3f3f3f using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=310; const int M=2010; int n,m,V,E,f[N][N]; int c[M],d[M]; DB K[M],dp[2][M][2]; void init(){ memset(f,inf,sizeof f); n=read();m=read();V=read();E=read(); for(int i=1;i<=n;i++) c[i]=read(); for(int i=1;i<=n;i++) d[i]=read(); for(int i=1;i<=n;i++) scanf("%lf",&K[i]); for(int i=1,x,y,z;i<=E;i++){ x=read();y=read();z=read(); f[x][y]=min(f[x][y],z); f[y][x]=min(f[y][x],z); } } void floyed(){ for(int i=1;i<=V;i++) f[i][i]=0; for(int k=1;k<=V;k++){ for(int i=1;i<=V;i++){ for(int j=1;j<=V;j++){ if(i!=j&&i!=k&&j!=k){ f[i][j]=min(f[i][j],f[i][k]+f[k][j]); } } } } } void work(){ //memset(dp,0x7fffffff,sizeof dp);对double类型慎用 for(int i=0;i<=1;i++){ for(int j=0;j<=m;j++){ dp[i][j][0]=dp[i][j][1]=inf; } } int now=1; dp[1][0][0]=0;dp[1][1][1]=0; for(int i=2;i<=n;i++){ now^=1; dp[now][0][0]=dp[now^1][0][0]+f[c[i-1]][c[i]]; for(int j=1;j<=min(i,m);j++){ dp[now][j][0]=min(dp[now^1][j][0]+f[c[i-1]][c[i]],dp[now^1][j][1]+K[i-1]*f[d[i-1]][c[i]]+(1-K[i-1])*f[c[i-1]][c[i]]); dp[now][j][1]=min(dp[now^1][j-1][0]+K[i]*f[c[i-1]][d[i]]+(1-K[i])*f[c[i-1]][c[i]],dp[now^1][j-1][1]+K[i-1]*K[i]*f[d[i-1]][d[i]]+(1-K[i-1])*K[i]*f[c[i-1]][d[i]]+K[i-1]*(1-K[i])*f[d[i-1]][c[i]]+(1-K[i-1])*(1-K[i])*f[c[i-1]][c[i]]); } } DB ans=inf; for(int i=0;i<=m;i++) ans=min(ans,min(dp[now][i][0],dp[now][i][1])); printf("%.2lf",ans); } int main(){ init(); floyed(); work(); return 0; }
Day2 T1
#include<cstdio> #include<ios> using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=2010; int n,m,k,T; int C[N][N],S[N][N]; void prepare(){ for(int i=0;i<=2000;i++){ C[i][0]=1%k; for(int j=1;j<=i;j++){ C[i][j]=(C[i-1][j]+C[i-1][j-1])%k; } } S[0][0]=(C[0][0]==0); for(int i=1;i<=2000;i++){ for(int j=1;j<=i;j++){ if(!j){ S[i][j]=S[i-1][j]+(C[i][j]==0); } else if(i==j){ S[i][j]=S[i][j-1]+(C[i][j]==0); } else{ S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+(C[i][j]==0); } } } } int main(){ T=read(),k=read(); prepare(); for(;T--;){ n=read();m=read(); printf("%d\n",S[n][min(n,m)]); } return 0; }
Day2 T2
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define DB double using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=1e5+5,M=7e6+5; int n,m,q,u,v,t; int mark,q0[N],q1[M],q2[M]; int main(){ n=read();m=read();q=read();u=read();v=read();t=read(); memset(q0,-0x3f,sizeof q0); memset(q1,-0x3f,sizeof q1); memset(q2,-0x3f,sizeof q2); int h0=0,t0=n,h1=0,t1=0,h2=0,t2=0; for(int i=0;i<n;i++) q0[i]=read(); sort(q0,q0+n,greater<int>()); DB p=(DB)u/(DB)v; for(int i=1,x,x1;i<=m;i++){ x=max(q0[h0],max(q1[h1],q2[h2])); if(x==q0[h0]) h0++; else if(x==q1[h1]) h1++; else h2++; x1=(x+=mark)*p;mark+=q; q1[t1++]=x1-mark; q2[t2++]=x-x1-mark; if(i%t) continue; printf("%d ",x); } putchar('\n'); for(int i=1,x;i<=n+m;i++){ x=max(q0[h0],max(q1[h1],q2[h2])); if(x==q0[h0]) h0++; else if(x==q1[h1]) h1++; else h2++; if(i%t) continue; printf("%d ",x+mark); } return 0; }
Day2 T3
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #define DB double using namespace std; const int N=20; const DB eps=1e-7; int T,n,s[N][N],dp[1<<N-1]; DB fm,a,b,x[N],y[N]; int main(){ ios::sync_with_stdio(false); for(cin>>T;T--;){ memset(dp,0x3f,sizeof dp); int i,j,k,sta; cin>>n>>i; for(i=1;i<=n;i++) cin>>x[i]>>y[i]; for(i=1;i<=n;i++){ for(j=i+1;j<=n;j++){ fm=x[i]*x[j]*(x[i]-x[j]); a=x[j]*y[i]-x[i]*y[j]; b=x[i]*x[i]*y[j]-x[j]*x[j]*y[i]; s[i][j]=0; if(a*fm<0){ for(k=1;k<=n;k++){ if(fabs(a*x[k]*x[k]+b*x[k]-y[k]*fm)<eps){ s[i][j]|=(1<<k-1); } } } } } dp[0]=0; for(sta=0;sta<(1<<n);sta++){ if(sta<0x3f3f3f3f){ for(i=0;1<<i&sta;i++);i++; dp[1<<i-1|sta]=min(dp[1<<i-1|sta],dp[sta]+1); for(j=i+1;j<=n;j++){ dp[sta|s[i][j]]=min(dp[sta|s[i][j]],dp[sta]+1); } } } printf("%d\n",dp[sta-1]); } return 0; }
----------------------------------------------------------------------------------
以下为暴力代码
-----------------------------------------------------------------------------------
Day1 T2
//本代码为25分,加特判链、起点、终点可以拿60分 #pragma comment(linker,"/STACK:102400,102400") #include<cstdio> #include<cstring> #include<algorithm> using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=3e5+10; struct node{ int v,next; }e[N<<1]; struct ss{ int a,b,anc; }lca[N]; int n,m,tot,head[N],dep[N],f[N][21]; int W[N],ans[N]; int tmp[N]; void add(int x,int y){ e[++tot].v=y; e[tot].next=head[x]; head[x]=tot; } void dfs(int x,int fa,int de){ dep[x]=de; f[x][0]=fa; for(int i=head[x];i;i=e[i].next){ int v=e[i].v; if(v!=fa){ dfs(v,x,de+1); } } } int calc_lca(int a,int b){ if(dep[a]<dep[b]) swap(a,b); int t=dep[a]-dep[b]; for(int i=0;i<=20;i++){ if((1<<i)&t){ a=f[a][i]; } } if(a==b) return a; for(int i=20;i>=0;i--){ if(f[a][i]!=f[b][i]){ a=f[a][i]; b=f[b][i]; } } return f[a][0]; } #define name "running" int main(){ n=read();m=read(); for(int i=1,x,y;i<n;i++){ x=read();y=read(); add(x,y);add(y,x); } dfs(1,1,0); for(int j=1;j<=20;j++){ for(int i=1;i<=n;i++){ f[i][j]=f[f[i][j-1]][j-1]; } } for(int i=1;i<=n;i++) W[i]=read(); for(int i=1,x,y;i<=m;i++){ lca[i].a=read(); lca[i].b=read(); lca[i].anc=calc_lca(lca[i].a,lca[i].b); } for(int j,k,i=1;i<=m;i++){ int x=lca[i].a,y=lca[i].b; for(j=0;x!=lca[i].anc;j++){ if(j==W[x]) ans[x]++; x=f[x][0]; } if(j==W[lca[i].anc]) ans[lca[i].anc]++; tmp[0]=0; for(;y!=lca[i].anc;){ tmp[++tmp[0]]=y; y=f[y][0]; } reverse(tmp+1,tmp+tmp[0]+1); for(k=1;k<=tmp[0];k++){ if(j+k==W[tmp[k]]) ans[tmp[k]]++; } } for(int i=1;i<n;i++) printf("%d ",ans[i]);printf("%d",ans[n]); return 0; }
Day1 T3
//本代码76分,貌似暴力最多80分 #include<cstdio> #include<cstring> #include<iostream> #define DB double using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=310; const int M=2010; int n,m,V,E,f[N][N]; int c[M],d[M]; DB miss,ans=1e9; DB K[M]; bool ok1[M],ok2[M]; void init(){ memset(f,0x3f3f3f3f,sizeof f); n=read();m=read();V=read();E=read(); for(int i=1;i<=n;i++) c[i]=read(); for(int i=1;i<=n;i++) d[i]=read(); for(int i=1;i<=n;i++) scanf("%lf",&K[i]); for(int i=1,x,y,z;i<=E;i++){ x=read();y=read();z=read(); if(x==y) continue; f[x][y]=min(f[x][y],z); f[y][x]=min(f[y][x],z); } } void floyed(){ for(int i=1;i<=V;i++) f[i][i]=0; for(int k=1;k<=V;k++){ for(int i=1;i<=V;i++){ for(int j=1;j<=V;j++){ if(i!=j&&i!=k&&j!=k){ f[i][j]=min(f[i][j],f[i][k]+f[k][j]); } } } } } DB check2(DB lv){ int now,tot=0; now=ok2[1]?d[1]:c[1]; for(int i=2;i<=n;i++){ if(ok2[i]){ if(now!=d[i]) tot+=f[now][d[i]]; now=d[i]; } else{ if(now!=c[i]) tot+=f[now][c[i]]; now=c[i]; } } return lv*(DB)tot; } void dfs2(int x,DB lv){ if(x==n+1){ miss+=check2(lv);return ; } if(!ok1[x]){ dfs2(x+1,lv); } else{ dfs2(x+1,lv*(1.0-K[x])); ok2[x]=1; dfs2(x+1,lv*K[x]); ok2[x]=0; } } void merge(){ miss=0; dfs2(1,1.0); ans=min(ans,miss); } void dfs1(int x,int t){ if(t>m) return ; if(x==n+1){ merge();return ; } dfs1(x+1,t); ok1[x]=1; dfs1(x+1,t+1); ok1[x]=0; } int main(){ init(); floyed(); if(!m){ printf("%.2lf",check2(1.0)); } else{ dfs1(1,0); printf("%.2lf",ans); } return 0; }
Day2 T1
//本代码80分,加前缀和可以AC #include<cstdio> #include<cstring> #include<iostream> #define ll long long using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } const int N=2010; const int M=3010; int n,m,k,T; int tot,c[M],prime[M/3]; bool check[M]; short C[N][N]; void prepare(){ n=3000; for(int i=2;i<=n;i++){ if(!check[i]) prime[++tot]=i; for(int j=1;j<=tot&&prime[j]*i<=n;j++){ check[prime[j]*i]=1; if(i%prime[j]==0) break; } } } void Add(ll x){ if(x<2) return ; for(int i=1;i<=tot;i++){ ll r=x,p=prime[i]; if(r<p) break; while(r) c[i]+=(r/=p); } } void Del(ll x){ if(x<2) return ; for(int i=1;i<=tot;i++){ ll r=x,p=prime[i]; if(r<p) break; while(r) c[i]-=(r/=p); } } ll fpow(ll a,ll p,ll mod){ ll res=1; for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod; return res; } int calc(ll n,ll m){ memset(c,0,sizeof c); Add(n); Del(m); Del(n-m); ll res=1; for(int i=1;i<=tot;i++){ if(c[i]>0) res=res*fpow(prime[i],c[i],k)%k; if(!res) return 1; if(prime[i]>n) break; } return 0; } int ans; int main(){ memset(C,-1,sizeof C); prepare(); for(T=read(),k=read();T--;){ ans=0; n=read();m=read(); for(int i=0;i<=n;i++){ for(int j=0;j<=min(i,m);j++){ if(C[i][j]==1) {ans++;continue;} else if(C[i][j]==0) continue; C[i][j]=calc(i,j); if(C[i][j]) ans++; } } printf("%d\n",ans); } return 0; }
Day2 T2
//本代码45分,貌似暴力的极限就是50分 #include<cstdio> #include<queue> #include<cmath> #include<algorithm> using namespace std; inline int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return f?x:-x; } #define DB double const int N=7e6+10; const int M=1e5+10; int num,n,m,q,u,v,t; int s[N+M]; int cnt,ans[N]; bool cmp(const int &a,const int &b){ return a>b; } priority_queue<int>que; int main(){ n=read();m=read();q=read();u=read();v=read();t=read(); DB p=(DB)u/(DB)v; for(int i=1;i<=n;i++) s[i]=read(); if(!q){ for(int i=1;i<=n;i++) que.push(s[i]); for(int i=1,x;i<=m;i++){ x=que.top();que.pop(); ans[++ans[0]]=x; int x1=floor((DB)x*p); int x2=x-x1; que.push(x1); que.push(x2); } for(int i=t;i<=ans[0];i+=t) printf("%d ",ans[i]); putchar('\n'); while(!que.empty()) s[++cnt]=que.top(),que.pop(); for(int i=1+t-1;i<=cnt;i+=t) printf("%d ",s[i]); return 0; } int top=n; for(int i=1;i<=m;i++){ int maxn=0,pj=0; for(int j=1;j<=top;j++){ if(s[j]>maxn){ maxn=s[j]; pj=j; } } ans[++ans[0]]=maxn; int x1=floor((DB)maxn*p); int x2=maxn-x1; for(int j=1;j<=top;j++) s[j]+=q; s[pj]=x1; s[++top]=x2; } sort(s+1,s+top+1,cmp); for(int i=t;i<=ans[0];i+=t) printf("%d ",ans[i]); putchar('\n'); for(int i=1+t-1;i<=top;i+=t) printf("%d ",s[i]); return 0; }
Day2 T3
//本代码50分,貌似暴力最多可以拿65分 #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #define N 21 using namespace std; int n,m,limit,ok[N],ans; double x[N],y[N],a,b; void check(int i,int j){ double x1=x[i],x2=x[j],y1=y[i],y2=y[j]; double P=x1/x2; a=(y2*P-y1)/(x2*x1-x1*x1); b=(y1-a*x1*x1)/x1; } void dfs(int t){ if(t>limit) return; if(t>=ans) return; int flag=0; for(int i=1;i<=n;i++){ if(ok[i]) continue; ok[i]=1;flag=1;int fl2=0; for(int j=i+1;j<=n;j++){ if(ok[j]) continue; check(i,j); if(a>=0) continue; ok[j]=1;fl2=1; int num=0; for(int k=j+1;k<=n;k++){ double yy=a*x[k]*x[k]+b*x[k]-y[k]; if(fabs(yy)<=0.001){ ok[k]=1; } } dfs(t+1),ok[i]=ok[j]=0; } if(!fl2)dfs(t+1),ok[i]=0; } if(!flag){ ans=min(ans,t); return; } } void work(){ scanf("%d%d",&n,&m); if(m==0)limit=n; else if(m==1)limit=min(n/3+1,n); else limit=min(n,n-n/3); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); dfs(0); printf("%d\n",ans); } int main(){ int T;scanf("%d",&T); while(T--){ memset(ok,0,sizeof(ok)); ans=N; work(); } return 0; }