noip模擬40
阿新 • • 發佈:2021-08-15
A. 送花
首先當右端點右移時最優坐決策點不是單調的,因為加入一個數後可能使一個之前位置的貢獻變小,那麼原來依賴其貢獻的最優區間可能左端點左移更優
線段樹維護區間的貢獻
對於右端點右移一位的時候,將這個值上上一個位置到上一個位置的值加當前貢獻,上一個位置到這個位置的值減當前貢獻,然後線段樹維護區間最大值即可
B. 星空
首先是距離的轉化,先把座標系
C. 零一串
程式碼實現
#include<bits/stdc++.h> using namespace std; #define int long long deque<int>q; const int maxn=1e7+5; const int mod=998244353; char c[maxn]; int t,n,pos[maxn],cnt,all,dis[maxn],cf[maxn],sum[maxn],ans,num,ori; bool ans1[maxn]; int po(int a,int b){ int ans=1; while(b){ if(b&1)ans=1ll*ans*a%mod; a=1ll*a*a%mod; b>>=1; } return ans; } signed main(){ // freopen("shuju.in","r",stdin); // freopen("my.out","w",stdout); cin>>t; scanf("%s",c+1); n=strlen(c+1); for(int i=1;i<=n;i++){ if(c[i]=='1')num++; else ori+=num; } ori%=mod; for(int i=1;i<=n;i++){ if(c[i]=='1')pos[++cnt]=i; } for(int i=1;i<=t;i++){ q.push_back(i); } for(int k=1;k<=cnt;k++){ all++; if(q.back()+all>t&&q.size())q.pop_back(); q.push_front(1-all); for(int j=1;j<=pos[k]-pos[k-1]-1&&q.size();j++){ cf[q.front()+all]++; cf[min(cnt-k+q.front()+all+1,t+1)]--; q.pop_front(); } dis[k]=t-q.size(); ans1[pos[k]-dis[k]]=1; } for(int i=0;i<=t;i++){ if(i)sum[i]=(sum[i-1]+cf[i])%mod; ori+=sum[i]; ori%=mod; ans^=(po(233,i)*ori%mod); } for(int i=1;i<=n;i++)cout<<ans1[i]; cout<<endl<<ans; return 0; }