2012 金华网络赛小记
来源:互联网 发布:acr122u破解软件 下载 编辑:程序博客网 时间:2024/06/10 07:16
1001:没看
1002:没看
1003:没看
1006:最水的概率DP,也是我们队最早A的题,1A
1004: 队友敲了半天才发现方法错了,改了后1A
1008:注意到修改和询问的次数比较少,所以可以先利用容斥原理求出给定区间内与p互质的数的和,然后再考虑那些已经被改变的位置
1010:知道怎么求LCA的话,基本上属于模拟题,不过有一些trick,根节点的兄弟有一个,最近公共祖先不能是询问的两个点中的某一个,这道题错的比较惨
去除hdu系统的原因CE了两次,这道题5A。这场比赛我几乎被这道题废了,出题人专门搞trick,有意思么- -
1005:比赛还有半个小时不到,看到这种题肯定就想到有没有模板,于是乎猥琐的google了一下,然后再猥琐的贴模板,然后就A了。。。。
总结:这场比赛几乎没什么思考的时间,题目的质量不是很高吧,模板题、原题出在网络赛真心不太好。
贴几个代码吧
1010
#pragma warning (disable : 4786)#include<cstdio>#include<cstring>#include<vector>#include<string>#include<iostream>#include<map>#include<queue>#include<stack>#include<set>#include<algorithm>using namespace std;const int maxn = 40000;const int M = 40000;const int POW = 16;int fa[maxn];char in[maxn][65];char xx[maxn][65];char root[65];struct Edge{ int to; string name; bool operator < (const Edge &cmp) const { return name < cmp.name; }};set<Edge> link[maxn];map<string,int> mp;string rec[maxn];string init[maxn];int tot;void add(string a,string b) { Edge k; k.to=mp[b]; k.name=b; link[mp[a]].insert(k); rec[mp[a]] = a;}void print(int u) { printf("%s\n",init[u].c_str()); for(set<Edge>::iterator it=link[u].begin();it!=link[u].end();it++){ int v=it->to; print(v); }}int d[maxn];int p[maxn][POW];void dfs(int u,int fa){ d[u]=d[fa]+1; p[u][0]=fa; for(int i=1;i<POW;i++) p[u][i]=p[p[u][i-1]][i-1]; for(set<Edge>::iterator it=link[u].begin();it!=link[u].end();it++){ int v=it->to; if(v==fa) continue; dfs(v,u); } } int LCA( int a, int b ){ if( d[a] > d[b] ) a ^= b, b ^= a, a ^= b; if( d[a] < d[b] ){ int del = d[b] - d[a]; for( int i = 0; i < POW; i++ ) if(del&(1<<i)) b=p[b][i]; } if( a != b ){ for( int i = POW-1; i >= 0; i-- ) if( p[a][i] != p[b][i] ) a = p[a][i] , b = p[b][i]; a = p[a][0], b = p[b][0]; } return a; } int f[maxn];int main(){ int n,i,j,k,Q; char op[10]; char name[65],name1[65],name2[65]; while(scanf("%d",&n),n) { tot=0; mp.clear(); scanf("%s",in[0]); strcpy(xx[0],in[0]); mp[xx[0]]=++tot; init[1]=in[0]; for(i=0;i<=n;i++) link[i].clear(); f[0] = 0; for(i=1;i<n;i++) { scanf("%s",in[i]); int len=strlen(in[i]); int cnt=0; for(j=0;j<len;j++) { if(in[i][j]=='.') cnt++; else break; } strcpy(xx[i],in[i]+cnt); mp[xx[i]]=++tot; init[tot]=in[i]; int pre=f[cnt-1]; add(xx[pre],xx[i]); fa[tot] = mp[xx[pre]]; f[cnt]=i; } dfs(1,0); scanf("%d",&Q); int id1,id2,id,pa; while(Q--) { scanf("%s",op); if(op[0]=='L') { print(1); } else if(op[0]=='b') { scanf("%s",name); id=mp[name]; pa=fa[id]; if(id==1) printf("1\n"); else printf("%d\n",link[pa].size()); } else { scanf("%s%s",name1,name2); id1=mp[name1],id2=mp[name2]; int lca=LCA(id1,id2); if(lca==id1 || lca==id2) printf("%s\n",rec[fa[lca]].c_str()); else printf("%s\n",rec[lca].c_str()); } } } return 0;}
1005
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=100020;int n,m;double dp[maxn];struct Node{ int u,v; bool operator <(const Node & t)const { return v>t.v; }}p[maxn];int pre[maxn];int main(){ int i,j; int u,v; while(scanf("%d%d",&n,&m)!=EOF && n+m){ memset(dp,0,sizeof(dp)); memset(pre,-1,sizeof(pre)); for(i=0;i<m;i++){ scanf("%d%d",&p[i].u,&p[i].v); } sort(p,p+m); for(i=0;i<m;i++){ if(pre[p[i].v]!=-1) pre[p[i].u]=pre[p[i].v]; else pre[p[i].u]=p[i].v; } for(i=n-1;i>=0;i--){ double sum=0; for(j=1;j<7;j++){ if(pre[i+j]==-1){ sum+=dp[i+j]; }else{ sum+=dp[pre[i+j]]; } } sum=sum/6.0+1.0; dp[i]=sum; } printf("%.4lf\n",dp[0]); } return 0;}
1007
#include<cstdio>#include<map>#include<vector>using namespace std;int gcd(int a,int b){return b?gcd(b,a%b):a;}typedef __int64 lld;vector<int>prime;int nprime[1000]={1,1};void init(){ int i; int c; for(i=2;i<1000;++i){ if(!nprime[i]){ prime.push_back(i); for(c=i+i;c<1000;c+=i)nprime[c]=1; } }}lld getsum(int n,int r){ vector<int>p; int i; for(i=0;prime[i]*prime[i]<=r;++i){ if(r%prime[i]==0){ p.push_back(prime[i]); while(r%prime[i]==0){ r/=prime[i]; } } } if(r>1)p.push_back(r); lld sum=(lld)n*(n+1)/2; for(int num=1;num<(1<<p.size());++num){ lld mult=1; int ones=0; for(i=0;i<p.size();i++){ if(num&(1<<i)){ ones^=1; mult*=p[i]; } } if(ones)sum-=(lld)(n/mult)*(n/mult+1)/2*mult; else sum+=(lld)(n/mult)*(n/mult+1)/2*mult; } return sum;}int main(){ int t; scanf("%d",&t); init(); while(t--){ map<int,int>chg; map<int,int>::iterator it; int n,m; scanf("%d%d",&n,&m); int cmd; int x,y,c,p; while(m--){ scanf("%d%d",&cmd,&x); if(cmd==1){ scanf("%d%d",&y,&p); lld res=getsum(y,p)-getsum(x-1,p); for(it=chg.lower_bound(x);it!=chg.end()&&it->first<=y;++it){ if(gcd(it->first,p)==1)res-=it->first; if(gcd(it->second,p)==1)res+=it->second; } printf("%I64d\n",res); }else{ scanf("%d",&c); chg[x]=c; } } } return 0;}
- 2012 金华网络赛小记
- 2012金华网络赛
- 2012金华网络赛赛后【缺ABC】
- hdu 4404 Worms (2012金华网络赛E题)
- 2012金华现场赛
- 2012 金华 现场赛
- hdu4405 Aeroplane chess---金华网络赛 期望
- 2012网赛金华赛区
- 2012 金华赛区现场赛
- 金华网络信息
- 2012 天津网络赛小记
- 2012 成都网络赛小记
- 【Author : MZ && DS】2012金华网络预赛 Chapter 1
- 【Author : DS && MZ】2012 金华网络预赛 Chapter 2
- 2012金华邀请赛总结
- 2012金华赛区小结
- hdu4445 CRAZY TANK 2012金华赛区现场赛D题
- 2012金华邀请赛解题报告
- struts2 的查漏补缺知识点
- c++类型转换四种关键字
- JavaScript学习笔记(八) 基本类型包装器和Error对象
- 一个C#和C++执行效率对比的简单实例
- poj 3026 Borg Maze(prim+广搜)
- 2012 金华网络赛小记
- 高速前轮爆胎后为何方向出现摇摆
- C++ Virtual详解
- 启动关闭mysql服务命令
- Google Code
- 一个简单程序演示container_of的原理
- 警长逃犯的黑白帽的问题
- 递归法求幂
- 三分法求极值