noip总结
经过七周的停课,我们终于迎来了期盼已久的noip考试。在这一次的noip考试中,我们经历了很多,也收获了很多。当然这一次考试中也有很多值得总结的地方,特写此总结。
这一次考试考得还不错,其实有一部分运气的存在,bird本来应该只有30分的,莫名其妙的拿了60分。但不要在意这些细节。
第一天,第一二题都还是比较水,也很快的做了出来。第三题先写了一个正确的70分暴力,然后第二题的对拍,没拍出错就交了。第一题真心不会写对拍。然后开始写第三题的错误的30分正解。比较naive。
第二天,第一题二维前缀和正解,没发现暴力也能过,拍了很久发现datamaker写错了,第二题水水的bfs,没什么好说的。第三题,考的是骗分选手的自我修养,第一次写20hash,→_→,70分在意料之中。
总体来说,530也算是发挥了自己应有的水平。如果bird不写错,当然就更好了。和第一名,省选差了20分啊→_→,还是可以接受的,吧。
后附代码。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int N,Na,Nb; 6 int xx[10][10]; 7 int a[2010],b[2010]; 8 int ans1,ans2; 9 int main() 10 { 11 freopen("rps.in","r",stdin); 12 freopen("rps.out","w",stdout); 13 xx[0][0]=0; 14 xx[0][1]=0; 15 xx[0][2]=1; 16 xx[0][3]=1; 17 xx[0][4]=0; 18 xx[1][0]=1; 19 xx[1][1]=0; 20 xx[1][2]=0; 21 xx[1][3]=1; 22 xx[1][4]=0; 23 xx[2][0]=0; 24 xx[2][1]=1; 25 xx[2][2]=0; 26 xx[2][3]=0; 27 xx[2][4]=1; 28 xx[3][0]=0; 29 xx[3][1]=0; 30 xx[3][2]=1; 31 xx[3][3]=0; 32 xx[3][4]=1; 33 xx[4][0]=1; 34 xx[4][1]=1; 35 xx[4][2]=0; 36 xx[4][3]=0; 37 xx[4][4]=0; 38 scanf("%d%d%d",&N,&Na,&Nb); 39 for(int i=0;i<Na;i++) 40 scanf("%d",&a[i]); 41 for(int i=0;i<Nb;i++) 42 scanf("%d",&b[i]); 43 for(int i=0;i<N;i++) 44 { 45 ans1+=xx[a[i%Na]][b[i%Nb]]; 46 ans2+=xx[b[i%Nb]][a[i%Na]]; 47 } 48 printf("%d %d ",ans1,ans2); 49 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 struct JackSlowFuck 7 { 8 int from,to,next; 9 }Fu[1000010]; 10 int head[400010]; 11 struct node 12 { 13 int w,mx,sum,pfs,ans; 14 }nd[400010]; 15 int nn; 16 void addedge(int f,int t) 17 { 18 ++nn; 19 Fu[nn].from=f; 20 Fu[nn].to=t; 21 Fu[nn].next=head[f]; 22 head[f]=nn; 23 } 24 priority_queue <int> Q; 25 void dfs(int now,int from) 26 { 27 28 while(!Q.empty()) Q.pop(); 29 for(int k=head[now];k;k=Fu[k].next) 30 if(Fu[k].to!=from) 31 dfs(Fu[k].to,now); 32 while(!Q.empty()) Q.pop(); 33 Q.push(0); 34 Q.push(0); 35 Q.push(nd[from].w); 36 nd[now].sum=(nd[now].sum+nd[from].w)%10007; 37 nd[now].pfs=(nd[now].pfs+(nd[from].w*nd[from].w)%10007)%10007; 38 for(int k=head[now];k;k=Fu[k].next) 39 if(Fu[k].to!=from) 40 { 41 Q.push(nd[Fu[k].to].w); 42 nd[now].sum=(nd[now].sum+nd[Fu[k].to].w)%10007; 43 nd[now].pfs=(nd[now].pfs+(nd[Fu[k].to].w*nd[Fu[k].to].w)%10007)%10007; 44 nd[now].ans=(nd[now].ans+nd[Fu[k].to].ans)%10007; 45 } 46 nd[now].mx=Q.top(); 47 Q.pop(); 48 nd[now].mx*=Q.top(); 49 nd[now].ans=(nd[now].ans+((nd[now].sum*nd[now].sum)%10007-nd[now].pfs%10007+10007)%10007)%10007; 50 while(!Q.empty()) Q.pop(); 51 } 52 int N; 53 int f,t; 54 int maxx; 55 int main() 56 { 57 freopen("link.in","r",stdin); 58 freopen("link.out","w",stdout); 59 scanf("%d",&N); 60 for(int i=1;i<N;i++) 61 { 62 scanf("%d%d",&f,&t); 63 addedge(f,t); 64 addedge(t,f); 65 } 66 nd[0].w=0; 67 for(int i=1;i<=N;i++) 68 scanf("%d",&nd[i].w); 69 dfs(1,0); 70 maxx=nd[1].mx; 71 for(int i=1;i<=N;i++) 72 maxx=max(maxx,nd[i].mx); 73 printf("%d %d ",maxx,nd[1].ans); 74 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 long long dp[2][20010]; 7 int mx=0; 8 int N,M,K; 9 struct JackSlowFuck 10 { 11 int X,Y; 12 }nd[200010]; 13 struct line 14 { 15 int P,L,H; 16 }ln[200010]; 17 bool cmp(line a,line b) 18 { 19 return a.P<b.P; 20 } 21 long long ans; 22 int L,H; 23 int l,r; 24 int nn,k; 25 #ifdef WIN32 26 #define LL "%I64d" 27 #else 28 #define LL "%lld" 29 #endif 30 int main() 31 { 32 freopen("bird.in","r",stdin); 33 freopen("bird.out","w",stdout); 34 memset(dp,-1,sizeof(dp)); 35 scanf("%d%d%d",&N,&M,&K); 36 for(int i=1;i<=M;i++) 37 dp[0][i]=0; 38 for(int i=0;i<N;i++) 39 scanf("%d%d",&nd[i].X,&nd[i].Y); 40 for(int i=0;i<K;i++) 41 scanf("%d%d%d",&ln[i].P,&ln[i].L,&ln[i].H); 42 sort(ln,ln+K,cmp); 43 for(int i=0;i<N;i++) 44 { 45 L=0,H=M; 46 l=1,r=M; 47 while(nn<K&&ln[nn].P<i+1) nn++; 48 if(ln[nn].P==i+1) L=ln[nn].L,H=ln[nn].H; 49 if(nn>0&&ln[nn-1].P==i) l=ln[nn-1].L+1,r=ln[nn-1].H-1; 50 for(int j=l;j<=r;j++) 51 if(~dp[i&1][j]) 52 { 53 mx=max(mx,nn); 54 k=1; 55 if(j-nd[i].Y>L) 56 if(dp[(i+1)&1][j-nd[i].Y]==-1||dp[(i+1)&1][j-nd[i].Y]>dp[i&1][j]) 57 dp[(i+1)&1][j-nd[i].Y]=dp[i&1][j]; 58 while(k*nd[i].X+j<L) k++; 59 while(k*nd[i].X+j<H) 60 { 61 if(dp[(i+1)&1][k*nd[i].X+j]==-1||dp[(i+1)&1][k*nd[i].X+j]>dp[i&1][j]+k) 62 dp[(i+1)&1][k*nd[i].X+j]=dp[i&1][j]+k; 63 else 64 break; 65 k++; 66 } 67 68 if(k*nd[i].X+j>=M&&ln[nn].P!=i+1&&(dp[(i+1)&1][M]==-1||dp[(i+1)&1][M]>dp[i&1][j]+k)) 69 dp[(i+1)&1][M]=dp[i&1][j]+k; 70 dp[i&1][j]=-1; 71 } 72 } 73 int flags=0; 74 ans=1000000000000000000LL; 75 for(int i=1;i<=M;i++) 76 if(~dp[N&1][i]) 77 { 78 flags=1; 79 ans=min(ans,dp[N&1][i]); 80 } 81 if(flags) 82 printf("%d " LL " ",flags,ans); 83 else 84 printf("%d %d ",flags,mx); 85 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int dp[1010][1010]; 6 int a[1010][1010]; 7 int d,N; 8 int x,y,k; 9 int ans,mx; 10 int main() 11 { 12 freopen("wireless.in","r",stdin); 13 freopen("wireless.out","w",stdout); 14 memset(a,0,sizeof(a)); 15 memset(dp,0,sizeof(dp)); 16 scanf("%d%d",&d,&N); 17 for(int i=1;i<=N;i++) 18 { 19 scanf("%d%d%d",&x,&y,&k); 20 a[x+1][y+1]+=k; 21 } 22 for(int i=1;i<=129;i++) 23 for(int j=1;j<=129;j++) 24 dp[i][j]=a[i][j]+dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]; 25 ans=0; 26 mx=0; 27 for(int i=1;i<=129;i++) 28 for(int j=1;j<=129;j++) 29 { 30 if(dp[min(i+d,129)][min(j+d,129)]-dp[max(i-d-1,0)][min(j+d,129)]-dp[min(i+d,129)][max(j-d-1,0)]+dp[max(i-d-1,0)][max(j-d-1,0)]>mx) 31 mx=dp[min(i+d,129)][min(j+d,129)]-dp[max(i-d-1,0)][min(j+d,129)]-dp[min(i+d,129)][max(j-d-1,0)]+dp[max(i-d-1,0)][max(j-d-1,0)]; 32 33 } 34 35 for(int i=1;i<=129;i++) 36 for(int j=1;j<=129;j++) 37 { 38 if(dp[min(i+d,129)][min(j+d,129)]-dp[max(i-d-1,0)][min(j+d,129)]-dp[min(i+d,129)][max(j-d-1,0)]+dp[max(i-d-1,0)][max(j-d-1,0)]==mx) 39 ans++; 40 } 41 printf("%d %d ",ans,mx); 42 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 int N,M; 8 const int INF=0x3f3f3f3f; 9 struct JackSlowFuck 10 { 11 int from,to,len,next; 12 }Fu[1000010]; 13 int head[100010],nn; 14 int dis[100010]; 15 bool in[100010]; 16 queue <int> Q; 17 void spfa(int s) 18 { 19 while(!Q.empty()) Q.pop(); 20 memset(dis,0x3f,sizeof(dis)); 21 dis[s]=0; 22 Q.push(s); 23 in[s]=true; 24 while(!Q.empty()) 25 { 26 int now=Q.front(); 27 in[now]=false; 28 Q.pop(); 29 for(int k=head[now];k;k=Fu[k].next) 30 if(dis[Fu[k].to]>dis[now]+Fu[k].len) 31 { 32 dis[Fu[k].to]=dis[now]+Fu[k].len; 33 if(!in[Fu[k].to]) 34 Q.push(Fu[k].to),in[Fu[k].to]=true; 35 } 36 } 37 } 38 void addedge(int f,int t) 39 { 40 ++nn; 41 Fu[nn].next=head[f]; 42 head[f]=nn; 43 Fu[nn].len=1; 44 Fu[nn].from=f; 45 Fu[nn].to=t; 46 } 47 int t,f; 48 int s,e; 49 int main() 50 { 51 freopen("road.in","r",stdin); 52 freopen("road.out","w",stdout); 53 scanf("%d%d",&N,&M); 54 for(int i=1;i<=M;i++) 55 { 56 scanf("%d%d",&t,&f); 57 addedge(f,t); 58 } 59 scanf("%d%d",&s,&e); 60 memset(in,0,sizeof(in)); 61 spfa(e); 62 if(dis[s]==INF) 63 { 64 printf("-1 "); 65 return 0; 66 } 67 else 68 { 69 memset(in,0,sizeof(in)); 70 for(int i=1;i<=N;i++) 71 if(dis[i]==INF) 72 { 73 for(int k=head[i];k;k=Fu[k].next) 74 in[Fu[k].to]=true; 75 } 76 if(in[s]) 77 { 78 printf("-1 "); 79 return 0; 80 } 81 spfa(e); 82 if(dis[s]==INF) 83 { 84 printf("-1 "); 85 return 0; 86 } 87 else 88 { 89 printf("%d ",dis[s]); 90 } 91 92 } 93 }
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int MOD[21]={1000000011,1000000009,1000000008,1000000007,1000000003,1000000001,1000000013,1000000017,1000000019,1000000117,1000000119,2000000011,2000000009,2000000008,2000000007,2000000003,2000000001,2000000013,2000000017,2000000019,2000000117}; 6 long long N,M; 7 long long a[21][110]; 8 char x[20010]; 9 int len; 10 bool flags; 11 long long now=0; 12 long long ans=0; 13 int b[1500010],nn; 14 int main() 15 { 16 freopen("equation.in","r",stdin); 17 freopen("equation.out","w",stdout); 18 cin>>N>>M; 19 for(int i=0;i<=N;i++) 20 { 21 scanf("%s",x+1); 22 len=strlen(x+1); 23 flags=false; 24 if(x[1]=='-') 25 flags=true; 26 for(int j=1+flags;j<=len;j++) 27 { 28 for(int t=0;t<=20;t++) 29 a[t][i]=(a[t][i]*10)%MOD[t]+x[j]-'0'; 30 } 31 if(flags) 32 { 33 for(int t=0;t<=20;t++) 34 a[t][i]=-a[t][i]; 35 } 36 } 37 for(int i=1;i<=M;i++) 38 { 39 for(int t=0;t<=20;t++) 40 { 41 flags=false; 42 now=1; 43 ans=a[t][0]; 44 for(int j=1;j<=N;j++) 45 { 46 now=(now*i)%MOD[t]; 47 ans=(ans+(a[t][j]*now)%MOD[t])%MOD[t]; 48 } 49 if(ans) 50 { 51 flags=true; 52 break; 53 } 54 } 55 if(!flags) 56 b[++nn]=i; 57 } 58 printf("%d ",nn); 59 for(int i=1;i<=nn;i++) 60 printf("%d ",b[i]); 61 }