1.sort排序的重载
sort(arr.begin(),arr.end(),[](node a,node b)
{
if(a.data + a.index == b.data + b.index) return a.index < b.index;
return a.data + a.index < b.data + b.index;
});
当且仅当i==n-1输出endl
for(int i=0;i<n;++i)
cout<<arr[i].data<<" \n"[i == n-1];
2.
第一行两个字母n,m.n代表武功秘籍的长度,m代表武功被修改的次数。
第二行有一个只包含小写字母的长为n的字符串。
接下来m行,第i行两个字母代表把武功秘籍中所有字母xi改为yi。
(1<=n,m<=1e3)
简单来说就是替换字符,使用replace和at处理;
void Solve()
{
int m;
string str;
cin>>n>>m;
cin>>str;
while(m--)
{
char ch1,ch2;
cin>>ch1;
cin>>ch2;
for(int i=0;i<str.length();++i)
{
if(str.at(i)==ch1)
{
str.replace(i,1,1,ch2);
}
}
}
cout<<str;
}
#include<iostream>
using namespace std;
int main(){
string line="hello world, i love python!";
string s = line.replace(line.find("i"), 1, "haha");
cout<<s<<endl;
return 0;
}
3.映射修改字符:
void Slove(void) {
FOR(i, 1, 26) mp[i] = i;
ll n, m;
cin >> n >> m;
FOR(i, 1, n) cin >> s[i];
while (m--)
{
char x,y;
cin>>x>>y;
int xx,yy;
xx=x-'a'+1;
yy=y-'a'+1;
FOR(i,1,26)
{
if(mp[i]==xx) mp[i]=yy;
}
}
FOR(i,1,n)
{
int ss=s[i]-'a'+1;
char ch='a'-1+mp[ss];
cout<<ch;
}
cout<<endl;
}
4.差分
void add(int l,int r,int c){
brr[l]+=c;brr[r+1]-=c;
}
void Solve (){
int n,m;cin>>n>>m;
for(int i=1;i<=n;++i)cin>>arr[i],add(i,i,arr[i]);
while(m--){
int l,r,c;
cin>>l>>r>>c;
add(l,r,c);
}
int s=0;
for(int i=1;i<=n;++i)
{
s+=brr[i];
cout<<s<<" ";
}
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Solve();
}
二维差分:这里我们要注意是开全局变量的时候,要注意数据域,全局变量自动初始化,一开始复杂度就是O(n)了,然后就是arr[3][1000]要比arr[1000][3]快很多,因为每个a[1]都要开辟一个新地址,使得消耗变大!!!比如这里开1e4*1e4就会T了,开1e3*1e3都不会!!!
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include <vector>
#include<string>
#include<cstring>
#include<numeric>
#include<queue>
#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned u;
typedef double db;
#define inf 0x3f3f3f3f
#define inf_max 0x7f7f7f7f
typedef long long ll;
#include<bits/stdc++.h>
using namespace std;
namespace Read {
#define ss(a) scanf("%s",a)
inline int ri() {int x;scanf("%d", &x);return x;}
inline ll rl() {ll x;scanf("%lld", &x);return x;}
inline db rd() {db x;scanf("%lf", &x);return x;}
inline ull rul() {ull x;scanf("%llu", &x);return x;}
inline u ru() {u x;scanf("%u", &x);return x;}
}
int arr[1005][1005],brr[1005][1005];
void add(int k,int l,int r,int c){
brr[k][l]+=c;brr[k][r+1]-=c;
}
void Solve (){
int n,m,qw;
n=Read::ri();
m=Read::ri();
qw=Read::ri();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
arr[i][j]=Read::ri();
add(i,j,j,arr[i][j]);
}
}
while(qw--)
{
int x1,y1,x2,y2,c;
x1=Read::ri();y1=Read::ri();
x2=Read::ri();y2=Read::ri();
c=Read::ri();
for(int i=x1;i<=x2;++i){
add(i,y1,y2,c);
}
}
int s=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
s+=brr[i][j];
printf("%d ",s);
}
putchar('\n');
s=0;
}
}
signed main() {
Solve();
}
5. 二进制01数量
__builtin_popcount(x) //返回x在二进制表示1的个数
__builtin_clz (unsigned int x) //返回前导的0的个数。