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; }
#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; }