Codeforces Round #411 (Div. 2)

来源:互联网 发布:php csdn博客 编辑:程序博客网 时间:2024/06/06 04:00

拿游子小号和大家打了一场codeforces,感觉自己被肝爆了qwqqq,wxl求轻虐...qwq



A

貌似是让求区间[l,r]中出现次数最多的约数...那就是2呗...当然l==r时是l

//codeforces 805A#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int n,l,r;int main(){ int i,j; scanf("%d%d",&l,&r); if(l==r) printf("%d\n",l); else printf("2\n"); return 0;}




B

构造一个ab序列,不能出现长度为3的回文

那就aabbaabb无限循环...

//codeforces 805B#include<cstdio>#include<cstring>//codeforces 805D#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mod=1e9+7;const int mxn=1000005;ll n,num,cnt,res,ans;ll pw[mxn];char s[mxn];int main(){ int i,j; scanf("%s",s+1); n=strlen(s+1); pw[0]=1; fo(i,1,n) pw[i]=(pw[i-1]*2)%mod; fo(i,1,n) {  if(s[i]=='a') cnt++;  else if(s[i]=='b' && (s[i+1]=='a' || i==n))  {   res++;   ans=(ans+res*(pw[cnt]-1)%mod)%mod;   res=0;  }  else res++; } printf("%lld\n",ans); return 0;}




C

贪心的来吧...1->n->2->n-1->3->n-2...

大力观察得出这样是最优解→_→

//codeforces 805C#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int n;int main(){ int i,j; scanf("%d",&n); if(n&1) printf("%d\n",n/2); else printf("%d\n",n/2-1); return 0;}


D

给一个ab序列,如果出现ab就变成bba,问变几次就不需要再变了...

大力观察么...

//codeforces 805D#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mod=1e9+7;const int mxn=1000005;ll n,num,cnt,res,ans;ll pw[mxn];char s[mxn];int main(){ int i,j; scanf("%s",s+1); n=strlen(s+1); pw[0]=1; fo(i,1,n) pw[i]=(pw[i-1]*2)%mod; fo(i,1,n) {  if(s[i]=='a') cnt++;  else if(s[i]=='b' && (s[i+1]=='a' || i==n))  {   res++;   ans=(ans+res*(pw[cnt]-1)%mod)%mod;   res=0;  }  else res++; } printf("%lld\n",ans); return 0;}


E

这个题...观察到联通块的性质,所以暴力dfs+贪心染色就好啦

//codeforces 805E. Ice cream coloring#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=300005;bool bo[mxn],wxl[mxn];int n,m,cnt,tot,ans=1;vector <int> e[mxn];int head[mxn],color[mxn];struct node {int to,next;} f[mxn<<1];inline void add(int u,int v){ f[++cnt].to=v,f[cnt].next=head[u],head[u]=cnt;}inline void dfs(int u,int fa){ int tmp=1,v; for(int i=0;i<e[u].size();i++) {  v=e[u][i];  bo[color[v]]=1; } for(int i=0;i<e[u].size();i++) {  v=e[u][i];  while(bo[tmp]) tmp++;  if(!color[v]) color[v]=tmp++; } for(int i=0;i<e[u].size();i++) {  v=e[u][i];  bo[color[v]]=0; } for(int i=head[u];i;i=f[i].next) {  v=f[i].to;  if(v==fa) continue;  dfs(v,u); }}int main(){ int i,j,x,u,v; scanf("%d%d",&n,&m); fo(i,1,n) {  scanf("%d",&x);  while(x--)  {   scanf("%d",&v);   e[i].push_back(v);  } } fo(i,2,n) {  scanf("%d%d",&u,&v);  add(u,v),add(v,u); } dfs(1,0); fo(i,1,m) ans=max(ans,color[i]); printf("%d\n",ans); fo(i,1,m) printf("%d ",max(color[i],1)); printf("\n"); return 0;}




F

调了一上午嗯嗯嗯

这题超讨厌...树的题完全不会...真的好难啊qwqqq

做出来还是不会证明复杂度qwqqq

总的来说:map大法好,vector把你保


