zoukankan      html  css  js  c++  java
  • 题解Codeforces Round #620 (Div. 2)

     

    一些无关紧要的前(che)言(dan)

    果然vp选手和正式选手的心态完全不同。。大号带小号和只开大号打是完全不同的感觉。。

    唉人老了不行了没当年手速快了。。想当年我初中的时候15min随随便便过abc。。

    A:abs(x-y)/(a+b)??我觉得我网速快点可能0:01就切A了

     1 #include<stdio.h>
     2 int T;
     3 long long x,y,a,b,dis;
     4 int main(){
     5     scanf("%d",&T);
     6     while(T--){
     7         scanf("%lld%lld%lld%lld",&x,&y,&a,&b);
     8         dis=(x>y?x-y:y-x),a+=b;
     9         dis%a?puts("-1"):printf("%lld
    ",dis/a);
    10     }
    11     return 0;
    12 }
    A

    B:所有回文一样,一一配对即可。注意可能中间多出来一个自身是回文的。

     1 #include<stdio.h> 
     2 #include<string.h>
     3 #define it register int
     4 #define ct const int
     5 #define il inline
     6 using namespace std;
     7 const int N=105;
     8 int n,m,o[N*N],cnt,flag[N],ans[N*N];
     9 char s[N][N];
    10 inline bool ck(ct p,ct q){
    11     for(int i=1;i<=m;++i)
    12         if(s[p][i]!=s[q][m-i+1]) return 0;
    13     return 1;
    14 }
    15 int main(){ 
    16     scanf("%d%d",&n,&m);int i,j;
    17     for(i=1;i<=n;++i) scanf("%s",s[i]+1);
    18     for(i=1;i<=n;++i)
    19         if(!flag[i])
    20             for(j=i+1;j<=n;++j)
    21                 if(!flag[j]&&ck(i,j)){o[++cnt]=i,o[++cnt]=j,flag[i]=flag[j]=1;break;}
    22     for(i=1;i<=n;++i) if(!flag[i]&&ck(i,i)){o[++cnt]=i;break;}
    23     printf("%d
    ",cnt*m);
    24     int hd=0,tl=cnt;
    25     for(i=1;i<=cnt;i+=2)
    26         ans[tl--]=o[i+1],ans[++hd]=o[i];
    27     for(i=1;i<=cnt;++i) printf("%s",s[ans[i]]+1);
    28     return 0;
    29 }
    B

    C:每次更新一下范围。比如上次的范围是(l,r),新进来一个客人,范围就变成了(Max(l-dis,nowl),Min(r+dis,nowr)),只要中间有l>r的情况就不合法。 

     1 #include<stdio.h> 
     2 #include<string.h>
     3 #define it register int
     4 #define ct const int
     5 #define il inline
     6 using namespace std;
     7 int n,m,T,l,r,L,R,t,dis,flag,lstt;
     8 inline int Min(ct p,ct q){return p<q?p:q;}
     9 inline int Max(ct p,ct q){return p>q?p:q;}
    10 namespace io{
    11     il char nc(){
    12         static char buf[100000],*p1=buf,*p2=buf;
    13         return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; 
    14     }
    15     template <class I> 
    16     il void fr(I &num){
    17         num=0;register char c=nc();it p=1;
    18         while(c<'0'||c>'9') c=='-'?p=-1,c=nc():c=nc();
    19         while(c>='0'&&c<='9') num=num*10+c-'0',c=nc();
    20         num*=p;
    21     } 
    22 }
    23 using io ::fr;
    24 int main(){
    25     fr(T);
    26     while(T--){
    27         fr(n),fr(m),l=m,r=m,flag=1,lstt=0;
    28         for(it i=1;i<=n;++i){
    29             fr(t),fr(L),fr(R);
    30             dis=t-lstt,l=Max(l-dis,L),r=Min(r+dis,R),lstt=t;
    31             if(l>r) flag=0;
    32         }
    33         flag?puts("YES"):puts("NO");
    34     }
    35     return 0;
    36 }
    C

    D:画图理解波峰波谷,或者说作上升下降曲线,反正就是找到连续一段上升的最高点,并且标记这个最高点往前推多长是上升的。然后LIS最小嘛肯定是只有最长上升的一段是LIS,最大那就尽量保证同样上升的情况下优先考虑把小的放在前面,也就是把所有满足大于关系的数中尽量把小的往前排。

     1 #include<stdio.h> 
     2 #include<string.h>
     3 #define it register int
     4 #define ct const int
     5 #define il inline
     6 using namespace std; 
     7 const int N=1000005;
     8 char s[N];
     9 int n,f[N],xy,dy,now,ans[N],a[N],T;
    10 int main(){
    11     scanf("%d",&T);
    12     while(T--){
    13         scanf("%d%s",&n,s+2);it i,j;
    14         a[1]=1,xy=dy=0,a[n+1]=0,f[1]=0;
    15         for(i=2;i<=n;++i) f[i]=0,s[i]=='<'?(++xy,a[i]=1):(++dy,a[i]=0);
    16         for(i=1,j=1;i<=n;i=j){
    17             j=i+1;
    18             if(a[i]){while(a[j]) ++j;f[j-1]=j-i;}
    19         }
    20         now=1;
    21         for(i=n;i;--i) if(!a[i]) ans[i]=now++;
    22         now=n;
    23         for(i=1;i<=n;++i) if(f[i]) for(j=i;j>=i-f[i]+1;--j) ans[j]=now--;
    24         for(i=1;i<=n;++i) printf("%d ",ans[i]);puts("");
    25         now=dy+1;
    26         for(i=1;i<=n;++i) if(a[i]) ans[i]=now++;
    27         for(i=1;i<=n;++i) printf("%d ",ans[i]);puts("");
    28     }
    29     return 0;
    30 }
    D

    E:这次E比D先做出来。有点像今年pj的T4啊。先判断一下加进来的是奇环还是偶环,然后根据路上奇偶性判断即可。代码附注释。

     1 #include<stdio.h> 
     2 #include<string.h>
     3 #define it register int
     4 #define ct const int
     5 #define il inline
     6 using namespace std; 
     7 const int N=1000005;
     8 int h[N],nxt[N],adj[N],t,n,Q,u,v,f[N][20],fa[N],d[N],top[N],son[N],sz[N];
     9 namespace io{
    10     il char nc(){
    11         static char buf[100000],*p1=buf,*p2=buf;
    12         return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; 
    13     }
    14     template <class I> 
    15     il void fr(I &num){
    16         num=0;register char c=nc();it p=1;
    17         while(c<'0'||c>'9') c=='-'?p=-1,c=nc():c=nc();
    18         while(c>='0'&&c<='9') num=num*10+c-'0',c=nc();
    19         num*=p;
    20     } 
    21 }
    22 using io ::fr;
    23 il int Min(ct p,ct q){return p<q?p:q;}
    24 il void sp(int &p,int &q){p+=q,q=p-q,p-=q;}
    25 il void add(){nxt[++t]=h[u],h[u]=t,adj[t]=v,nxt[++t]=h[v],h[v]=t,adj[t]=u;}
    26 il void DFS(ct x){
    27     d[x]=d[fa[x]]+1,sz[x]=1;
    28     for(it i=h[x],j;i;i=nxt[i])
    29         if((j=adj[i])^fa[x])
    30             fa[j]=f[j][0]=x,DFS(j),sz[x]+=sz[j],son[x]=(sz[j]>sz[son[x]]?j:son[x]);
    31 }
    32 il void dfs(ct x){
    33     if(!top[x]) top[x]=x;
    34     if(!son[x]) return;
    35     top[son[x]]=top[x],dfs(son[x]);
    36     for(it i=h[x],j;i;i=nxt[i])
    37         if(((j=adj[i])^fa[x])&&(j^son[x])) dfs(j);
    38 }
    39 void lca(it u,it v,int &lc){
    40     while(top[u]^top[v]) d[top[u]]<d[top[v]]?v=fa[top[v]]:u=fa[top[u]];
    41     lc=(d[u]<d[v]?u:v);
    42 }
    43 void calfa(){
    44     for(it i,j=1;(1<<j)<=n;++j)
    45         for(i=1;i<=n;++i) f[i][j]=f[f[i][j-1]][j-1];
    46 }
    47 int dis(ct u,ct v){it Lca;lca(u,v,Lca);return d[u]+d[v]-(d[Lca]<<1);}
    48 bool isfa(it x,ct fa,ct ds){
    49     for(it i=19;~i;--i) if(ds&(1<<i)) x=f[x][i];
    50     return x==fa;
    51 }
    52 int main(){
    53     fr(n);it i,dis1,dis2,x,y,k;
    54     for(i=1;i<n;++i) fr(u),fr(v),add();
    55     DFS(1),dfs(1),calfa(),fr(Q);
    56     while(Q--){
    57         fr(x),fr(y),fr(u),fr(v),fr(k); 
    58         dis1=Min(dis(u,x)+dis(v,y)+1,dis(u,y)+dis(v,x)+1),dis2=dis(u,v);
    59         if((d[x]&1)^(d[y]&1)){((k&1)==(dis2&1))&&(Min(dis1,dis2)<=k)?puts("YES"):puts("NO");continue;}
    60         (dis1<=k&&((dis1&1)==(k&1)))||(dis2<=k&&((dis2&1)==(k&1)))?puts("YES"):puts("NO");
    61     }
    62     return 0;
    63 }
    E

    全世界都会的F系列。。今天真的是套路场+手速场。。

    怕fst了明天再更F吧。。前五题都过了systemtest所以光明正大地放出来。。

    没有fst。。官方题解也出来了就是个滑动窗口。。随便打一个支持快速查询子段和最值的东西就可以啦。。

     1 #include<stdio.h>
     2 #define it register int
     3 #define ct const int
     4 #define il inline
     5 const int N=60,M=40005;
     6 int g[N][M],f[N][M],s[N][M],a[N][M],ans,n,m,k,Log[M];
     7 il int Max(ct p,ct q){return p>q?p:q;}
     8 il void Pre(){
     9     for(it i,j=1;(1<<j)<=m;j++)
    10         for(i=1;i+(1<<j)-1<=m;i++) 
    11             g[j][i]=Max(g[j-1][i],g[j-1][i+(1<<j-1)]);
    12 }
    13 il int que(ct l,ct r){
    14     if(l>r) return 0;
    15     ct k=Log[r-l+1];return Max(g[k][l],g[k][r-(1<<k)+1]);
    16 }
    17 int main(){
    18     scanf("%d%d%d",&n,&m,&k);it i,j;
    19     for(i=1;i<=n;++i)
    20         for(j=1;j<=m;++j)
    21             scanf("%d",&a[i][j]),s[i][j]=s[i][j-1]+a[i][j];
    22     for(i=2;i<M;++i) Log[i]=Log[i>>1]+1;
    23     for(i=1;i<=n;++i){
    24         for(j=1;j<=m;++j) g[0][j]=f[i-1][j]+s[i][j-1];
    25         Pre();
    26         for(j=1;j+k-1<=m;++j) f[i][j]=que(j,j+k-1)-s[i][j-1];
    27         for(j=1;j<=m;++j) g[0][j]=f[i-1][j]-s[i][j+k-1];
    28         Pre();
    29         for(j=1;j+k-1<=m;++j) f[i][j]=Max(f[i][j],que(Max(1,j-k+1),j)+s[i][j+k-1]);
    30         for(j=1;j<=m;++j) g[0][j]=f[i-1][j];
    31         Pre();
    32         for(j=1;j+k-1<=m;++j) f[i][j]=Max(f[i][j],Max(que(1,j-k),que(j+k,m))+s[i][j+k-1]-s[i][j-1])+s[i+1][j+k-1]-s[i+1][j-1];
    33     }
    34     for(i=1;i<=m;++i) ans=Max(ans,f[n][i]);
    35     printf("%d",ans);
    36     return 0;
    37 }
    F
  • 相关阅读:
    LVS 模式
    修改RocketMQ的NameServer端口
    一次清理Hbase的oldWALs的过程
    Linux下删除文件系统空间不释放的问题
    HBase 强制删除表
    关闭Found duplicated code
    Java操作HDFS代码样例
    RocketMQ:Cannot allocate memory
    Storm的StreamID使用样例(版本1.0.2)
    android studio 编译sdk版降低报错解决方法
  • 原文地址:https://www.cnblogs.com/Kylin-xy/p/tijieCF1304.html
Copyright © 2011-2022 走看看