2021-3-6 【b站学习】

------b站学习篇

//单链表 ACwing

#include

using namespace std;

const int N=1000000+10;

int e[N],ne[N],idx,head;

void Init(){

head=-1;

idx=0;

}

void add_head(int x){

e[idx]=x;

ne[idx]=head;

head=idx++;

}

void remove(int k){

ne[k-1]=ne[ne[k-1]];

}

void add(int x,int k){

e[idx]=x;

ne[idx]=ne[k-1];

ne[k-1]=idx++;

}

int main(){

int m,k,x;

cin>>m;

while(m–){

char ch;

cin>>ch;

Init();

if(ch==‘H’){

cin>>x;

add_head(x);

}else if(ch==‘D’){

cin>>k;

if(k==0){

head=ne[head]; //删除头结点

}else{

remove(k);

}

}else{

cin>>k>>x;

add(k,x);

}

}

for(int i=head;i!=-1;i=ne[i]){

cout<<e[i]<<’ ';

}

return 0;

}

//双链表 ACwing

#include

#include

using namespace std;

const int N=1000000+10;

int l[N],r[N],e[N],idx;

void Init(){

r[0]=1;

l[1]=0;

idx=2;

}

void add_L(int x){

e[idx]=x;

l[idx]=0;

r[idx]=r[0];

r[0]=idx;

l[r[idx]]=idx;

idx++;

}

void add_R(int x){

e[idx]=x;

r[idx]=1;

l[idx]=l[1];

l[1]=idx;

r[l[idx]]=idx;

idx++;

}

void remove(int k){

r[l[k+1]]=r[k+1];

l[r[k+1]]=l[k+1];

}

void add_k_l(int x,int k){

k++;

e[idx]=x;

l[idx]=l[k];

r[idx]=k;

r[l[idx]]=idx;

l[k]=idx++;

}

void add_k_r(int x,int k){

k++;

e[idx]=x;

r[idx]=r[k];

l[idx]=k;

l[r[idx]]=idx;

r[k]=idx++;

}

int main(){

int m,k,x;

string s;

Init();

cin>>m;

while(m–){

cin>>s;

if(s==“L”){

cin>>x;

add_L(x);

}else if(s==“R”){

cin>>x;

add_R(x);

}else if(s==“D”){

cin>>k;

remove(k);

}else if(s==“IL”){

cin>>k>>x;

add_k_l(k,x);

}else{

cin>>k>>x;

add_k_r(k,x);

}

}

for(int i=r[0];i!=1;i=r[i]){

cout<<e[i]<<’ ';

}

return 0;

}

//栈和队列

#include

using namespace std;

const int N=1000010;

int stk[N],tt;//栈 先进后出 、

stk[++tt]=x;//入栈

tt–;//出栈

if(tt==0) true; //判空

else false;

stk[tt]//栈顶元素

int q[N],hh,tt=-1;//队列 先进先出

q[++tt]=x;//入队

hh++;//出队

q[hh];//获取队头和队尾的元素

q[tt];

if(tt>=hh)false;//判空

else true;

//洛谷p5788

#include

#include

using namespace std;

const int N=1000010;

int stk[N],tt,e[N],a[N],q[N],qq;

int main(){

int n;

scanf(“%d”,&n);

for(int i=1;i<=n;i++){

scanf(“%d”,&a[i]);

}

for(int i=n;i>0;i–){

while(tt&&stk[tt]<=a[i])

{

tt–;

}

if(tt==0){

q[qq++]=0;

}else{

q[qq++]=e[tt];

}

stk[++tt]=a[i];

e[tt]=i;

}

for(int i=qq-1;i>=0;i–){

printf("%d ",q[i]);

}

return 0;

}

//树

#include

#include

using namespace std;

const int N=1e5+10;

int p[N][27],cnt[N],idx=1;

char s[N];

void add(char *s){

int j=0;//当前所用节点的地址

for(int i=0;s[i];i++){

int u=s[i]-‘a’;

if(p[j][u]==0){

p[j][u]=idx++;

}

j=p[j][u];

}

cnt[j]++;

}

int insert(char *s){

int j=0;

for(int i=0;s[i];i++){

int u=s[i]-‘a’;

if(p[j][u]==0){

return 0;

}

j=p[j][u];

}

return cnt[j];

}

int main(){

int n;

char op[2];

scanf(“%d”,&n);

while(n–){

scanf(“%s%s”,op,s);

if(op[0]==‘I’){

add(s);

}else{

printf(“%d\n”,insert(s));

}

}

return 0;

}

//快速选择排序 ACwing 785

#include

#include

using namespace std;

const int N=10000+10;

int q[N],n;

void quick_sort(int l,int r){

if(l>=r)return;

int x=q[l+r>>1],i=l-1,j=r+1;

while(i<j){

do i++;while(q[i]<x);

do j–;while(q[j]>x);

if(i<j)swap(q[i],q[j]);

}

quick_sort(l,j);

quick_sort(j+1,r);

}

int main(){

scanf(“%d”,&n);

for(int i=0;i<n;i++){

scanf(“%d”,&q[i]);

}

quick_sort(0,n-1);

for(int i=0;i<n;i++){

printf("%d ",q[i]);

}

return 0;

}

//归并排序

#include

using namespace std;

const int N=100000+10;

int q[N],res[N],n;

void merge_sort(int l,int r){

if(l>=r) return;

int mid=l+r>>1;//l+r的值右移1位 相当l+r的值除以2取整

//是比特操作,可以看做是除2,如

//12的二进制表示是00001100,12>>1将00001100右移一位,变为00000110,即6.

//15的二进制表示是00001111,15>>1将00001111右移一位,变为00000111,即7.

//另外<<就是左移,相当于乘以2.

merge_sort(l,mid);

merge_sort(mid+1,r);

int i=l,j=mid+1,k=0;

while(i<=mid&&j<=r){

if(q[i]<q[j]){

res[k++]=q[i++];

}else{

res[k++]=q[j++];

}

}

while(i<=mid) res[k++]=q[i++];

while(j<=r) res[k++]=q[j++];

for(i=0,j=l;j<=r;j++){

q[j]=res[i++];

}

}

int main(){

scanf(“%d”,&n);

for(int i=0;i<n;i++){

scanf(“%d”,&q[i]);

}

merge_sort(0,n-1);

for(int i=0;i<n;i++){

printf("%d ",q[i]);

}

return 0;

}

//归并排序CSDN转载照打

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值