Codeforces contest 376&375 recordings

比赛记录

# CodeForces - 376A

Solution

杠杆平衡,注意开long long.

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char s[1000005];
int main() {
    int p;
    long long l=0,r=0;
    scanf("%s",s);
    int len=strlen(s);
    for(int i=0;i<len;i++) if(s[i]=='^') {p=i;break;}
    for(int i=p-1;i>=0;i--) {
        if(isdigit(s[i])) l+=(long long)(p-i)*(s[i]-'0');
    }
    for(int i=p+1;i<len;i++) {
        if(isdigit(s[i])) r+=(long long)(i-p)*(s[i]-'0');
    }
    if(l>r) puts("left");
    else if(l<r) puts("right");
    else puts("balance");
    return 0;
}

# CodeForces - 376B

Solution

这玩意是能贪心的,统计每个人总共欠的和借被人的,然后贪心地尽量多的抵销即可

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x,y,c,money[105];
int abs(int x) {return x>0?x:-x;}
int main() {
    int ans=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&c),money[x]+=c,money[y]-=c;
    for(int i=1;i<=n;i++) ans+=abs(money[i]);
    printf("%d\n",ans/2);
    return 0;
}

# CodeForces - 375C

Solution

我的是非正解乱搞,正解这么说的:1、6、8、9组成的四位数能够成7的完整的剩余系,然后把非零数全放在前面,1689组合一下,再放0.

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char s[1000005];
int di[1000000];
bool used[11];
int main() {
    int len,now=0;
    scanf("%s",s);
    len=strlen(s);
    int p=len,cnt=0,tot=0;
    while(cnt<4) {
        p--;
        di[++tot]=s[p]-'0';
        if(!used[s[p]-'0']) used[s[p]-'0']=1,cnt++;
    }
    for(int i=0;i<p;i++) now=(now*10+s[i]-'0')%7;
    sort(di+1,di+tot+1);
    int u=now;
    bool found=0;
    for(int i=1;i<=tot;i++) u=(u*10+di[i])%7;
    if(!u) found=1;
    while(!found&&next_permutation(di+1,di+tot+1)) {
        u=now;
        for(int i=1;i<=tot;i++) u=(u*10+di[i])%7;
        if(!u) found=1;
    }
    for(int i=0;i<p;i++) printf("%c",s[i]);
    for(int i=1;i<=tot;i++) printf("%d",di[i]);
    printf("\n");
    return 0;
}

# CodeForces - 375D

Solution

排个序,贪个心即可.

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char s[5015][5015];
int arr[5015],ri[5015][5015],buc[5015];
int n,m;
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
    memset(ri,0,sizeof(ri));
    for(int i=1;i<=n;i++) {
        for(int j=m;j>=1;j--) if(s[i][j]=='1') {
            if(s[i][j+1]=='1') ri[i][j]=ri[i][j+1]+1;
            else ri[i][j]=1;
        }
    }
    int ans=0,cnt;
    for(int j=1;j<=m;j++) {
        memset(buc,0,sizeof(buc));
        for(int i=1;i<=n;i++) buc[ri[i][j]]++;
        cnt=0;
        for(int i=5000;i>0;i--) {
            if(!buc[i]) continue;
            cnt+=buc[i];
            ans=max(ans,cnt*i);
        }
    }
    printf("%d\n",ans);
    return 0;
}

赛后补题

# CodeForces - 375E

Solution

类似SCOI的围豆豆,状态压缩数组要开大

#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
struct node{int x,y,stat;};
char map[25][25];
int x[20],y[20],w[20],f[50][50][300];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
queue<node> Q;
int main() {
    int n,m,cnt=0,sx,sy;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        scanf("%s",map[i]+1);
        for(int j=1;j<=m;j++) {
            if(isdigit(map[i][j])) {
                x[map[i][j]-'0']=i;
                y[map[i][j]-'0']=j;
                cnt++;
            }
        }
    }
    int ccf=cnt;
    for(int i=1;i<=cnt;i++) scanf("%d",&w[i]);
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            if(map[i][j]=='B') {
                x[++cnt]=i;
                y[cnt]=j;
                w[cnt]=0;
            } else if(map[i][j]=='S') {
                map[i][j]='.';
                sx=i; sy=j;
            }
        }
    }
    memset(f,-0x3f,sizeof(f));
    Q.push((node){sx,sy,0});
    f[sx][sy][0]=0;
    node now;
    int nx,ny,nt,nm;
    int mx,my,mt,mm;
    while(!Q.empty()) {
        now=Q.front();
        Q.pop();
        nx=now.x;
        ny=now.y;
        nt=now.stat;
        nm=f[nx][ny][nt];
        for(int i=0;i<4;i++) {
            mx=nx+dx[i];
            my=ny+dy[i];
            if(map[mx][my]!='.') continue;
            mm=nm-1;
            mt=nt;
            if(dy[i]!=0) {
                for(int j=1;j<=cnt;j++) if(y[j]==max(my,ny)&&x[j]<mx) {
                    mt^=(1<<(j-1));
                    if(mt&(1<<(j-1))) mm+=w[j];
                    else mm-=w[j];
                }
            }
            if(f[mx][my][mt]<-1000000) {
                f[mx][my][mt]=mm;
                Q.push((node){mx,my,mt});
            }
        }
    }
    int ans=0;
    for(int j=0;j<(1<<ccf);j++) ans=max(ans,f[sx][sy][j]);
    printf("%d\n",ans);
    return 0;
}

# CodeForces - 375E

Solution

分块,然后用一下莫队的思想省时间.

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100005;
struct node{int l,r,bound,id;}que[N];
int arr[N],clo=0;
int fir[N],nxt[N*2],v[N*2],ct=0;
int L[N],R[N],blocksize;
int nar[N],cnt[N],suf[N],ans[N];
inline void add(int x,int y) {
    v[++ct]=y;
    nxt[ct]=fir[x];
    fir[x]=ct;
}
inline void dfs(int x,int pa) {
    L[x]=++clo;
    nar[L[x]]=arr[x];
    for(int i=fir[x];i;i=nxt[i]) if(v[i]!=pa) dfs(v[i],x);
    R[x]=clo;
}
inline bool cmp(node a,node b) {
    if(a.r/blocksize==b.r/blocksize) return a.l<b.l;
    return a.r<b.r;
}
int main() {
    int n,m,x,y;
    scanf("%d%d",&n,&m);
    blocksize=(int)sqrt(n);
    for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
    for(int i=1;i<n;i++) {
        scanf("%d%d",&x,&y);
        add(x,y); add(y,x);
    }
    dfs(1,-1);
    for(int i=1;i<=m;i++) {
        scanf("%d%d",&x,&y);
        que[i].l=L[x];
        que[i].r=R[x];
        que[i].id=i;
        que[i].bound=y;
    }
    sort(que+1,que+m+1,cmp);
    int l=1,r=0;
    for(int i=1;i<=m;i++) {
        while(l<que[i].l) {
            suf[cnt[nar[l]]]--;
            cnt[nar[l]]--;
            l++;
        }
        while(l>que[i].l) {
            l--;
            cnt[nar[l]]++;
            suf[cnt[nar[l]]]++;
        }
        while(r>que[i].r) {
            suf[cnt[nar[r]]]--;
            cnt[nar[r]]--;
            r--;
        }
        while(r<que[i].r) {
            r++;
            cnt[nar[r]]++;
            suf[cnt[nar[r]]]++;
        }
        ans[que[i].id]=suf[que[i].bound];
    }
    for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值