atcoder 专项2
有些题其实都挺有价值的,搞得我都想每个都单独建随笔,但是这样还是太多太乱了,之前那个难度较低,部分题甚至可以直接删除,遂新开一个 2 记录更高质量的题目。
代码:https://atcoder.jp/contests/abc381/submissions/60174343
[ABC364F] Range Connect MST
区间内的所有数都会连边,这是一个特性,正常做法超时考虑优化性建图,我们按权值排序,连的时候用set维护连通块,将区间内未连接的连通块都连接上。
#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1
#define re register
#define pb push_back
#define pir pair<int,int>
#define f1(x) for(int i=1;i<=x;i++)
#define f0(x) for(int i=0;i<=x;i++)
#define fr1(x) for(int i=x;i>=1;i--)
#define fr0(x) for(int i=x;i>=0;i--)
const int N=2e5+10,M=25005;
const int mod=1e9+7;
using namespace std;
int n,m;
struct ss{
int l,r,c;
}a[N];
bool cmp(ss g,ss h){
return g.c<h.c;
}
set<pir> s;
signed main(){
// freopen("xp1.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++){
s.insert({i,i});
}
for(int i=1;i<=m;i++){
cin>>a[i].l>>a[i].r>>a[i].c;
}
sort(a+1,a+m+1,cmp);
int ans=0;
for(int i=1;i<=m;i++){
auto pl=--s.upper_bound({a[i].l,n}),pr=s.upper_bound({a[i].r,n});
for(auto it=pl;it!=pr;it++){
ans+=a[i].c;
}
pir nw=make_pair(pl->first,prev(pr)->second);
s.erase(pl,pr);
s.insert(nw);
}
if(s.size()>1){
cout<<-1;
}
else{
cout<<ans;
}
return 0;
}
[ABC379F] Buildings 2
楼房满足单调性,我们在满足左端点能看到维护单调栈,在从栈上二分查找右端点可以看到的楼房。
[ABC379E] Sum of All Substrings
看到有思路但是想到要用高精度就头疼,但是这题并没有用到很复杂的高精度,相反甚至更像是一个技巧性的东西。
第i位的数会在这位计算 \(i\) 次,在之后也会再作为每一位计算 \(i\) 次,所以我们数组每一位存储前缀和,这一位的和的结果就是 \(f_i%10\),然后我们再进位。
#include <bits/stdc++.h>
#define int long long
#define re register
const int N=2e5+100;
using namespace std;
int n;
string s;
int a[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n;
cin>>s;
for(int i=0;i<n;i++){
int x=s[i]-'0';
a[i]+=a[i-1];
a[i]+=x*(i+1);
}
string ans="";
int sum=0;
for(int i=n-1;i>=0||sum>0;i--){
sum+=a[i];
ans+=sum%10+'0';
sum/=10;
}
for(int i=ans.size()-1;i>=0;i--){
cout<<ans[i];
}
return 0;
}
[ABC379C] Sowing Stones
仔细读题啊!!每个位置都只有一个石子,不能有多余,然后唐的没边,这样的话就可以从后向前填然后等差数列区间快速填,真是无语了。
[ABC380D] Strange Mirroring
还得是找规律题啊,我还是看不出来,给你你看看能看出来吗,aB、Ab、AbaB、AbaBaBAb
,不可以看出下标为 \(i\) 的字符经过 \(k\) 次变化为 \(i-n\times 2^{k-1}\) 的字符取反。
然后这就是个倍增题了,不断乘 \(2\) 直到大于下标,
[ABC378F] Add One Edge 2
感觉是个套路题,以后可能会遇到吗,要求连边的两个端点度数必须为 \(2\),两点之间的点的度数必须为 \(3\),度数为 \(3\) 的点组成一个连通分量,连通分量连接的所有点都可以相互到达,好了没了。
[ARC159D] LIS 2
其实挺简单,想到了,甚至感觉贪心可做,其实就只有重叠和比他小的右两种情况,直接值域线段树即可秒掉。
如果没有顺序就确实可以贪心,但是有顺序就要用到无后效性的 dp 了。
[ABC353G] Merchant Takahashi
虽然并不难,但是挺有教育意义的,终点是按顺序到达,所以我们可以从这个位置之前和之后来到 \(f_i\),所以维护线段树即可转移过来,区间最大值和单点修改。
感觉好像 dp 具有顺序性,其实也叫无后效性???
F - Bread
陷入正向思维误区了,总是想如何分,没想到如何合并,其实就是合并果子的模板题,剩下的面包额外看成一个人。
[AGC008B] Contiguous Repainting
结论题,最后总有一段长度为 \(k\) 的区间染成黑色或白色,其余颜色随便填,这样就很好做了,但我以为是 dp,发现 dp 根本不可做。
维护前缀正数和后缀正数和及前缀和求区间。