昨天晚上又自(bei)愿(po)打了一场cf,一看是div2难度的直接炸了,听说这个难度的第三题就已经是1500分的水平了,所以我还是准备开两个题就睡觉的(太晚了),没想到我还是低估了div2难度的前两个题,还是有点意思的,特别是第一题就让我卡了好久(什么时候我才能练成看样例就能AC的佬)。
题目传送门:Problem-A
这道题就是让找字符串中的"FFT"和"NTT",然后想办法不让字符串中出现这样的串,一开始我是一直用string中的find函数一直找这几个,可是发现不管怎么改(replace)都会有这两种字符串,因为FFT中你的T如果改到第一个位置,前面有一个NTT的话就会出现TTF因为NTT中的N不能到最后一个否则连续两个就构成NTT了,其他情况也是一样,就不再一一枚举了,所以要搞清楚这几个字母之间的关系,F和T有矛盾,N和T也有矛盾,而F和N之间没有矛盾,那么是不是只需要把T通通拿走就可以了呢? 这时候我就想到了用sort,又wa1了,后来仔细想想,如果是NTT排完序之后还是NTT,FFT排完序之后也是FFT,也就是说T必须要在N和F的前面!所以就将排完序之后的字符串逆序即可;
赛时代码:
#include
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair
#define fi first
#define se second
void solve()
{
string s;
cin>>s;
string ans;
for(int i=0;i>T;
while(T--) solve();
return 0;
}
我的思路就是先统计所有的T,然后放到前面,其实也可以用一个sort之后再用reverse:
sort(s.begin(), s.end());
reverse(s.begin(), s.end());
还有就是直接用sort➕反迭代器也行:
sort(s.rbegin(),s.rend());
题目传送门:Problem-B
这道题还是带点小小的思维的,感觉没有A题难,一开始以为dx要必须和xy相等,后来才发现下面有样例解释,既然dx和dy之间没有关系那就相对自由一点了,这道题给我的第一感觉就是GCD,但是有啥用呢?我们需要找到一组(dx,dy)通过任意的步数来让(a,b)变为(0,0),所以就可以对这两个数进行约分化简,当然也就用到了GCD喽,让这两个数分别除以他们的最大公约数就能得到化简后的结果了,然后对化简后的两个数与给定的k进行比较,如果都小于k的话是不是就能让(dx,dy)等于这两个数的化简值呢,这样他们只需要代价为1的操作即可,否则呢,如果化简后的结果有比k大的情况怎么办呢?那就只能用数对(1,1)将他们都同时变小,直到两个都小于等于k了或者有一个变为0了再一步变为(0,0)即可。
赛时代码:
#include
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair
#define fi first
#define se second
void solve()
{
int a,b,k;cin>>a>>b>>k;
int t = __gcd(a,b);
a/=t;
b/=t;
if(a <= k && b <= k) cout<<"1"<>T;
while(T--) solve();
return 0;
}
过了这道题就开始罚坐了,第三题看数据那么大肯定知道是用O(1)直接通过规律来计算出来的,但是还是找不出来规律,以至于罚坐到凌晨!
题目传送门:Problem-C
这道题的意思就是一个数如果他的质因数分解之后的所有因子都没有一位数的情况,最起码也是两位数的质数作为因子才行,那么我们是不是可以想到所有能被一位数质数的2 3 5 7整除的数就一定不是一个满足条件的数呢?那么我们在所有的范围的数中减去这几种不满足条件的数不就是最终答案了吗?那具体应该怎么计算呢?我们会发现,能被2整除的一定是偶数,那么范围内的偶数有一半呢,所以直接让n先减去n/2,然后同样的道理,每三个数中就有能被三整除的数.....以此类推,所以我们就能得到下面的式子:
int ans = x - x/2 - x/3 - x/5 - x/7;
但是毋庸置疑,肯定会有数被多减了,比如6,他既被2的时候减去了又被3的时候减去了,所以下一步需要将所有的多减去的数给加回来,于是:
ans += x/6 + x/10 + x/14 + x/15 + x/35 + x/21;
但是又会有的3个为一组的数被多加了,比如30,被2减了一次,被3减了一次,被5减了一次,然后被6加了一次,被10加了一次,又被15加了一次,所以30现在就相当于是没有被减去了,所以就让所有的三个为一组的数再减去一遍即可,同理四个为一组的又会被多减,再加回来即可。
补题代码如下:
// Problem: C. Count Good Numbers
// Contest: Codeforces - Educational Codeforces Round 181 (Rated for Div. 2)
// URL: https://codeforces.com/contest/2125/problem/C
// Memory Limit: 512 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair
#define fi first
#define se second
int res(int x)
{
int ans = x - x/2 - x/3 - x/5 - x/7;
ans += x/6 + x/10 + x/14 + x/15 + x/35 + x/21;
ans -= x/30 + x/42 + x/70 + x/105;
ans += x/210;
return ans;
}
void pre_handle()
{
}
void solve()
{
int l,r;cin>>l>>r;
cout<>T;
while(T--) solve();
return 0;
}
愿半夜没有CF!