微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Codeforces Round #546 (Div. 2)

题目编号1136

A

暴力咯。。

#include <cstdio> 
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 105;

int n,m;
struct A{
    int l,r;
}a[N];

int main(){
    scanf("%d",&n);
    for(int i = 1; i <= n; ++i){
        scanf("%d%d",&a[i].l,&a[i].r); 
    }
    scanf("%d",&m);
    for(int i = 1; i <= n; ++i){
        if(a[i].r >= m){
            printf("%d\n",n - i + 1);
            return 0;
        }
    }
    return 0;   
}

B

先往少的一边跳

#include <cstdio> 
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 105;

int n,k;

int main(){
    scanf("%d%d",&n,&k);
    printf("%d",n + 1 + n - 1 + min(k - 1,n - k) + n);
    return 0;   
}

C

同一斜行上点不变

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 505;
const int M = 5e5 + 5;

int n,m;
int a[N][N],b[N][N];
int lsh[M],lsize;
long long cnt[2][N << 1];
long long c2[2][N << 1];
//bool flag;

int main(){
    scanf("%d%d",&m);
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            scanf("%d",&a[i][j]);
            lsh[++lsize] = a[i][j];
        }
    }
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            scanf("%d",&b[i][j]);
            lsh[++lsize] = b[i][j];
        }
    }
    sort(lsh + 1,lsh + lsize + 1);
    lsize = unique(lsh + 1,lsh + lsize + 1) - lsh - 1;
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            /*if((i == 1 && j == 1) || (i == n && j == m)){
                if(a[i][j] != b[i][j]){
                    printf("NO\n");
                    return 0;
                }       
            }*/ 
            cnt[0][i + j - 1] += lower_bound(lsh + 1,lsh + lsize + 1,a[i][j]) - lsh;
            cnt[1][i + j - 1] += lower_bound(lsh + 1,b[i][j]) - lsh;
            c2[0][i + j - 1] ^= lower_bound(lsh + 1,a[i][j]) - lsh;
            c2[1][i + j - 1] ^= lower_bound(lsh + 1,b[i][j]) - lsh;
        }
    }
    for(int i = 1; i <= n + m - 1; ++i){
        if(cnt[0][i] != cnt[1][i] || c2[0][i] != c2[1][i]){
            printf("NO\n");
            return 0;
        }
    }
    printf("YES\n");
    return 0;   
}

D

计算出度 记录能到达最后的位置

#include <cstdio> 
#include <algorithm>
#include <cmath>
#include <cstring>
#include <bitset>
using namespace std;
const int N = 3e5 + 5;

struct Edge{
    int v,next;
}edge[N << 1];
int head[N],esize;
inline void addedge(int x,int y){
    edge[++esize] = (Edge){y,head[x]};
    head[x] = esize;
}
int n,m,ans;
int a[N];
int d[N]; 

inline void ins(int x){
    for(int i = head[x],vv; ~i; i = edge[i].next){
        vv = edge[i].v;
        ++d[vv];
    }
}

int main(){
    memset(head,-1,sizeof(head));
    scanf("%d%d",&m);
    for(int i = 1; i <= n; ++i){
        scanf("%d",&a[i]);
    }
    for(int i = 1,x,y; i <= m; ++i){
        scanf("%d%d",&x,&y);
        addedge(y,x);
        //++d[x];
    }
    ans = 0;
    ins(a[n]);
    for(int i = n - 1; i >= 1; --i){
//      printf("%d\n",d[a[i]]);
        if(d[a[i]] == n - i){
            --n;
            ++ans;
        }
        else{
            ins(a[i]);
        } 
    }
    printf("%d",ans);
    return 0;   
}

E

分块暴力维护

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 1e5 + 5;
const int M = 500;
int n,m;
long long a[N],b[N],sb[N];

struct Bl{
    long long fir[M],sum[M],atag[M];
    int size,cnt,bel[N];
    int l[N],r[N];
    void build(){
        size = sqrt(n);
        cnt = (n - 1) / size + 1;
        for(int i = 1; i <= cnt; ++i){
            l[i] = r[i - 1] + 1,r[i] = min(n,l[i] + size - 1);
            for(int j = l[i]; j <= r[i]; ++j){
                sum[i] += a[j];
                bel[j] = i;
                atag[i] += sb[j - 1] - sb[l[i] - 1];
            }
            fir[i] = a[l[i]];
        }
    }
    void update(int x){
        a[l[x]] = fir[x]; sum[x] = a[l[x]];
        for(int i = l[x] + 1; i <= r[x]; ++i){
            a[i] = max(a[i],a[i - 1] + b[i - 1]);
            sum[x] += a[i];
        }
    }
    void ins(int x,int y){
        int pos = bel[x];
        update(pos);
        a[x] += y; 
        if(x == l[pos]) fir[pos] += y;
        update(pos);
        
        int end = cnt; //?????????????????!! 
        for(int i = pos + 1; i <= cnt; ++i)
            if(fir[i] > a[x] + sb[l[i] - 1] - sb[x - 1]){end = i - 1; break;}
        for(int i = pos + 1; i < end; ++i){
            fir[i] = a[x] + sb[l[i] - 1] - sb[x - 1];
            sum[i] = 1ll * (r[i] - l[i] + 1) * fir[i] + atag[i];
        }
        if(end != pos){
            fir[end] = a[x] + sb[l[end] - 1] - sb[x - 1];
            update(end);
        }
    }
    long long qry(int x,int y){
        long long res = 0;
        int px = bel[x],py = bel[y];
        if(px == py){
            update(px);
            for(int i = x; i <= y; ++i) res += a[i];
            return res;
        }
        update(px);
        for(int i = x; i <= r[px]; ++i) res += a[i];
        update(py);
        for(int i = l[py]; i <= y; ++i) res += a[i];

        for(int i = px + 1; i < py; ++i){
            res += sum[i];
        }
        return res;
    }
}bl;


int main(){
    scanf("%d",&n);
    for(int i = 1; i <= n; ++i){
        scanf("%lld",&a[i]);
    }
    for(int i = 1; i < n; ++i){
        scanf("%lld",&b[i]);
        sb[i] = sb[i - 1] + b[i];
    }
    
    bl.build();
    scanf("%d",&m);
    char opt[10];
    for(int i = 1,y; i <= m; ++i){
        scanf("%s%d%d",opt,&y);
        if(opt[0] == '+'){
            bl.ins(x,y);
        }
        else {
            printf("%lld\n",bl.qry(x,y));
        }
    }
    return 0;   
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。