4.14省選模擬
阿新 • • 發佈:2022-04-14
笑,信心賽被我打成了喪失信心賽
\(T1\)
\(f[i][j]=f[i-1][j]+f[i-1][j-1]+f[i-2][j-1]\)
然後合併\(dp\)式子,使用分治\(NTT\)
\(T2\)
奇偶建圖,\(dfs\)求方案
#include<bits/stdc++.h> #define INF 2147483647 #define MAXN 2000005 #define MAXM 1005 using namespace std; int head[MAXM],nxt[MAXN],val[MAXN],to[MAXN],tot=1; vector<int>match[MAXM],Ans[MAXM],rd; int dis[MAXM],a[MAXM],Cut,n; bool In[MAXM]; void add(int u,int v,int w) { tot++; to[tot]=v; val[tot]=w; nxt[tot]=head[u]; head[u]=tot; } bool bfs(int s,int t) { memset(dis,-1,sizeof(dis)); queue<int>q; q.push(s); dis[s]=0; while(!q.empty()) { int now=q.front(); q.pop(); for(int i=head[now];i;i=nxt[i]) { int y=to[i]; if(val[i]&&dis[y]==-1) { dis[y]=dis[now]+1; q.push(y); } } } return dis[t]!=-1; } int dfs(int now,int ed,int flow) { if(now==ed) return flow; int rest=flow; for(int i=head[now];i&&rest;i=nxt[i]) { int y=to[i]; if(dis[y]!=dis[now]+1||!val[i]) continue; int k=dfs(y,ed,min(rest,val[i])); val[i]-=k; val[i^1]+=k; rest-=k; if(!k) dis[y]=-1; } return flow-rest; } bool check(int x) { for(int i=2;i*i<=x;i++) { if(x%i==0) return false; } return true; } void dfs_mc(int now) { In[now]=true; rd.push_back(now); for(int i=0;i<2;i++) { if(!In[match[now][i]]) { dfs_mc(match[now][i]); } } } int main() { freopen("justice.in","r",stdin); freopen("justice.out","w",stdout); scanf("%d",&n); int s=n+1,t=n+2,res1=0,res2=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]&1) res1++; else res2++; } if(res1!=res2) { puts("Impossible"); return 0; } for(int i=1;i<=n;i++) { if(a[i]&1) { add(s,i,2); add(i,s,0); } else { add(i,t,2); add(t,i,0); } for(int j=i+1;j<=n;j++) { if(check(a[i]+a[j])) { // cout<<a[i]<<" "<<a[j]<<"\n"; if(a[i]&1) { add(i,j,1); add(j,i,0); } else { add(j,i,1); add(i,j,0); } } } } int flow=0; while(bfs(s,t)) { flow+=dfs(s,t,INF); } if(flow!=n) { puts("Impossible"); return 0; } puts("Possible"); for(int i=1;i<=n;i++) { if(a[i]&1) { for(int j=head[i];j;j=nxt[j]) { int y=to[j]; if(!val[j]) { match[i].push_back(y); match[y].push_back(i); } } } } for(int i=1;i<=n;i++) { if(!In[i]) { ++Cut; dfs_mc(i); while(rd.size()) { Ans[Cut].push_back(rd.back()); rd.pop_back(); } } } cout<<Cut<<"\n"; for(int i=1;i<=Cut;i++) { cout<<Ans[i].size()<<" "; for(int j=0;j<Ans[i].size();j++) { cout<<Ans[i][j]<<" "; } cout<<"\n"; } }
\(T3\)
直接暴力能過
#include<bits/stdc++.h> using namespace std; int val[100005],tr[100005],b[100005],tot,n,q; map<int,int>mp; int lowbit(int x) { return x&(-x); } void Ins(int poz,int k) { while(poz<=tot) { tr[poz]+=k; poz+=lowbit(poz); } } int Que(int poz) { int res=0; while(poz) { res+=tr[poz]; poz-=lowbit(poz); } return res; } int main() { // freopen("noon.in","r",stdin); // freopen("noon.out","w",stdout); cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&val[i]); b[i]=val[i]; } sort(b+1,b+1+n); for(int i=1;i<=n;i++) { if(!mp[b[i]]) mp[b[i]]=++tot; } for(int i=1;i<=n;i++) val[i]=mp[val[i]]; cin>>q; int ls=0; for(int i=1,l,r;i<=q;i++) { scanf("%d%d",&l,&r); l^=ls; r^=ls; if(l>r) swap(l,r); int res=0; for(int j=r;j>=l;j--) { Ins(val[j],1); res+=Que(val[j]-1); } memset(tr,0,sizeof(tr)); printf("%d\n",(ls=res)); // cout<<(ls=res)<<"\n"; } }