1. 程式人生 > 實用技巧 >Educational Codeforces Round 95

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\n",w/a+1+c); else printf("%lld\n",(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("\n"); } }
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\n",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\n",Query());
    for(int i=1;i<=Q;i++){
        int opt=read(),w=read();
        if(opt) ins(w);else del(w);
        printf("%d\n",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\n");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\n",(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("=============\n");
    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("=============\n");
    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\n",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\n",Ans);return 0;
}/*
  9
  1 2 2 2 1 1 2 2 2
  */
 
View Code