Educational Codeforces Round 95

标准上分场 $unrated$ (可以早睡觉。

A-Buying Torches

出题人?

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define int long long
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
int T,a,b,c;
signed main(){
    T=read();
    while(T--){
        a=read(),b=read(),c=read();
        int w=(b+1)*c-1;a--;
        if(w%a) printf("%lld
",w/a+1+c);
        else printf("%lld
",(w/a)+c);
    }return 0;
}
 
View Code

B-Negative Prefixes

英语阅读题。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
const int MAXN=101;
int T;
int A[MAXN],N,tmp[MAXN],B[MAXN];
bool cmp(int x,int y){return x>y;}
int main(){
    //freopen("1.in","r",stdin);
    T=read();
    while(T--){
        tmp[0]=0;N=read();
        for(int i=1;i<=N;i++) A[i]=read();
        for(int i=1;i<=N;i++){
            B[i]=read();
            if(!B[i]) tmp[++tmp[0]]=A[i];
        }sort(tmp+1,tmp+tmp[0]+1,cmp);int tot=0;
        for(int i=1;i<=N;i++){
            if(!B[i]) printf("%d ",tmp[++tot]);
            else printf("%d ",A[i]);
        }printf("
");
    }
}
 
View Code

C-Mortal Kombat Tower

英语阅读题。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define int long long
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
const int MAXN=2e5+11;
int T,N,f[MAXN][2],A[MAXN],INF=INT_MAX;
signed main(){
    //freopen("1.in","r",stdin);
    T=read();
    while(T--){
        N=read();for(int i=1;i<=N;i++) A[i]=read();
        for(int i=0;i<=N+1;i++) for(int j=0;j<=1;j++) f[i][j]=INF;
        f[0][0]=0;
        for(int i=0;i<N;i++){
            for(int j=0;j<=1;j++){
                if(!j){
                    f[i+1][j^1]=min(f[i+1][j^1],f[i][j]+A[i+1]);
                    f[i+2][j^1]=min(f[i+2][j^1],f[i][j]+A[i+1]+A[i+2]);
                }else{
                    f[i+1][j^1]=min(f[i+1][j^1],f[i][j]);
                    f[i+2][j^1]=min(f[i+2][j^1],f[i][j]);
                }
            }
        }printf("%lld
",min(f[N][0],f[N][1]));
    }return 0;
}
View Code

D-Trash Problem

发现答案一定是 $A_n-A_1+min{A_i-A_{i+1}}$ ,直接拿 $multiset$ 维护一下即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<climits>
#include<bitset>
#include<set>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
multiset<int> s1,s2;
multiset<int>::iterator it,it1,it2,it3;
int N,Q,siz;
void ins(int u){
    siz++;if(siz==1){s1.insert(u);return;}
    it=s1.lower_bound(u);it1=it;it2=(--it); swap(it1,it2);
    if(it1!=s1.end()&&it2!=s1.end()&&(*it1>0)&&(*it2>0)) s2.erase(s2.find(*it1-*it2));
    if(it1!=s1.end()&&(*it1>0)) s2.insert(*it1-u);
    if(it2!=s1.end()&&(*it2>0)) s2.insert(u-*it2);
    s1.insert(u);
    return;
}
void del(int u){
    siz--;if(!siz){s1.erase(u);return;}
    it=s1.lower_bound(u);it3=it;
    it1=(--it);it2=(++it3);
    if(it1!=s1.end()&&(*it1>0))s2.erase(s2.find(*it1-u));
    if(it2!=s1.end()&&(*it2>0))s2.erase(s2.find(u-*it2));
    if(it1!=s1.end()&&it2!=s1.end()&&(*it1>0)&&(*it2>0))s2.insert(*it1-*it2);
    s1.erase(u);return;
}
int Query(){
    if(siz<=2) return 0;it=s1.end();
    it3=s1.begin();int Minn=*(++it3),Maxn=*(--it);
    int ff=*(s2.begin());
    return Maxn-Minn+ff;
}
int main(){
    N=read(),Q=read();s1.insert(0);
    for(int i=1;i<=N;i++) ins(read());
    //return 0;
    printf("%d
",Query());
    for(int i=1;i<=Q;i++){
        int opt=read(),w=read();
        if(opt) ins(w);else del(w);
        printf("%d
",Query());
    }return 0;
}
View Code

E-Expected Damage

为啥这题会是 $E$ 。根据期望的线性算一下即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define int long long
#define mod 998244353
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
const int MAXN=2e5+11;
int N,M,d[MAXN],S[MAXN];
pii f[MAXN];
int ksm(int a,int b){
    int ans=1;while(b){if(b&1) ans*=a,ans%=mod;a*=a,a%=mod;b>>=1;}
    return ans;
}
signed main(){
    //freopen("1.in","r",stdin);
    N=read(),M=read();for(int i=1;i<=N;i++) d[i]=read();
    sort(d+1,d+N+1);for(int i=1;i<=N;i++) S[i]=S[i-1]+d[i],S[i]%=mod;
    for(int i=1;i<=M;i++){
        int a=read(),b=read();
        int k=N-(lower_bound(d+1,d+N+1,b)-d)+1,l=N-k+1;
        if(a>k){printf("0
");continue;}
        int sum1=S[N]-S[l-1],sum2=S[l-1],inv1=ksm(k,mod-2),inv2=ksm(k+1,mod-2);
        int res1=(sum1-(a*inv1%mod*sum1%mod)+mod)%mod,res2=(sum2-(a*inv2%mod*sum2%mod)+mod)%mod;
        printf("%lld
",(res1+res2)%mod);
    }return 0;
}
View Code

F-Equal Product

不怎么会。

G-Three Occurrences

枚举 $r$ ,对于一种颜色只有选和没选两种情况,计算可能的左端点即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<climits>
#include<bitset>
#define int long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
const int MAXN=5e5+11;
pii operator+(pii x1,pii x2){
    if(x1.fi<x2.fi) return x2;
    else if(x1.fi>x2.fi) return x1;
    return mp(x1.fi,x1.se+x2.se);
}
int N,A[MAXN];
struct Segment{
    pii f[MAXN<<2];int tag[MAXN<<2];
    void build(int k,int l,int r){
        f[k].fi=0,f[k].se=1;if(l==r) return;
        int mid=(l+r)>>1;build(k<<1,l,mid),build(k<<1|1,mid+1,r);
        f[k]=f[k<<1]+f[k<<1|1];
    }
    void pushdown(int k){
        if(!tag[k]) return;
        f[k<<1].fi+=tag[k],f[k<<1|1].fi+=tag[k];
        tag[k<<1]+=tag[k],tag[k<<1|1]+=tag[k];
        tag[k]=0;return;
    }
    void Add(int k,int l,int r,int x,int y,int w){
        if(x>y) return;if(x<=l&&r<=y){f[k].fi+=w;tag[k]+=w;return;}
        pushdown(k);int mid=(l+r)>>1;
        if(x<=mid) Add(k<<1,l,mid,x,y,w);
        if(mid<y) Add(k<<1|1,mid+1,r,x,y,w);
        f[k]=f[k<<1]+f[k<<1|1];return;
    }
    pii Query(int k,int l,int r,int x,int y){
        if(x<=l&&r<=y) return f[k];
        pushdown(k);int mid=(l+r)>>1;pii p;p.fi=0,p.se=0;
        if(x<=mid) p=p+Query(k<<1,l,mid,x,y);
        if(mid<y) p=p+Query(k<<1|1,mid+1,r,x,y);
        f[k]=f[k<<1]+f[k<<1|1];return p;
    }
}S;
vector<int> vec[MAXN];int Ans;
void ins(int ps){
    //printf("=============
");
    int siz=vec[A[ps]].size();int l1=vec[A[ps]][siz-4],l2=vec[A[ps]][siz-3],Ps=vec[A[ps]][siz-1];
    //cerr<<"ps:"<<Ps<<" l1:"<<l1<<" l2:"<<l2<<endl;
    S.Add(1,1,N,l1+1,l2,-1);S.Add(1,1,N,Ps+1,N,-1);
    vec[A[ps]].pb(ps);
    siz=vec[A[ps]].size();l1=vec[A[ps]][siz-4],l2=vec[A[ps]][siz-3],Ps=vec[A[ps]][siz-1];
    //cerr<<"ps:"<<Ps<<" l1:"<<l1<<" l2:"<<l2<<endl;
    S.Add(1,1,N,l1+1,l2,1);S.Add(1,1,N,Ps+1,N,1);
    //printf("=============
");
    return;
}
signed main(){
    //freopen("1.in","r",stdin);
    N=read();for(int i=1;i<=N;i++) A[i]=read();
    for(int i=1;i<=N;i++) for(int j=0;j<=4;j++) vec[i].pb(0);S.build(1,1,N);for(int i=1;i<=N;i++) S.Add(1,1,N,1,N,1);
    //pii p=S.Query(1,1,N,2,3);printf("%d %d
",p.fi,p.se);return 0;
    for(int i=1;i<=N;i++){
        ins(i);pii p=S.Query(1,1,N,1,i);
        if(p.fi==N) Ans+=p.se;
    }printf("%lld
",Ans);return 0;
}/*
  9
  1 2 2 2 1 1 2 2 2
  */
 
View Code
 

 

原文地址:https://www.cnblogs.com/si-rui-yang/p/13676339.html