首页 > 其他分享 >Codeforces(1500板刷)

Codeforces(1500板刷)

时间:2024-02-16 22:33:22浏览次数:43  
标签:知识点 终点 板刷 rep Codeforces long int 1500 define

目录


写在前面

开始板刷1500了,主要是最近卡1300-1400上不去,发现cf很多思维题要不是想不到,要不就是签的慢,被读题卡了心态就巨难受,一下就不想写了,而且现在学知识点容易陷入递归,学到一个知识点发现需要用其他知识点,然后又去学其他知识点,然后学完还需要对这些一堆知识点做题练习不然只会板子根本没有什么对算法深刻的理解。感觉不如这样去板刷,遇到不会的只学这个不去学太多,在题目中理解知识点应该比单纯泛泛去学可能效果会更好。也记录一下,自己1500刷多少,才能有提升。

1. A. Did We Get Everything Covered?(构造、思维)

题目链接


A. Did We Get Everything Covered?


题意


给\(n,k\)以及长度为\(m\)的一个小写的字符串。
字符串的子序列是否包含用前\(k\)个小写字母构成的长度为n的字符串的所有情况


题解

  1. 首先判断有没有解:
    要构成所有的字符串,我们可以把原串进行拆分,拆分成n个段,每段如果都包含前k个小写字母至少一次,则说明有解,反之说明无解。
  2. 无解的情况下,考虑如何构造答案。
    用每一段最后一次出现的字符,加上不满足的段中没有出现的字符
    正确性?每一段最后出现的字符一定在前面没出现过,只能在后面出现,这样构造出来的子序列是正确的

代码

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back

using namespace std;
const int mod=998244353;
void solve() {
	int n,k,m;
	string s;
	cin>>n>>k>>m;
	cin>>s;
	set<char>cnt;
	int cur=0;
	string ans;
	rep(i,0,m-1) {
		cnt.insert(s[i]);
		if(cnt.size()==k) {
			ans+=s[i];
			++cur;
			cnt.clear();
		}
		if(cur>=n) {
			cout<<"YES"<<endl;
			return;
		}
	}
	cout<<"NO"<<endl;
	int len=ans.size();
	rep(i,0,k-1) {
		char c='a'+i;
		if(cnt.count(c)==0) {
			rep(j,1,n-len)	ans+=c;
			break;
		}
	}
	cout<<ans<<endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freopen("1.in", "r", stdin);
	int _;
	cin>>_;
	while(_--)
		solve();
	return 0;
}

总结

有判定正确性的思路,但是不会构造
wa了几发。最开始是构造的思路是错的
后面有一个小细节处理的不好,当要修改\(string\)时,就不能用\(string\)的\(size\)作为循环的控制条件,这样很容易寄。
很好的一道构造题目


2 F. Greetings(离散化+树状数组)

题目链接

F. Greetings

题意

image

题解

由于两个人的速度是一样的,所以到达终点之前两个人是不会相遇的,考虑一下什么情况两个人会相遇,其中一个人到达终点时,另一个人,终点所在地的前面,并且它的终点在更右边。
将两个人的起点终点分别用\(S_a 、S_b、 E_a、 E_b\)表示,并假设\(a\)在前\(b\)在后(b在前是对称的),有下图

  1. \(a\)的终点\(<\) \(b\)的终点,这时两者同时出发,a到终点时,b已经经过的a的终点,两者不会相遇,对答案没有贡献
    19bf509ef2070db7825b2eaddda78458.jpeg
  2. \(a\)的终点\(>\) \(b\)的终点,这时b会先到终点,速度一样,a此时还没有到达\(E_b\),此时两者一定会在\(E_b\)相遇
    0972e8479cc965d5b05e6802a33eebed.jpeg
    所以答案转化为对于当前区间计算有多少个区间被它所包含。

因为这道题目数据的实际大小是没有意义的,相对大小是有用的,并且值域比较大,我们考虑离散化,然后通过树状数组去查询。
具体的做法是,先按右端点从小打大排序,然后从前往后遍历区间,每次查询起点大于当前点起点的个数。就是这个区间对答案产生的贡献。

代码

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back

using namespace std;

void solve() {
	int n;
	cin>>n;
	struct node{
		int l,r;
		bool operator<(const node &t)const{
			return r<t.r;
		}
	};
	vector<node>a(n);
	vector<int>b(2*n);
	int k=0;
	rep(i,0,n-1){
		cin>>a[i].l>>a[i].r;
		b[k++]=a[i].l;
		b[k++]=a[i].r;
	}
	sort(b.begin(),b.end());
	rep(i,0,n-1){
		a[i].l=lower_bound(b.begin(),b.end(),a[i].l)-b.begin()+1;
		a[i].r=lower_bound(b.begin(),b.end(),a[i].r)-b.begin()+1;
	}
	sort(a.begin(),a.end());
//	rep(i,0,n-1){
//		cout<<a[i].l<<' '<<a[i].r<<endl;
//	}
	vector<int>c(2*n+1,0);
	auto lowbit=[](int x){
		return x&-x;
	};
	
	auto add=[&](int x,int k)->void{
		for(int i=x;i<=2*n;i+=lowbit(i)){
			c[i]+=k;
		}	
	};
	
	auto sum=[&](int x){
		int res=0;
		for(int i=x;i;i-=lowbit(i)){
			res+=c[i];
		}	
		return res;
	};
	int ans=0;
	rep(i,0,n-1){
		int r=a[i].r,l=a[i].l;
		ans+=sum(r)-sum(l-1);
		add(l,1);
	}
	cout<<ans<<endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freopen("1.in", "r", stdin);
	int _;
	cin>>_;
	while(_--)
		solve();
	return 0;
}

