CSP-S模拟5 (T4大坑未补)
下发文件和题解
T1 F
注意到n小于等于2000,可以爆搜所有情况,在异或不相等时直接跳出,若已有可能结果,拿map记录一下即可. 也可以写成循环形式,复杂度 .
点击查看代码
#include<bits/extc++.h>
#ifndef ONLINE_JUDGE
#include"debug"
#endif
#define ll long long
#define rg register
#define rll rg ll
#define maxn 2001
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
static inline ll read()
{
rll f=0,x=0;rg char ch=getchar();
while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
return f?-x:x;
}
static inline void write(rll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);putchar(x%10|'0');
}
ll n,a[maxn],b[maxn];
ll ans[maxn],tot;
bool fl[maxn];
__gnu_pbds::gp_hash_table<ll,bool> mp;
static inline void dfs(rll x,rll num)
{
if(x==n+1) { if(!mp[num]) mp[num]=1,ans[++tot]=num;return; }
for(rll i=1;i<=n;i++) if((!fl[i])&&(a[x]^b[i])==num) fl[i]=1,dfs(x+1,num),fl[i]=0;
}
int main()
{
n=read();for(rll i=1;i<=n;i++) a[i]=read();for(rll i=1;i<=n;i++) b[i]=read();
for(rll i=1;i<=n;i++) fl[i]=1,dfs(2,a[1]^b[i]),fl[i]=0;
sort(ans+1,ans+tot+1);write(tot);putn;for(rll i=1;i<=tot;i++) write(ans[i]),putn;
return 0;
}
T2 S
首先有一个性质:
.
有了这个性质,就可以愉快地dp了!
设dp[r][g][y][0/1/2]表示当前重新排列后的序列已有r个R、g个G、y个Y,且当前的序列中最后一个为0(R)、1(G)、2(Y).
那么就有了:
dp[r+1][g][y][0]=min{dp[r][g][y][1],dp[r][g][y][2]}
dp[r][g+1][y][1]=min{dp[r][g][y][0],dp[r][g][y][2]}
dp[r][g][y+1][2]=min{dp[r][g][y][0],dp[r][g][y][1]}
这里min里面的dp还需要加上当前的位置差.
然后,转移就行了!
点击查看代码
潦草不堪的代码
#include<bits/stdc++.h>
#define ll int
#define rg register
#define rll rg ll
#define maxn 201
#define put_ putchar(' ')
#define putn putchar('\n')
#define szr pos[0].size()
#define szg pos[1].size()
#define szy pos[2].size()
using namespace std;
static inline ll read()
{
rll f=0,x=0;rg char ch=getchar();
while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
return f?-x:x;
}
static inline void write(rll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);putchar(x%10|'0');
}
ll n,t;
char s[maxn<<1];
vector<ll> pos[3];
ll dp[maxn][maxn][maxn][3];
int main()
{
memset(dp,0x3f,sizeof(dp));dp[0][0][0][0]=dp[0][0][0][1]=dp[0][0][0][2]=0;
n=read();scanf("%s",s+1);for(rll i=1;i<=n;i++) (s[i]=='R')?pos[0].push_back(i):(s[i]=='G')?pos[1].push_back(i):pos[2].push_back(i);
if((t=(n>>1)+(n&1))&&(szr>t||szg>t||szy>t)) { puts("-1"); return 0; }
for(rll i=0,y;i<n;i++)
for(rll r=0;r<=i&&r<=szr;r++)
for(rll g=0;g<=i&&g<=szg;g++)
if(r+g<=i&&(!((y=i-r-g)&INT_MIN))&&y<=szy)
((dp[r][g][y][0]^0x3f3f3f3f)?((szg-g?dp[r][g+1][y][1]=min(dp[r][g+1][y][1],dp[r][g][y][0]+abs(i+1-pos[1][g/*+1-1*/])):NULL),(szy-y?dp[r][g][y+1][2]=min(dp[r][g][y+1][2],dp[r][g][y][0]+abs(i+1-pos[2][y/*+1-1*/])):NULL)):NULL),
((dp[r][g][y][1]^0x3f3f3f3f)?((szr-r?dp[r+1][g][y][0]=min(dp[r+1][g][y][0],dp[r][g][y][1]+abs(i+1-pos[0][r])):NULL),(szy-y?dp[r][g][y+1][2]=min(dp[r][g][y+1][2],dp[r][g][y][1]+abs(i+1-pos[2][y])):NULL)):NULL),
((dp[r][g][y][2]^0x3f3f3f3f)?((szr-r?dp[r+1][g][y][0]=min(dp[r+1][g][y][0],dp[r][g][y][2]+abs(i+1-pos[0][r])):NULL),(szg-g?dp[r][g+1][y][1]=min(dp[r][g+1][y][1],dp[r][g][y][2]+abs(i+1-pos[1][g])):NULL)):NULL);
write(min(dp[szr][szg][szy][0],min(dp[szr][szg][szy][1],dp[szr][szg][szy][2]))>>1);
return 0;
}
T3 Y
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define rg register
#define rll rg ll
#define pll pair<ll,ll>
#define maxn 1000001
#define mod 1000000007
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
static inline ll read()
{
rll f=0,x=0;rg char ch=getchar();
while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=((x<<3))+((x<<1))+(ch^'0'),ch=getchar();
return f?-x:x;
}
static inline void write(rll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);putchar(x%10|'0');
}
ll n,a[maxn];
ll dp[maxn][2];
static inline ll ksm(rll a,rll b) { rll ans=1; a%=mod; for(rll i=b;i;i>>=1) { if(i&1) ans=ans*a%mod; a=a*a%mod; } return ans; }
static const ll inv2=ksm(2,mod-2),inv6=ksm(6,mod-2);
static inline ll sum(rll x) { return x*(x+1)%mod*inv2%mod; }
static inline ll sum2(rll x) { return x*(x+1)%mod*(x<<1|1)%mod*inv6%mod; }
static inline ll DP(rll x,rll y)
{
memset(dp,0,sizeof(dp));dp[1][0]=x^1;dp[1][1]=x;
for(rll i=1;i<=n;i++)
{
dp[i%n+1][0]=((dp[i%n+1][0]+dp[i][0]*sum(a[i]))%mod+dp[i][1]*((a[i]*sum(a[i])-sum2(a[i])+mod)%mod))%mod;
if(y)
dp[i%n+1][1]=(dp[i][0]*a[i]%mod+dp[i%n+1][1]+dp[i][1]*sum(a[i]-1))%mod;
else
dp[i%n+1][1]=(dp[i][0]*(a[i]+1)%mod+dp[i%n+1][1]+dp[i][1]*sum(a[i]))%mod;
}
if(x) return (dp[1][1]-1+mod)%mod;
return (dp[1][0]-1+mod)%mod;
}
int main()
{
n=read();for(rll i=1;i<=n;i++) a[i]=read();
write((DP(0,0)+DP(1,0)-DP(0,1)+mod-DP(1,1)+mod)%mod);
return 0;
}
大坑未补...
--END--
我的博客: 𝟷𝙻𝚒𝚞
本文链接: https://www.cnblogs.com/1Liu/p/16696020.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!