Educational Codeforces Round 95
阿新 • • 發佈:2020-09-16
標準上分場 $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 #defineView Codese 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; }
B-Negative Prefixes
英語閱讀題。
#include<iostream> #include<cstring> #include<cstdio> #include<cstring> #includeView Code<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"); } }
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