Data Structure
写在前面
数据结构这种东西,还是需要学习一下的。不能投机取巧用STL了,得学会自己手写,毕竟效率差距非常大。
关键是明白原理,然后需要自己手写实践一下,踩坑才行。
代码能力太差,需要多写代码提高。
树形数据结构可能用指针比较多吧。另外那些可以用指针写的数据结构就用指针写。毕竟效率高(可以装逼)
链表
双向链表(最常用的链表,没有之一)
#include<cstdio> #include<cstdlib> using namespace std; typedef struct ListNode{ int data; ListNode* pre; ListNode* nxt; }List; int length; List* CreateList(int len) { List* ret=(List*)malloc(sizeof(List)); List* tail=ret; ret->pre=ret,ret->nxt=ret,ret->data=1; for(int i=2;i<=len;i++) { List* newnode=(List*)malloc(sizeof(List)); newnode->data=i, tail->nxt=newnode,newnode->pre=tail,newnode->nxt=ret,tail=newnode; } ret->pre=tail; length=len; return ret; } void Delete(List* pos) { pos->pre->nxt=pos->pre; pos->nxt->pre=pos->nxt; free(pos); length--; } List* JumpToItem(List* list,int n) { if(n==0) return list; while(n--) list=list->nxt; return list; } void Print(List* list) { printf("%d ",list->data); for(int i=2;i<=length;i++) { list=list->nxt; printf("%d ",list->data); } printf("\n"); } void InsertAft(List* pos,int data) { List* newnode=(List*)malloc(sizeof(newnode)); newnode->data=data, newnode->pre=pos,newnode->nxt=pos->nxt,pos->nxt=newnode; length++; } void InsertBef(List* pos,int data) { pos=pos->pre; InsertAft(pos,data); } int main() { List* list=CreateList(15); Print(list); Delete(list); Print(JumpToItem(list,1)); InsertAft(list,233); Print(JumpToItem(list,1)); InsertBef(JumpToItem(list,2),2333); Print(JumpToItem(list,1)); return 0; }
Trie树
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; typedef struct TrieNode{ TrieNode* nxt[26]; bool isStr; TrieNode(){memset(nxt,NULL,sizeof(nxt));isStr=false;} }Trie; inline void insert(Trie* root,char* str) { if(root==NULL||str=='\0')return; Trie* p=root; while(*str!='\0') { int pos=*str-'a'; if(p->nxt[pos]==NULL) { Trie* newnode=new Trie; p->nxt[pos]=newnode; } p=p->nxt[pos]; ++str; } p->isStr=1; } inline bool search(Trie* root,char* str) { Trie* p=root; while(p!=NULL&&*str!='\0') { p=p->nxt[*str-'a']; ++str; } return (p!=NULL&&p->isStr==1); } inline void del(Trie* root) { for(int i=0;i<26;i++) if(root->nxt[i]!=NULL)del(root->nxt[i]); delete root; } int main() { Trie* root=new Trie; insert(root,"maki"); printf(search(root,"maki")?"1":"0"); return 0; }
线段树
#include<cstdio> using namespace std; const int maxn=2*1e7+10;//5*1e6 long long sum[maxn];//real long long addv[maxn];//lazy-tag long long c[maxn/4]; #define mid ((l+r)>>1) #define lson (o<<1) #define rson (lson|1) inline void build(int o,int l,int r) { addv[o]=0; if(l==r)sum[o]=c[l]; else { build(lson,l,mid); build(rson,mid+1,r); sum[o]=sum[lson]+sum[rson]; } } inline void push_down(int o,int l,int r) { addv[lson]+=addv[o]; addv[rson]+=addv[o]; sum[lson]+=(mid-l+1)*addv[o]; sum[rson]+=(r-mid)*addv[o]; addv[o]=0; } inline void update(int o,int l,int r,int a,int b,int x) { if(l>=a&&r<=b) { addv[o]+=x; sum[o]+=(r-l+1)*x; return; } if(addv[o])push_down(o,l,r); if(a<=mid)update(lson,l,mid,a,b,x); if(b>mid)update(rson,mid+1,r,a,b,x); sum[o]=sum[lson]+sum[rson]; } inline long long query(int o,int l,int r,int a,int b) { if(l>=a&&r<=b)return sum[o]; long long ans=0; if(addv[o])push_down(o,l,r); if(a<=mid)ans+=query(lson,l,mid,a,b); if(b>mid)ans+=query(rson,mid+1,r,a,b); return ans; } int n,m,f; int x,y,k; int main() { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++)scanf("%d",&c[i]); build(1,1,n); for(int i=1; i<=m; i++) { scanf("%d",&f); if(f&1) { scanf("%d%d%d",&x,&y,&k); update(1,1,n,x,y,k); } else { scanf("%d%d",&x,&y); printf("%lld\n",query(1,1,n,x,y)); } } return 0; }