想复杂了想复杂了 吐了吐了。
A题 Omkar and Bad Story
首先题意就是寻找一个回环嘛。凡是在数组里面的元素,两个元素的差值的绝对值也得在数组里面。
然后我一开始想的A-B 如果2* A>B那么就 2 * A-B也放到里面。然后后来发现那么3 * A-B我是不是也要考虑。 然后就死循环了,发现要装进去的数量就很多,会基本覆盖到所有的值。等等,覆盖?
如果是覆盖的话我是不是直接输出0到最大值,他一定包含A数组并且差值都在里面。那就没什么问题了啊。
那么如果是最后数组的元素个数是一定的,那么可能的值的数量一定是收敛的。想一下,如果存在负数的话。自己减去自己就是0,有0有负数,差值就可以往正负无穷大无限延伸,那么就肯定无解。
如果都是整数或者0的话我们只需要输出到最大值的地方即可了。
代码环节:
// god with me
//#pragma GCC optimize(1)
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
//#include <cmath>
//#include <math.h>
//#include<cstdio>
//#include<string>
//#include<cstring>
//#include<iostream>
//#include<algorithm>
//#include<vector>
#define inf 0x7fffffff
#define ll long long
//#define int unsigned long long
#define int long long
//#define double long double
//#define double long long
#define re int
//#define i int i
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
//#define P pair < int , int >
// typedef long long s64;
using namespace std;
const int mod=1e6+7;
const int N=1e5+5;//?????????? 4e8
const int M=1e6+10;
const int maxn=32005;
int n;
bool vis[N];
int a[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int maxx=-1e3;
for(int i=1;i<=n;i++)
{
if(a[i]<0)
{
cout<<"NO"<<endl;
return;
}
maxx=max(maxx,a[i]);
}
cout<<"YES"<<endl<<maxx+1<<endl;
for(int i=0;i<=maxx;i++)
{
cout<<i<<" ";
}
cout<<endl;
}
signed main()
{
// ios::sync_with_stdio(false);
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
solve();
}
return 0;
}
B题 B - Prinzessin der Verurteilung
就是给你一个字符串,让你找到长度最小的,没有出现过的按字典序排序的字符串。
看了一眼字符串长度是1000,如果单个字母都包含进去的话,很容易恩,26就够了。
如果两个连着的都包含进去想想,一个字母开头的大概需要26* 2的长度。 26个就是需要2626几百个。
这个应该很难做到全都包含进去吧。但是我们假设它很巧妙,我们再枚举第三种情况,三个字母相连的,那么肯定可以包囊所有的字符串长度的。
到这里思路就清晰了,我直接暴力枚举就好了,长度也只有1000,暴力3层最多也就26 26* 26可以接受的。
然后我不知道为什么第一次就想着用哈希,然后就发现了存在一些bug 我在az往后跳的时候由于用的for循环从最小值枚举到最大值,debug发现了中间可能出现是符号的问题。后来想着改一下跳的那一步特判。但是在三层循环的时候特判就出现了很大的难度。
后来就想到为啥我不暴力开数组呢,反正数据小。然后就5分钟AC了= =
代码环节:
// god with me
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
//#include <cmath>
//#include <math.h>
//#include<cstdio>
//#include<string>
//#include<cstring>
//#include<iostream>
//#include<algorithm>
//#include<vector>
#define inf 0x7fffffff
#define ll long long
//#define int unsigned long long
#define int long long
//#define double long double
//#define double long long
#define re int
//#define i int i
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
//#define P pair < int , int >
// typedef long long s64;
using namespace std;
const int mod=1e6+7;
const int N=5e5+5;//?????????? 4e8
const int M=1e6+10;
const int maxn=32005;
int n;
map<double,ll>mp;
char s[N];
void solve()
{
memset(s,0,sizeof(s));
mp.clear();
cin>>n;
cin>>s+1;
int temp1=0,temp2=0;
for(int i=1;i<=n;i++)
{
if(s[i]=='D')temp1++;
else temp2++;
mp[(double)(temp1)/temp2]++;
cout<<mp[(double)(temp1)/temp2]<<" ";
}
cout<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
solve();
}
return 0;
}
C题 C - Diluc and Kaeya
这道题我直接裂开了都,我想的太复杂了,我直接枚举了前缀然后根据gcd判断他们可以分的组数,特判0的情况以及gcd=1的情况。然后根据组数判断步数。
这样就存在一个问题,实际上是n*n/gcd(d,k)的,然后就理所应当的超时了,我还写了巨长接近两百行的代码量。
最后才反应过来为啥不一遍遍历数组的时候就直接把他们的DK的比率直接存下来啊。我直接判断前缀的比率在之前出现的次数不就直接可以记录下来了么。。。
可能是今天太蒙了,昨晚没休息好。
代码环节:
// god with me
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
//#include <cmath>
//#include <math.h>
//#include<cstdio>
//#include<string>
//#include<cstring>
//#include<iostream>
//#include<algorithm>
//#include<vector>
#define inf 0x7fffffff
#define ll long long
//#define int unsigned long long
#define int long long
//#define double long double
//#define double long long
#define re int
//#define i int i
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
//#define P pair < int , int >
// typedef long long s64;
using namespace std;
const int mod=1e6+7;
const int N=5e5+5;//?????????? 4e8
const int M=1e6+10;
const int maxn=32005;
int n;
map<double,ll>mp;
char s[N];
void solve()
{
memset(s,0,sizeof(s));
mp.clear();
cin>>n;
cin>>s+1;
int temp1=0,temp2=0;
for(int i=1;i<=n;i++)
{
if(s[i]=='D')temp1++;
else temp2++;
mp[(double)(temp1)/temp2]++;
cout<<mp[(double)(temp1)/temp2]<<" ";
}
cout<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
solve();
}
return 0;
}