• Codeforces Round #398 (Div. 2) A-E


    分数史上新低

    开场5分钟过了A题,想着这次赌一把手速,先去切C吧

    看完C题觉得这应该是道水题,码了十分钟提交,WA

    想着这明明是道水题,估计少考虑了情况,添了几行再交,WA

    不可能啊,这题都A不掉,和SB有什么区别

    (开始半小时后)A不掉啊,要不去做别的题吧,啊不行,不能对不起我写了这么久的代码,继续debug

    (开始一小时后)心态崩了,辣鸡比赛我不玩了。关了CF跑去写了半道主席树

    (倒数半小时)反正要掉分,今天和这C题死磕吧

    (结束看题解)结论:我和SB有什么区别

    (第二天写BDE题)卧槽这么简单我为什么看都没看,我和SB有什么区别*3

    A. Snacktower

     要搭一座数字下面大上面小的树塔,但数字出现的顺序不定。

    每个时刻拿到一个数字,不能堆到塔上就扔到堆里,能就建塔

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 const int mxn=100010;
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    12     return x*f;
    13 }
    14 priority_queue<int>q;
    15 bool f[mxn];
    16 int main(){
    17     int i,j,x;
    18     int n=read();
    19     f[n+1]=1;
    20     for(i=1;i<=n;i++){
    21         x=read();
    22         q.push(x);
    23         while(!q.empty() && f[q.top()+1]){
    24             f[q.top()]=1;
    25             printf("%d ",q.top());
    26             q.pop();
    27         }
    28         printf("
    ");
    29     }
    30     return 0;
    31 }
    A

    B.The Queue

    模拟,贪心找到一个适合的插入点。

    如果所有人都处理完了,营业还没结束,那主角可以等到最后再过去

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 #define LL long long
     7 using namespace std;
     8 const int mxn=100010;
     9 LL read(){
    10     LL x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    13     return x*f;
    14 }
    15 LL ts,tf,t;
    16 LL w[mxn];
    17 int main(){
    18     int i,j;
    19     ts=read();tf=read();
    20     t=read();
    21     int n=read();
    22     for(i=1;i<=n;i++){w[i]=read();}
    23     if(w[1]>ts){printf("%I64d
    ",ts);return 0;}
    24     LL ans=1e15,pos=-1;
    25     LL smm=ts,last=0;
    26     for(i=1;i<=n;i++){
    27         last=smm-w[i]+1;
    28         if(last<=0){
    29             printf("%I64d
    ",w[i]-1);
    30             return 0;
    31         }
    32         if(smm+t>tf)break;
    33         if(last<ans){
    34             ans=last;pos=w[i]-1;
    35         }
    36         smm+=t;
    37     }
    38     if(smm+t<=tf)pos=smm;
    39     printf("%I64d
    ",pos);
    40     return 0;
    41 }
    B

     C. Garland

    把一棵树分成权值和相等的三部分

    明明只是一个DFS?

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 const int mxn=1000100;
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    12     return x*f;
    13 }
    14 struct edge{
    15     int v,nxt;
    16 }e[mxn<<1];
    17 int hd[mxn],mct=0;
    18 void add_edge(int u,int v){
    19     e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
    20 }
    21 int w[mxn];
    22 int sz[mxn];
    23 int n,smm=0,rt;
    24 int ans[5],cnt=0;
    25 int f[mxn];
    26 void DFS(int u){
    27     f[u]=0;
    28     sz[u]+=w[u];
    29     for(int i=hd[u];i;i=e[i].nxt){
    30         int v=e[i].v;
    31         DFS(v);
    32         sz[u]+=sz[v];
    33 //        if(sz[v]==smm){f[v]=v;}
    34         if(f[u] && f[v]){
    35             ans[1]=f[u];
    36             ans[2]=f[v];
    37         }
    38         if(f[v])f[u]=f[v];
    39     }
    40 /*
    41     cnt=0;
    42     for(int i=hd[u];i;i=e[i].nxt){
    43         int v=e[i].v;
    44         if(f[v]){
    45             f[u]=f[v];
    46             if(f[v]!=ans[1])ans[++cnt]=f[v];
    47             if(cnt==2){
    48                 printf("%d %d
    ",ans[1],ans[2]);
    49                 exit(0);
    50             }
    51         }
    52     }
    53     if(u!=rt && u!=ans[1] && smm*2==sz[u] && cnt){
    54         printf("%d %d
    ",u,ans[1]);exit(0);
    55     }
    56     if(sz[u]==smm)f[u]=u;
    57 */
    58     if(u!=rt && sz[u]==smm*2 && f[u]){
    59         ans[1]=u;
    60         ans[2]=f[u];
    61     }
    62     if(sz[u]==smm)f[u]=u;
    63     return;
    64 }
    65 int main(){
    66     int i,j,u,v;
    67     n=read();
    68     for(i=1;i<=n;i++){
    69         u=read();v=read();
    70         if(!u)rt=i;
    71         else add_edge(u,i);
    72         w[i]=v;smm+=v;
    73     }
    74     if(smm%3){printf("-1
    ");return 0;}
    75     smm/=3;
    76     DFS(rt);
    77     if(ans[1])printf("%d %d
    ",ans[1],ans[2]);
    78     else printf("-1
    ");
    79     return 0;
    80 }
    C

    D. Cartons of milk

    排序+二分答案

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 const int mxn=1000100;
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    12     return x*f;
    13 }
    14 struct node{
    15     int w,id;
    16 }a[mxn],b[mxn];
    17 int cmp(const node a,const node b){
    18     return a.w<b.w;
    19 }
    20 int n,m,k;
    21 bool check(int lim){
    22     int i,j;
    23     int day=0,now=0;
    24     for(i=1,j=m-lim+1;i<=n || j<=m; ){
    25         if(i<=n && (j>m || a[i].w<=b[j].w)){
    26             now++;
    27             if(now>k){now-=k;day++;}
    28             if(a[i].w<day)return 0;
    29             i++;
    30         }
    31         else{
    32             now++;
    33             if(now>k){now-=k;day++;}
    34             if(b[j].w<day)return 0;
    35             j++;
    36         }
    37     }
    38     return 1;
    39 }
    40 int main(){
    41     int i,j;
    42     n=read();m=read();k=read();
    43     for(i=1;i<=n;i++){a[i].w=read();}
    44     for(i=1;i<=m;i++){b[i].w=read();b[i].id=i;}
    45     sort(a+1,a+n+1,cmp);
    46     sort(b+1,b+m+1,cmp);
    47     int l=0,r=m,ans=0;
    48     while(l<=r){
    49         int mid=(l+r)>>1;
    50         if(check(mid)){
    51             ans=mid;
    52             l=mid+1;
    53         }
    54         else r=mid-1;
    55     }
    56     if(!ans)if(!check(0))ans=-1;
    57     printf("%d
    ",ans);
    58     for(i=m-ans+1;i<=m;i++){
    59         printf("%d ",b[i].id);
    60     }
    61     return 0;
    62 }
    D

    E. Change-free

    起初有个脑洞,先每次都付纸币,然后贪心找不满度最大的日子“退流”。对正确性没有自信,悄悄看了看dalao们的代码,发现写法都是每次付硬币,然后贪心找不满度最小的日子改付纸币。

    后一种好写,就写后一种咯

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 const int mxn=100010;
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    12     return x*f;
    13 }
    14 struct cmp{
    15     int w,id;
    16     friend bool operator < (const cmp a,const cmp b){
    17         return a.w>b.w;
    18     }
    19 };
    20 priority_queue<cmp> q;
    21 bool note[mxn];
    22 int n,m;
    23 int c[mxn],w[mxn];
    24 long long ans=0;
    25 void solve(){
    26     int i,j;
    27     for(i=1;i<=n;i++){
    28         int cost=c[i]%100;if(!cost)continue;
    29         int res=100-cost;
    30 //        printf("res:%d
    ",res*w[i]);
    31         q.push((cmp){res*w[i],i});
    32         m-=cost;
    33         while(m<0){
    34             cmp tmp=q.top();q.pop();
    35             ans+=tmp.w;
    36             note[tmp.id]^=1;
    37             m+=100;
    38         }
    39     }
    40     return;
    41 }
    42 int main(){
    43     int i,j;
    44     n=read();m=read();
    45     for(i=1;i<=n;i++)c[i]=read();
    46     for(j=1;j<=n;j++)w[j]=read();
    47     solve();
    48     printf("%I64d
    ",ans);
    49     for(i=1;i<=n;i++){
    50         if(note[i])printf("%d %d
    ",(c[i]+99)/100,0);
    51         else printf("%d %d
    ",c[i]/100,c[i]%100);
    52     }
    53     return 0;
    54 }
    E
  • 相关阅读:
    微信小程序Rx 引入 调用合并的方法
    小程序 引入 es-canvas wx:for 单页面渲染多个for不同数据
    jquery操作数组对象
    Docker MySQL 8 主从配置
    CentOS 7 安装 LNMP
    lnmp1.6 配置负载均衡
    Nginx + PHP-FPM 参数优化、性能监视和问题排查
    「查缺补漏」巩固你的Nginx知识体系
    Android生成SHA1(证书指纹)
    android studio 如何把依赖导出成 jar
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6416292.html
Copyright © 2020-2023  润新知