Codeforces Round #663 (Div. 2) A ~ D 思维
题目:
Codeforces Round #663 (Div. 2)
A Suborrays
构造一个序列,满足以下式子
Pi一直按位取或到Pj >= j-i+1,随便构造以下就好了
#include<stdio.h>
int a[1000];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
if(i)
printf(" ");
if(n-2*i>0)
{
printf("%d",n-2*i);
a[i] = n-2*i;
}
else
{
printf("%d",2*i+1-n);
a[i] = 2*i+1-n;
}
}
// for(int i=0;i<n;i++)
// {
// for(int j=i+1;j<n;j++)
// {
// int ans = a[i];
// for(int z=i+1;z<=j;z++)
// {
// ans = ans|a[z];
// }
// if(ans<j-i+1)
// {
// puts("no!");
// }
// }
// }
puts("");
}
return 0;
}
B Fix You
就只需要判下面是不是都是R,右边是不是都是D就好了。
#include<stdio.h>
char a[105][105];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
int ans = 0;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",&a[i]);
for(int i=0;i<n-1;i++)
if(a[i][m-1]=='R') ans++;
for(int j=0;j<m-1;j++)
if(a[n-1][j]=='D') ans++;
printf("%d\n",ans);
}
return 0;
}
C Cyclic Permutations
直接预处理所有答案,下一次的答案等于n的全排列减去2*(n-1)的全排列再加上2上一次的答案。
首先算出他的全排列,1不能站到头和尾,所以要减去2(n-1)的全排列,但是还要加上1站头和尾成环的情况,也就是2*sum[n-1].
#include<stdio.h>
#define ll long long
const int mod = 1e9+7;
const int maxn = 1e6+5;
ll A[maxn],sum[maxn];
void init()
{
A[1]=1;
for(ll i=2;i<maxn;i++)
{
A[i] = A[i-1]*i%mod;
sum[i] = ((A[i]+mod-(2*A[i-1]%mod))%mod+2*sum[i-1])%mod;
}
}
int main()
{
init();
int T=1;
// scanf("%d",&T);
while(T--)
{
ll n;
scanf("%lld",&n);
printf("%lld\n",sum[n]);
}
return 0;
}
D 505
当n>3的时候,存在一个4∗4 的矩阵,里面还包含着4个2∗2 的矩阵,这个肯定是矛盾的,所以就只讨论n<4 的情况。
当n=1,直接输出0
当n=2,第一列跑4遍,遍历所有情况,再修改后面的矩阵。
第一列四种情况:
0 | 0 | 1 | 1
0 | 1 | 0 | 0
当n=3,第一联跑8遍,遍历所有情况,再修改后面的矩阵。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = (int)(1e6) + 7;
int n, m;// 1 <= n <= m <= 1e6
int f[3][N], t[3][N];// t 作临时记录
int main()
{
scanf("%d%d", &n, &m);
if (n >= 4)
puts("-1");
else if (n == 1)
puts("0");
else
{
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
scanf("%1d",&f[i][j]);
if (n == 2)
{
int res = inf;
for (int p = 0; p < (1 << n); ++p)
{
int cur = 0;
for (int i = 0; i < n; ++i)
{
if (f[i][0] != ((p >> i) & 1)) t[i][0] = 1-f[i][0], ++cur;
else t[i][0] = f[i][0];
}
for (int j = 1; j < m; ++j)
{
t[0][j] = f[0][j];
t[1][j] = f[1][j];
int a = t[0][j] + t[1][j] + t[0][j - 1] + t[1][j - 1];
if (a % 2 == 0) t[0][j] = 1-t[0][j], ++cur;
}
res = min(res, cur);
}
printf("%d\n", res);
}
else
{
int res = inf;
for (int p = 0; p < (1 << n); ++p)
{
int cur = 0;
for (int i = 0; i < n; ++i)
{
if (f[i][0] != ((p >> i) & 1)) t[i][0] = 1-f[i][0], ++cur;
else t[i][0] = f[i][0];
}
for (int j = 1; j < m; ++j)
{
t[0][j] = f[0][j];
t[1][j] = f[1][j];
t[2][j] = f[2][j];
int a = t[0][j] + t[1][j] + t[0][j - 1] + t[1][j - 1];
int b = t[2][j] + t[1][j] + t[2][j - 1] + t[1][j - 1];
if (a % 2 && b % 2) continue;
if (b % 2) t[0][j] = 1-t[0][j], ++cur;
else if (a % 2) t[2][j] = 1-t[2][j], ++cur;
else t[1][j] = 1-t[1][j], ++cur;
}
res = min(res, cur);
}
printf("%d\n", res);
}
}
return 0;
}