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; }
#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; }
#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; }
#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; }
#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 */
#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 */