//codeforces 805F#include<map>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=100005;double x,ans;vector <int> e[mxn],res[mxn];map < pair<int,int>,double > mp;bool vis[mxn],dia[mxn];int n,m,q,fff,cnt,tot,mx;int head[mxn],p[mxn][3],len[mxn],last[mxn];int father[mxn],pre[mxn],dist[mxn],size[mxn];struct node {int to,next,from;} f[mxn<<1];inline void add(int u,int v){ f[++cnt].to=v,f[cnt].next=head[u],head[u]=cnt;}inline int find(int x){ if(x==father[x]) return father[x]; return father[x]=find(father[x]);}inline void dfs1(int u,int lenth){ vis[u]=1,size[fff]++; if(lenth>=mx) mx=lenth,p[fff][1]=u; for(int i=head[u];i;i=f[i].next) {  int v=f[i].to;  if(!vis[v]) dfs1(v,lenth+1); }}inline void dfs2(int u,int lenth){ vis[u]=1; if(lenth>=len[fff]) p[fff][2]=u; len[fff]=max(len[fff],lenth); for(int i=head[u];i;i=f[i].next) {  int v=f[i].to;  if(!vis[v]) dfs2(v,lenth+1); }}inline void dfs3(int u)  //标记最长链{ vis[u]=1; if(u==p[fff][2]) {  dia[u]=1,dist[u]=len[fff];  int num=0;  while(pre[u])    num++,u=pre[u],dia[u]=1,dist[u]=max(num,len[fff]-num);  return; } for(int i=head[u];i;i=f[i].next) {  int v=f[i].to;  if(v==pre[u]) continue;  pre[v]=u;  dfs3(v); }}inline void dfs4(int u,int lenth){ vis[u]=1,dist[u]=lenth; e[fff].push_back(lenth); for(int i=head[u];i;i=f[i].next) {  int v=f[i].to;  if(dia[v] || vis[v]) continue;  dfs4(v,lenth+1); }}inline double solve(int t1,int t2){ int i,j,l,r; ll sum=0,tmp=max(len[t1],len[t2]); for(l=0;l<(int)e[t1].size();l++) {  r=upper_bound(e[t2].begin(),e[t2].end(),tmp-e[t1][l]-1)-e[t2].begin();  sum+=r*tmp+res[t2][size[t2]-1]+(size[t2]-r)*(e[t1][l]+1);  if(r) sum-=res[t2][r-1]; } return (double)sum/((double)size[t1]*size[t2]);}int main(){ int i,j,u,v,t1,t2,z; scanf("%d%d%d",&n,&m,&q); fo(i,1,n) father[i]=i; fo(i,1,m) {  scanf("%d%d",&u,&v);  add(u,v),add(v,u);  int t1=find(u),t2=find(v);  if(t1!=t2) father[t1]=t2; } fo(i,1,n) if(!vis[i])   fff=find(i),mx=0,dfs1(i,0); memset(vis,0,sizeof vis); fo(i,1,n) if(!vis[i]) fff=find(i),dfs2(p[fff][1],0); memset(vis,0,sizeof vis); fo(i,1,n) if(!vis[i]) fff=find(i),dfs3(p[fff][1]); memset(vis,0,sizeof vis); fo(i,1,n) if(!vis[i] && dia[i]) fff=find(i),dfs4(i,dist[i]); fo(fff,1,n) if(father[fff]==fff) {  sort(e[fff].begin(),e[fff].end());  res[fff].push_back(e[fff][0]);  for(j=1;j<e[fff].size();j++)    res[fff].push_back(res[fff][j-1]+e[fff][j]); } while(q--) {  scanf("%d%d",&u,&v);  int t1=find(u),t2=find(v);  if(size[t2]<size[t1]) swap(t1,t2);  if(t1==t2)  {   printf("-1\n");   continue;  }  if(mp.count(make_pair(t1,t2)))  {   printf("%.10lf\n",mp[make_pair(t1,t2)]);   continue;  }  ans=mp[make_pair(t1,t2)]=solve(t1,t2);  printf("%.10lf\n",ans); } return 0;}/*5 2 12 44 32 5*/


1 0
原创粉丝点击