A.
模拟
#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N],cl[N];
void Lan(){
string s1,s2;
cin>>s1>>s2;
s1=" "+s1;
s2=" "+s2;
for(int i=1;i<s1.size();i++){
cl[s1[i]-'a']=i;
}
ll ans=0;
for(int i=2;i<s2.size();i++){
ans+=abs(cl[s2[i]-'a']-cl[s2[i-1]-'a']);
}
cout<<ans<<'\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while (q--) {
Lan();
}
return 0;
}
B.
周期
#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N];
void Lan(){
ll x,n;
cin>>x>>n;
// t=4
if(x&1){
/*
x,x+1,x-2,x-3,x+4,
*/
if(n%4==1){//n-1,n
cout<<x+n<<'\n';
}else if(n%4==2){//n-2,n-1,n
cout<<x-1<<'\n';
}else if(n%4==3){//n-3,n-2,n-1,n
cout<<x-(n+1)<<'\n';
}else{
cout<<x<<'\n';
}
}else{
/*
x,x-1,x+2,x+3,x-4;
*/
if(n%4==1){//n-1,n
cout<<x-n<<'\n';
}else if(n%4==2){//n-2.n-1,n
cout<<x+1<<'\n';
}else if(n%4==3){//n-3,n-2,n-1,n
cout<<x+(n+1)<<'\n';
}else{
cout<<x<<'\n';
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while (q--) {
Lan();
}
return 0;
}
C.
线段树
单点修改,区间查询
#include<iostream>
#define INF 4e18;
using namespace std;
typedef long long ll;
const int N = 2e5+ 9;
ll a[N];
//线段树
struct node{
ll mn;
}seg[N<<2];
inline ll tl(ll x){return x<<1;}
inline ll tr(ll x){return x<<1|1;}
void pushup(const int id){
seg[id].mn=min(seg[tl(id)].mn,seg[tr(id)].mn);
}
void build(const int id,int l,int r){
if(l==r){
seg[id].mn=a[l];
return;
}
int mid=(l+r)>>1;
build(tl(id),l,mid);
build(tr(id),mid+1,r);
pushup(id);
}
bool inrange(int L,int R,int l,int r){return l<=L && R<=r;}
bool outofrange(int L,int R,int l,int r){return L>r || R<l;}
ll query(int id,int L,int R,int l,int r){
if(inrange(L,R,l,r)){
return seg[id].mn;
}else if(!outofrange(L,R,l,r)){
int mid=(L+R)>>1;
return min(query(tl(id),L,mid,l,r),query(tr(id),mid+1,R,l,r));
}else{
return 100000000000000;//不会影响结果
}
}
void update(int id,int l,int r,ll v){
if(l==r){
seg[id].mn=v;
}else{
int mid=(l+r)>>1;
if(seg[tl(id)].mn>seg[tr(id)].mn){//找到最小覆盖
update(tr(id),mid+1,r,v);
}else{
update(tl(id),l,mid,v);
}
pushup(id);
}
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
ll ans=seg[1].mn;
ll cur=0;
for(int i=1;i<=n-1;i++){
ans=max(ans,seg[1].mn-cur);//操作
cur=seg[1].mn;
update(1,1,n,100000000000000);//单点修改
}
cout<<max(ans,seg[1].mn-cur)<<'\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
solve();
}
return 0;
}
D.
贪心
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
struct node{
int val;
char flag;
}a[N];
inline void lan(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].val;
}
for(int i=1;i<=n;i++){
cin>>a[i].flag;
}
sort(a+1,a+1+n,[](const node a,const node b){
if(a.flag==b.flag){
return a.val<b.val;
}
return a.flag<b.flag;
});
for(int i=1;i<=n;i++){
if(a[i].val!=i){
if(a[i].flag=='B' && a[i].val<i){
cout<<"NO"<<'\n';
return;
}else if(a[i].flag=='R' && a[i].val>i){
cout<<"NO"<<'\n';
return;
}
}
}
cout<<"YES"<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
C++编程问题:模拟、周期计算、线段树应用与贪心算法实例
文章介绍了C++编程中的四个主题:字符串模拟求解、基于模运算的周期性问题、线段树的数据结构用于单点修改和区间查询,以及贪心策略在特定问题中的应用。
786

被折叠的 条评论
为什么被折叠?



