学习内容:每日一题补题
1.金发姑娘和n头牛(Acwing1952)
差分+离散化
用map的方法:
map<int,int>s;
for(int i=0;i<n;i++){
scanf("%d%d",&l,&r);
s[l]+=x;
s[r]-=x;
}
for(auto& [k,v]:s){
ans+=v;
进行一些其他操作
}
手写离散化:
vector<int>s;
int l[maxn],r[maxn],p[maxn];
for(int i=0;i<n;i++){
scanf("%d%d",&l[i],&r[i]);
s.pb(l[i]),s.pb(r[i]+1);
}
sort(s.begin(),s.end());
s.erase(unique(s.begin(),s.end()),s.end());
for(int i=0;i<n;i++){
int a=lower_bound(s.begin(),s.end(),l[i])-s.begin();
int b=lower_bound(s.begin(),s.end(),r[i]+1)-s.begin();
p[a]+=x;
p[b]-=x;
//这里可以进行一些奇奇怪怪的其他操作
}
for(int i=0;i<s.size();i++){
//计算答案
}
2.Multiply and Rotate(abc235D)
包含状态转移的也要考虑DAG求最短路
本道题由于最多数据范围到1e6,我们可以用bfs求最短路,即用一个队列,对每个数,将其能转移的数push进去(如果没有访问过),这样在边建图的过程中就边求最短路了
3.双指针效率比二分高,一般用于数组有序且寻找满足某类条件的数个数的题中