CF1037簡要題解

 

A:FJOI 神祕數的第一部分,事實上答案是 $\log_2 n$ 。

B:中位數定在中間後計算偏移值。

C:只有在相鄰是 $2$ 比 $1$ 優,簡單判斷即可。

D:模擬題。

E:如果沒有加邊操作,那麼就是經典類似拓撲刪邊,那麼不妨將操作序列倒過來開每條邊是否在答案中。

F:考慮求的是什麼,不難發現答案爲 $\sum_{l,r,k-1|(r-l)} max\{A_l,A_{l+1},...,A_r\}$ ,那麼我們將 $i\bmod k-1$ 相同的看成一族同一處理那麼問題變成求 $\sum_{1\leq l<r} max\{W_l,W_{l+1},...,W_r\}$  ,拿單調隊列加單調棧即可解決。

G:

H:$SAM$ 維護 $endpos$ 模板題。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<queue>
#include<vector>
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#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;
}
int N,Ans,R;
int main(){
    N=read();
    while(R<N){
        Ans++; R+=(R+1);
    }
    printf("%d\n",Ans); return 0;
}
A
#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<queue>
#include<vector>
#define int long long
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#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=2e5+11;
int N,S,A[MAXN];
signed main(){
    N=read(),S=read();
    for(int i=1;i<=N;i++) A[i]=read();
    sort(A+1,A+N+1);
    int ps=(N+1)/2,Ans=abs(A[ps]-S);
    for(int j=1;j<ps;j++){
        if(A[j]>S) Ans+=A[j]-S;
    }
    for(int j=ps+1;j<=N;j++){
        if(A[j]<S) Ans+=S-A[j];
    }
    printf("%lld\n",Ans); return 0;
}
B
#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<queue>
#include<vector>
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#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=1e6+11;
int N,Ans; char S[MAXN],T[MAXN];
bool vis[MAXN];
int main(){
    N=read(); scanf("%s%s",S+1,T+1);
    for(int i=1;i<=N;i++){
        if(vis[i]) continue;
        if(i!=N){
            if(S[i]!=T[i]&&S[i+1]!=T[i+1]&&S[i]!=S[i+1]){
                Ans++; vis[i+1]=1;
                continue;
            }
        }
        if(S[i]!=T[i]) Ans++;
    }
    printf("%d\n",Ans); return 0;
}
C
#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<queue>
#include<vector>
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#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=1e6+11;
int N,Ans; char S[MAXN],T[MAXN];
bool vis[MAXN];
int main(){
    N=read(); scanf("%s%s",S+1,T+1);
    for(int i=1;i<=N;i++){
        if(vis[i]) continue;
        if(i!=N){
            if(S[i]!=T[i]&&S[i+1]!=T[i+1]&&S[i]!=S[i+1]){
                Ans++; vis[i+1]=1;
                continue;
            }
        }
        if(S[i]!=T[i]) Ans++;
    }
    printf("%d\n",Ans); return 0;
}
D
#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<queue>
#include<vector>
#include<queue>
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#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=2e5+11;
vector<pii> vec[MAXN];
int N,M,d[MAXN],U[MAXN],V[MAXN],K,Ans[MAXN];
bool vis[MAXN]; queue<int> que;
int main(){
    //freopen("5.in","r",stdin);
    N=read(),M=read(),K=read();
    for(int i=1;i<=N;i++) vis[i]=1;
    for(int i=1;i<=M;i++) U[i]=read(),V[i]=read(),d[U[i]]++,d[V[i]]++,vec[U[i]].pb(mp(V[i],i)),vec[V[i]].pb(mp(U[i],i));
    for(int i=1;i<=N;i++) if(d[i]<K) que.push(i);
    while(!que.empty()){
        int xx=que.front(); vis[xx]=0; que.pop();
        for(auto pp:vec[xx]){
            int v=pp.fi,t=pp.se; d[v]--;
            if(d[v]==K-1) que.push(v);
        }
    }
    int res=0; for(int i=1;i<=N;i++) res+=vis[i]; 
    Ans[M]=res;
    for(int i=M;i>=2;i--){
        int u=U[i],v=V[i];
        //cerr<<u<<" "<<v<<" "<<vis[u]<<" "<<vis[v]<<" "<<res<<endl;
        if(vis[u]&&vis[v]){
            d[u]--; if(d[u]<K) que.push(u),vis[u]=0;
            d[v]--; if(d[v]<K) que.push(v),vis[v]=0;
            while(!que.empty()){
                int xx=que.front(); res--; que.pop();
                for(auto pp:vec[xx]){
                    int vv=pp.fi,t=pp.se; 
                    if(t>=i) continue;
                    d[vv]--;
                    if(d[vv]==K-1&&vis[vv]) vis[vv]=0,que.push(vv);
                }
            }
        }
        Ans[i-1]=res;
        //for(int j=1;j<=N;j++) cerr<<d[j]<<" ";cerr<<endl;
    }
    for(int i=1;i<=M;i++) printf("%d\n",Ans[i]); return 0;
}/*
5 7 2
1 5
3 2
2 5
3 4
1 2
5 3
1 3
*/
E
#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<queue>
#include<vector>
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define int long long
#define mod 1000000007
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=1e6+11;
deque<int> que; int N,A[MAXN],K,W[MAXN];
int sta[MAXN],tot,vis[MAXN],Ans;
int Query(int x){return (x+K-2)/(K-1);}
signed main(){
    //freopen("7.in","r",stdin);
    N=read(),K=read(); for(int i=1;i<=N;i++) A[i]=read();
    for(int i=1;i<=N;i++){
        while(!que.empty()&&que.front()<=i-K) que.pop_front();
        while(!que.empty()&&A[que.back()]<=A[i]) que.pop_back();
        que.push_back(i); 
        if(i>=K) W[i]=A[que.front()];
    }
    //for(int i=1;i<=N;i++) cerr<<W[i]<<" ";cerr<<endl;
    for(int i=1;i<=N;i++) if(!vis[i]){
        sta[0]=0; int sum=0,tot=0;
        for(int j=i;j<=N;j+=(K-1)){
            vis[j]=1;
            while(tot&&W[sta[tot]]<=W[j]){
                sum-=W[sta[tot]]*((Query(sta[tot])-Query(sta[tot-1]?sta[tot-1]:i)));
                sum=((sum%mod)+mod)%mod;
                tot--;
            }
            if(j!=i){
                sta[++tot]=j;
                sum+=W[sta[tot]]*((Query(sta[tot])-Query(sta[tot-1]?sta[tot-1]:i)));
                sum%=mod;
                //cerr<<"j:"<<j<<" sum:"<<sum<<endl;
            }
            //cerr<<sta[tot]<<" "<<sta[tot]-sta[tot-1]<<endl;
            //cerr<<"j:"<<j<<" sum:"<<sum<<endl;
            Ans+=sum; Ans%=mod;
        }
    }
    printf("%lld\n",Ans); return 0;
}
/*
6 3
6 5 4 3 2 1
*/
/*
5 3
5 8 7 1 9
*/
F

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章