总结

  1. 离散化的板子记得不是很熟,这种东西应该很熟并且默写的很快的
  2. 树状数组用的还是比较少有些细节记得不太清,就比如树状数组的下标是从几开始的?
    答案是1,这就导致离散化的时候也要从1开始。
  3. 看了一些题解,发现了这类问题被称为二维偏序问题
    \(a_i<a_j、b_i>b_j\)

标签:知识点,终点,板刷,rep,Codeforces,long,int,1500,define
From: https://www.cnblogs.com/cxy8/p/18017288

相关文章

  • Codeforces Round 926 (Div. 2) 总结
    A题意:给出一个数组,让你重新排序,\(\sum_{i=1}^{n-1}a_i-a_{i+1}\)最大。做法:显然从小到大排序即可,答案就是最大值减去最小值。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+5,MOD=998244353;signedmain(){ios::sync_with_s......
  • Codeforces Round 926 (Div. 2) DEF
    D.SashaandaWalkintheCity题意:给定一棵树,问不存在三个点属于同一条路径的点集个数。\(f[x]\)表示,最近公共祖先为\(x\)的合法非空集数量。如果选\(x\),那么只能为不选子树或选一棵子树,否则\(u\insubtree[y_1]\),\(v\insubtree[y_2]\)与\(x\)共链。?贡献为\(......
  • Codeforces Round 926 (Div. 2) 赛后总结
    这场比赛掉了前三场比赛上的分,望周知。SashaandtheBeautifulArray题目大意:一个有n个数的数组,对n个数进行排序,求数组中ai-ai-1(下标从2到n)的和的最大值。分析列出来和式,为an-an-1+an-1-an-2……-a1最后得到an-a1那么an最大,a1最小即可。很容易想到排序。#include<i......
  • Codeforces Round 926 (Div. 2)(A~D)
    目录ABCDA输出最大值减最小值,或者排序算一下答案#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definelllonglong#definedb......
  • Codeforces Round 926 (Div. 2) 题解
    比赛链接:https://codeforces.com/contest/1929官解链接:https://codeforces.com/blog/entry/125943出的很差的一场。推歌CF1929A.SashaandtheBeautifulArray题意任意排列数组\(a_{1..n}\),求\(\sum_{i=2}^n(a_i-a_{i-1})\)的最大值。题解见过最显然的A题,奠定了......
  • Codeforces Round 926 (Div. 2)
    A-SashaandtheBeautifulArray给出的是差分的和,显然等于最后一个减掉第一个,于是答案为最大值减最小值。SubmissionB-SashaandtheDrawing观察到:前几次操作可以使答案\(+2\),之后每次只能让答案\(+1\)。手玩一下发现最优方案是先填满第一列,再从最后一列第二行填到倒......
  • Codeforces Round 906 (Div. 2)
    A.Doremy'sPaint3对于式子\(b_1+b_2=b_2+b_3=\dots=b_{n-1}+b_n=k\),从中挑出\(b_i+b_{i+1}=b_{i+1}+b_{i+2}\),得到\(b_i=b_{i+2}\),这就意味着所有奇数位置上的数需要相等,所有偶数位置上的数也需要相等。对于\(n\)个数而言,有\(\lceil\frac{n}{2}\rc......
  • Codeforces 做题笔记
    1841EFilltheMatrix刚开始思路错了,以为就从下往上铺但发现要尽量让横的连续段断开的次数少,每断开一次相当于数量\(-1\)所以从宽度最大的矩形开始填,尽量填满可以用set维护当前行的连续段,这一列遇到黑格就split,去除宽度为\(1\)的,同时记录加入的时间戳来计算矩形高度vo......
  • Codeforces Round 925 (Div. 3)
    A简单分讨。最前面a能放多少就放多少,大头尽量放在后面。B先算出每个水缸最终的水量,然后从前往后扫,多的水平到下一个水缸里去。假如扫到一个水缸小于平均值,那么没救了,输出NO。CC<<B。考虑全体值为\(a_1\)与\(a_n\)时的最小代价,搞两个指针,从前后开始扫一扫即可。D......
  • Codeforces Round 925 (Div. 3) 赛后总结
    此次总结借鉴了Register_int,0x3ea,幻想家协会会长的题解。感谢大佬。RecoveringaSmallString题目大意:将字母a-z编号为1-26,给出一个整数,此整数为三个字母之和,求改字符串的最小字典序。分析可以暴力循环,或者分情况讨论.我们只要尽力保持越前面的字母越小越好。#include<i......