Codeforces Round #546 (Div. 2)(A,B,C,D,E)

题目链接:http://codeforces.com/contest/1136/problem

第一题(模拟):

#include<bits/stdc++.h>
using namespace std;

#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long

#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e2+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,a[maxn],b[maxn],x;
int main(){
    cin>>n;
    rep(i,1,n+1) cin>>a[i]>>b[i];cin>>x;
    int i=1;
    for(;i<=n;i++) if(x<=b[i]&&x>=a[i]) break;
    cout<<n-i+1<<endl;
    return 0;
}

第二题(数学规律):

#include<bits/stdc++.h>
using namespace std;

#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long

#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e2+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,k;
int main(){
    cin>>n>>k;
    int tmp=min(k-1,n-k);
    cout<<n*3+tmp<<endl;
    return 0;
}

第三题(数学思维):、

#include<bits/stdc++.h>
using namespace std;

#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long

#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e2+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,m,a[maxn][maxn],b[maxn][maxn];
bool judge(int x,int y){
    return x>=0&&x<n&&y>=0&&y<m;
}
int main(){
    scanf("%d%d",&n,&m);
    rep(i,0,n) rep(j,0,m) scanf("%d",&a[i][j]);
    rep(i,0,n) rep(j,0,m) scanf("%d",&b[i][j]);
        int tp1[maxn],tp2[maxn];
        int cnt1=0,cnt2=0;
        int flag=1;
    for(int i=0;i<n&&flag;i++){
        int tx=i,ty=0;
        cnt1=0,cnt2=0;
        while(judge(tx,ty)){
            tp1[cnt1++]=a[tx][ty];
            tp2[cnt2++]=b[tx][ty];
            tx--,ty++;
        }
        sort(tp1,tp1+cnt1);
        sort(tp2,tp2+cnt2);
        rep(j,0,cnt1) if(tp1[j]!=tp2[j]) {flag=0;break;}
    }
    for(int i=0;i<m&&flag;i++){
        int tx=n-1,ty=i;
        cnt1=0,cnt2=0;
        while(judge(tx,ty)){
            tp1[cnt1++]=a[tx][ty];
            tp2[cnt2++]=b[tx][ty];
            tx--,ty++;
        }
        sort(tp1,tp1+cnt1);
        sort(tp2,tp2+cnt2);
        rep(j,0,cnt1) if(tp1[j]!=tp2[j]) {flag=0;break;}
    }
    if(flag) puts("YES");
    else puts("NO");

    return 0;
}

第四题(贪心+排序):

#include<bits/stdc++.h>
using namespace std;

#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long

#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e5+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,m;
int pos[maxn],a[maxn];
struct node{
    int x;
    bool operator<(const node& y){
        return pos[x]<pos[y.x];
    }
};
vector<node> tmp[maxn];
int main(){
    scanf("%d%d",&n,&m);
    rep(i,1,n+1){
        scanf("%d",&a[i]);
        pos[a[i]]=i;
    }
    int tp=a[n];
    rep(i,0,m){
        int x,y;
        scanf("%d%d",&x,&y);
        tmp[x].push_back(node{y});
    }
    for(int i=n-1;i>=1;i--){
        if(tmp[a[i]].size()){
            int j=0,flag=0;
            sort(tmp[a[i]].begin(),tmp[a[i]].end());
            while(j++<tmp[a[i]].size()){
                int tx=tmp[a[i]][j-1].x;
                if(pos[tx]-j>pos[a[i]]) break;
                if(tx==tp) {flag=1;break;}
            }
            if(flag){
                j=0;
                while(j++<tmp[a[i]].size()){
                    int tx=tmp[a[i]][j-1].x;
                   /// cout<<tx<<endl;
                    if(pos[tx]==pos[a[i]]+1)
                        swap(pos[tx],pos[a[i]]);
                }
            }
        }
    }
    printf("%d\n",n-pos[tp]);
    return 0;
}

第五题(线段树+二分): 

#include<bits/stdc++.h>
using namespace std;

#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long

#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=1e5+5;
const int ub=1e6;
const ll INF=-1e18;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll a[maxn],k[maxn];
ll n,q;
int x,y;
int root[maxn<<2];
ll sum[maxn<<2],maxv[maxn<<2],lazy[maxn<<2];
void build(lrt){
    lazy[rt]=INF;
    if(l==r){
        maxv[rt]=sum[rt]=a[l];
        return ;
    }
    int mid=l+r>>1;
    build(lson),build(rson);
    maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int l,int r,int mid){
    if(lazy[rt]!=INF){
        sum[rt<<1]=1LL*(mid-l+1)*lazy[rt];
        sum[rt<<1|1]=1LL*(r-mid)*lazy[rt];
        maxv[rt<<1]=lazy[rt];
        maxv[rt<<1|1]=lazy[rt];
        lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
        lazy[rt]=INF;
    }
}
void update(int l,int r,int rt,int L,int R,ll v){
    if(L>R) return ;
    if(L<=l&&r<=R){
        sum[rt]=1LL*(r-l+1)*v;
        maxv[rt]=lazy[rt]=v;
        return ;
    }
    int mid=l+r>>1;
    pushdown(rt,l,r,mid);
    if(L<=mid) update(l,mid,rt<<1,L,R,v);
    if(mid<R) update(mid+1,r,rt<<1|1,L,R,v);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
    return ;
}
ll query1(int l,int r,int rt,int L,int R){
    if(L<=l&&r<=R) return sum[rt];
    int mid=l+r>>1;
    pushdown(rt,l,r,mid);
    ll ret=0;
    if(L<=mid) ret+=query1(l,mid,rt<<1,L,R);
    if(mid<R) ret+=query1(mid+1,r,rt<<1|1,L,R);
    return ret;
}
ll query2(int l,int r,int rt,int L,int R){
    if(L<=l&&r<=R) return maxv[rt];
    int mid=l+r>>1;
    pushdown(rt,l,r,mid);
    ll ret=-mod;
    if(L<=mid) ret=max(ret,query2(l,mid,rt<<1,L,R));
    if(mid<R) ret=max(ret,query2(mid+1,r,rt<<1|1,L,R));
    return ret;
}
int main(){
    mst(k,0),mst(a,0);
    cin>>n;
    rep(i,1,n+1) cin>>a[i];
    rep(i,1,n) cin>>k[i],k[i]+=k[i-1];
    rep(i,1,n+1) a[i]-=k[i-1];
    rep(i,1,n) k[i]+=k[i-1];
    build(1,n,1);///
    cin>>q;
    string op;
    while(q--){
        cin>>op;
        if(op[0]=='s'){
            cin>>x>>y;
            cout<<query1(1,n,1,x,y)+k[y-1]-k[max(0,x-2)]<<endl;
        }else{
            cin>>x>>y;
            ll v=query1(1,n,1,x,x)+y;
            int l=x,r=n,ans=r;
            while(l<=r){
                int mid=l+r>>1;
                if(query2(1,n,1,x,mid)<=v) ans=mid,l=mid+1;
                else r=mid-1;
            }
            update(1,n,1,x,ans,v);
        }
    }
    return 0;
}

 

 

猜你喜欢

转载自blog.csdn.net/qq_37451344/article/details/88413124