每日三百行代码第一天

------b站学习篇

//单链表 ACwing
#include<iostream>
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<iostream>
#include<string>
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<iostream>
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<iostream>
#include<cstdio>
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<iostream>
#include<cstdio>
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<iostream>
#include<cstdio> 
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<iostream>
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转载照打
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
 
void merge(int a[],int l,int r,int mid)
{
   
  int aux[r-l+1],i,j,k;
  
  for(k=l;k<=r;k++)
  aux[k-l]=a[k];
  
  i=l;
  j=mid+1;
  for(k=l;k<=r;k++)
  {
   
  	if(i>mid)
  	{
   
  		a[k]=aux[j-l];
  		j++;
	  }
	else if(j>r)
	{
   
		a[k]=aux[i-l];
		i++;
	  }
	else if(aux[i-l]>aux[j-l])
	{
   
		a[k]=aux[j-l];
		j++;
		}
	else
	{
   
		a[k]=aux[i-l];
		i++;
			}
				    
  	
	  }	
	
}
 
void merge_sort(int a[],int l,int r)
{
   
    if(l>=r)
	return ;
	
	int mid=(l+r)/2;
	
	merge_sort(a,l,mid);
	merge_sort(a,mid+1,r);
	merge(a,l,r,mid);	
	
}
 
 
void mergesort(int a[],int l,int r)
{
   
	merge_sort(a,l,r-1);
}
 
int main()
{
   
	int a[105],n,i;
	scanf("%d",&n);
	
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	
	mergesort(a,0,n);
	
	for(i=0;i<n;i++)
	printf("%d ",a[i]);
	
	
	return 0;
 }