4.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";
}
}