1. 程式人生 > 其它 >4.14省選模擬

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