Codeforces Round #419 (Div. 2)

来源:互联网 发布:js判断ie版本是否大于8 编辑:程序博客网 时间:2024/04/30 09:25

A

过几分钟回文。

#include <cstdio>#include <cstring>#include <iostream>using namespace std;bool check(int hour,int min){    int t1=hour/10;    int t2=hour%10;    int t3=min/10;    int t4=min%10;    if(t1!=t4) return 0;    if(t2!=t3) return 0;    return 1;}int main(){    int hour,min;    scanf("%d:%d",&hour,&min);    if(check(hour,min)){        puts("0");        return 0;    }    for(int i=1;;i++){        min++;        if(min==60){            hour++;            min=0;        }        if(hour==24){            hour=0;        }        if(check(hour,min)){            printf("%d\n",i);            return 0;        }    }     return 0;} 

B

n个菜单,每个菜单在[l,r]区间是好的。
统计[L,R]区间 菜单是好的的个数 >=k 的点。
对于[l,r]
presum[l]++
presum[r+1]–
然后求前缀和的时候就相当于presum[l..r]++了
前缀和统计+树状数组。

#include <bits/stdc++.h>using namespace std;const int maxn = 200000;int presum[200005],n,k,q,l,r;int A[maxn*4];int lowbit(int x){    return x&(-x); }void add(int id){    while(id<=maxn){        A[id]++;        id+=lowbit(id);    }}int ask(int id){    int sum=0;    while(id){        sum+=A[id];        id-=lowbit(id);     }    return sum;}int main(){    freopen("input.txt","r",stdin);    freopen("output.txt","w",stdout);     scanf("%d%d%d",&n,&k,&q);    for(int i=1;i<=n;i++){        scanf("%d%d",&l,&r);        presum[l]++;        presum[r+1]--;    }    for(int i=1;i<=maxn;i++)        presum[i]+=presum[i-1];    for(int i=1;i<=maxn;i++)        if(presum[i]>=k)            add(i);    for(int i=1;i<=q;i++){        scanf("%d%d",&l,&r);        int sum = ask(r) - ask(l-1);        printf("%d\n",sum);    }    return 0;}

C

类似消消乐吧。
直接贪心消除。
注意最小这个条件。
于是需要选择先消列还是行。
先消效益高的,就是数值小的那一个。

#include<bits/stdc++.h>using namespace std;const int maxn = 150;int g[maxn][maxn];int minr[maxn],minc[maxn];int main(){    ios::sync_with_stdio(false);    cin.tie(0),cout.tie(0);    int n,m;    cin>>n>>m;    memset(minr,63,sizeof minr);    memset(minc,63,sizeof minc);    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            cin>>g[i][j];    int sum=0;    if(n<=m){        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++) minr[i]=min(minr[i],g[i][j]);            sum+=minr[i];            for(int j=1;j<=m;j++) g[i][j]-=minr[i];        }        for(int j=1;j<=m;j++){            for(int i=1;i<=n;i++) minc[j]=min(minc[j],g[i][j]);            sum+=minc[j];            for(int i=1;i<=n;i++) g[i][j]-=minc[j];        }    }    else{        for(int j=1;j<=m;j++){            for(int i=1;i<=n;i++) minc[j]=min(minc[j],g[i][j]);            sum+=minc[j];            for(int i=1;i<=n;i++) g[i][j]-=minc[j];        }        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++) minr[i]=min(minr[i],g[i][j]);            sum+=minr[i];            for(int j=1;j<=m;j++) g[i][j]-=minr[i];        }    }    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++) if(g[i][j]){            puts("-1");            return 0;        }    }    cout<<sum<<endl;    for(int i=1;i<=n;i++) if(minr[i]){        for(int k=1;k<=minr[i];k++) cout<<"row "<<i<<endl;    }    for(int i=1;i<=m;i++) if(minc[i]){        for(int k=1;k<=minc[i];k++) cout<<"col "<<i<<endl;    }    return 0;}
原创粉丝点击