commit e576079c7707f7650c5248d49e22a8b100d53aeb Author: xianya Date: Mon Mar 17 00:29:43 2025 +0800 init diff --git a/函数/素数定理.cpp b/函数/素数定理.cpp new file mode 100644 index 0000000..d652b0c --- /dev/null +++ b/函数/素数定理.cpp @@ -0,0 +1,14 @@ +#include +#include +memset(vis,0,sizeof(vis)); + + +int get_prime_nums(int n){ //1 ~ 10^nλ + double m=double(n-log10(n)-log10(log(10))); + return int(m)+1; +} +int main() +{ + int n=12; + printf("%d",get_prime_nums(n)); +} diff --git a/学习路径/数据结构/.obsidian/app.json b/学习路径/数据结构/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/学习路径/数据结构/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/学习路径/数据结构/.obsidian/appearance.json b/学习路径/数据结构/.obsidian/appearance.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/学习路径/数据结构/.obsidian/appearance.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/学习路径/数据结构/.obsidian/core-plugins-migration.json b/学习路径/数据结构/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..436f43c --- /dev/null +++ b/学习路径/数据结构/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/学习路径/数据结构/.obsidian/core-plugins.json b/学习路径/数据结构/.obsidian/core-plugins.json new file mode 100644 index 0000000..9405bfd --- /dev/null +++ b/学习路径/数据结构/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/学习路径/数据结构/.obsidian/workspace.json b/学习路径/数据结构/.obsidian/workspace.json new file mode 100644 index 0000000..9bffd84 --- /dev/null +++ b/学习路径/数据结构/.obsidian/workspace.json @@ -0,0 +1,202 @@ +{ + "main": { + "id": "b2b1866767927298", + "type": "split", + "children": [ + { + "id": "f97597d49015723c", + "type": "tabs", + "children": [ + { + "id": "527833ad58ba964c", + "type": "leaf", + "state": { + "type": "localgraph", + "state": { + "file": "数据结构.md", + "options": { + "collapse-filter": true, + "search": "", + "localJumps": 1, + "localBacklinks": true, + "localForelinks": true, + "localInterlinks": false, + "showTags": false, + "showAttachments": false, + "hideUnresolved": false, + "collapse-color-groups": true, + "colorGroups": [], + "collapse-display": true, + "showArrow": false, + "textFadeMultiplier": 0, + "nodeSizeMultiplier": 1, + "lineSizeMultiplier": 1, + "collapse-forces": true, + "centerStrength": 0.518713248970312, + "repelStrength": 10, + "linkStrength": 1, + "linkDistance": 250, + "scale": 1, + "close": true + } + } + } + }, + { + "id": "3cc2e1952d04ba97", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "数据结构.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "2b5effac673ea351", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "数据结构.md", + "mode": "source", + "source": false + } + } + } + ], + "currentTab": 2 + } + ], + "direction": "vertical" + }, + "left": { + "id": "85889f78499fa715", + "type": "split", + "children": [ + { + "id": "b147bc2e405e1f8a", + "type": "tabs", + "children": [ + { + "id": "9f3cc4aacaf44a5a", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "0bf6afcfac58a7a2", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "bdf493e1e11e49c2", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "da0e691d2228a719", + "type": "split", + "children": [ + { + "id": "5bc1abf2c732887b", + "type": "tabs", + "children": [ + { + "id": "2f622afb7172d75e", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "数据结构.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "c71ab00dda97abc3", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "数据结构.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "3e51961fafcf24d5", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "ca2df154a024555c", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "数据结构.md" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "left-ribbon": { + "hiddenItems": { + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, + "canvas:新建白板": false, + "daily-notes:打开/创建今天的日记": false, + "templates:插入模板": false, + "command-palette:打开命令面板": false + } + }, + "active": "9f3cc4aacaf44a5a", + "lastOpenFiles": [ + "图/tips.md", + "数据结构.md", + "新建文件夹" + ] +} \ No newline at end of file diff --git a/学习路径/数据结构/linetreest.cpp b/学习路径/数据结构/linetreest.cpp new file mode 100644 index 0000000..ade0cbc --- /dev/null +++ b/学习路径/数据结构/linetreest.cpp @@ -0,0 +1,119 @@ +#include + +using namespace std; + +void solve() { + int64_t n, m; + cin >> n >> m; + vector a(n + 1); + for (int64_t i = 1; i <= n; i++)cin >> a[i]; + vector tree(4 * n); + vector lazy(4 * n); + auto lz = [&](int64_t p, int64_t s, int64_t t, int64_t x) { + // cerr << "Lazy " << p << " " << s << " " << t << " " << x << "\n"; + tree[p] += (t - s + 1) * x; + lazy[p] += x; + }; + auto build = [&](auto &&self, int64_t s, int64_t t, int64_t p) { + if (s == t) { + tree[p] = a[s]; + return; + } + int64_t m = (s+t)/2; + self(self, s, m, p * 2); + self(self, m + 1, t, p * 2 + 1); + tree[p] = tree[p * 2] + tree[p * 2 + 1]; + }; + build(build, 1, n, 1); + auto query = [&](auto &&self, int64_t l, int64_t r, int64_t s, int64_t t, int64_t p) -> int64_t { + // cerr << "query in " << l << " " << r << " " << s << " " << t << "\n"; + int64_t sum = 0; + if (l <= s && t <= r) return tree[p]; + int64_t m = (s+t)/2; + if (lazy[p]) { + // cerr << "Lazy p " << " " << s << " " << t << " " << p << " " << lazy[p] << "\n"; + lz(p * 2, s, m, lazy[p]); + lz(p * 2 + 1, m + 1, t, lazy[p]); + lazy[p] = 0; + } + if (l <= m) { + sum += self(self, l, r, s, m, p * 2); + } + if (r >= m + 1) { + sum += self(self, l, r, m + 1, t, p * 2 + 1); + } + return sum; + }; + auto modify = [&](auto &&self, int64_t l, int64_t r, int64_t s, int64_t t, int64_t p, int64_t x) -> void { +// cerr << "Modify in " << l << " " << r << " " << s << " " << t << " " << p << " " << x << "\n"; + if (l <= s && t <= r) { + lz(p, s, t, x); + return; + } + int64_t m = s + ((t - s) >> 1); + if (lazy[p] && s != t) { + // cerr << "Lazy p " << " " << s << " " << t << " " << p << " " << lazy[p] << "\n"; + lz(p * 2, s, m, lazy[p]); + lz(p * 2 + 1, m + 1, t, lazy[p]); + lazy[p] = 0; + } + if (l <= m) { + self(self, l, r, s, m, p * 2, x); + } + if (r >= m + 1) { + self(self, l, r, m + 1, t, p * 2 + 1, x); + } + tree[p]=tree[p*2]+tree[p*2+1]; + }; + for (int64_t i = 1; i <= m; i++) { + int64_t x; + cin >> x; + if (x == 1) { + int64_t l, r, x; + cin >> l >> r >> x; + modify(modify, l, r, 1, n, 1, x); + } else { + int64_t l, r; + cin >> l >> r; + cout << query(query, l, r, 1, n, 1) << "\n"; + } + } +} + +int fact(int x); + +int fact(int x) +{ + if(x==0)return 1; + return fact(x-1)*x; +} + +int main() { + int64_t t; +// cin>>t; + t = 1; + while (t--) { + solve(); + } + +// struct F +// { +// int operator()(int x)const{ +// if(x==0)return 1; +// return (*this)(x-1)*x; +// } +// }; +// F f; + +// auto f=[](auto &&self,int x){ +// if(x==0)return 1; +// return self(self,x-1)*x; +// }; + auto f=[](auto &&self,int x){ + if(x==0)return 1; + return self(self,x-1)*x; + }; +// f=[](int x){return x+1;}; + f(f,1); + +} diff --git a/学习路径/数据结构/tree.cpp b/学习路径/数据结构/tree.cpp new file mode 100644 index 0000000..1b8826b --- /dev/null +++ b/学习路径/数据结构/tree.cpp @@ -0,0 +1,39 @@ +#include +using namespace std; +int n; +int lowbit(int x) { + return x & -x; +} +int getsum(int x,vector&c) { // a[1]..a[x]的和 + int ans = 0; + while (x > 0) { + ans = ans + c[x]; + x = x - lowbit(x); + } + return ans; +} +void add(int x, int k,vector&c) { + while (x <= n) { // 不能越界 + c[x] = c[x] + k; + x = x + lowbit(x); + } +} +int main(){ + int m;cin>>n>>m; + vectora(n+1); + vectorc(4*n); + for(int i=1;i<=n;i++){ + cin>>a[i]; + add(i,a[i],c); + } + for(int i=1;i<=m;i++){ + int type,x,y; + cin>>type>>x>>y; + if(type==1){ + add(x,y,c); + a[x]+=y; + } + else cout< +struct edge +{ + int u,v; + int w; +}; +const int N=100; +std::priority_queue> pq; +std::vector e; +std::vector > h; +std::vectordis; +std::vectorvis; +void rebuild(int &n) +{ + e.clear(); + h.resize(n+1); + h.assign(n+1,std::vector()); + dis.resize(n+1); + dis.assign(n+1,FLT_MAX); + vis.resize(n+1); + vis.assign(n+1,0); +} +void add(int u,int v,int w) +{ + e.push_back({u,v,w}); + h[u].push_back(e.size()-1); +} +void dij(int s) +{ + int x; + dis[s]=0; + pq.push({0,s}); + while(pq.size()) + { + auto p=pq.top();pq.pop(); + x=p.second; + //cout<<"x="< +#include +using namespace std; +const int N=1e5; +struct edge +{ + int u,v,w; +}; +vector e; +vector h[N]; +void add(int u,int v,int w) +{ + e.push_back({u,v,w}); + h[u].push_back(e.size()-1); +} +void dfs(int u,int fa) +{ + for(int i=0;i<=h[u].size()-1;i++) + { + int j=h[u][i]; + int v=e[j].v,w=e[j].w; + if(v==fa)continue; + cout<>n>>m; + for(int i=1;i<=m;i++) + { + cin>>u>>v>>w; + add(u,v,w); + add(v,u,w); + } + dfs(1,0); +} diff --git a/学习路径/数据结构/数据结构.md b/学习路径/数据结构/数据结构.md new file mode 100644 index 0000000..e69de29 diff --git a/学习路径/算法/.obsidian/app.json b/学习路径/算法/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/学习路径/算法/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/学习路径/算法/.obsidian/appearance.json b/学习路径/算法/.obsidian/appearance.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/学习路径/算法/.obsidian/appearance.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/学习路径/算法/.obsidian/core-plugins-migration.json b/学习路径/算法/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..436f43c --- /dev/null +++ b/学习路径/算法/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/学习路径/算法/.obsidian/core-plugins.json b/学习路径/算法/.obsidian/core-plugins.json new file mode 100644 index 0000000..9405bfd --- /dev/null +++ b/学习路径/算法/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/学习路径/算法/.obsidian/workspace.json b/学习路径/算法/.obsidian/workspace.json new file mode 100644 index 0000000..626df3b --- /dev/null +++ b/学习路径/算法/.obsidian/workspace.json @@ -0,0 +1,143 @@ +{ + "main": { + "id": "024a9f08a4a36715", + "type": "split", + "children": [ + { + "id": "7ef1e397ed33f651", + "type": "tabs", + "children": [ + { + "id": "bf850a0d6b69d292", + "type": "leaf", + "state": { + "type": "empty", + "state": {} + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "3a85fc26c5dfdecd", + "type": "split", + "children": [ + { + "id": "54350b95f3ed40f8", + "type": "tabs", + "children": [ + { + "id": "90a534f2c0bc7d84", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "0592d798b63a27fa", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "8e7c074cdf9bf099", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "5d948eb3b8d7acf5", + "type": "split", + "children": [ + { + "id": "e4e30f69dd4cbea4", + "type": "tabs", + "children": [ + { + "id": "95432adab680d8f1", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "64e7a6d309a56f98", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "71039966636d2285", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "46a0dffb0a71fb95", + "type": "leaf", + "state": { + "type": "outline", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, + "canvas:新建白板": false, + "daily-notes:打开/创建今天的日记": false, + "templates:插入模板": false, + "command-palette:打开命令面板": false + } + }, + "active": "bf850a0d6b69d292", + "lastOpenFiles": [] +} \ No newline at end of file diff --git a/学习路径/算法/kmp.cpp b/学习路径/算法/kmp.cpp new file mode 100644 index 0000000..94f66ae --- /dev/null +++ b/学习路径/算法/kmp.cpp @@ -0,0 +1,23 @@ +int kmp(string a1,string a2) +{ + int n=a1.size(),m=a2.size(); + //cout<<"n="<>t; + for(int i=1;i<=t;i++) + { + memset(ch,0,sizeof ch); + solve(); + } + } diff --git a/学习路径/算法/最大区间异或和.exe b/学习路径/算法/最大区间异或和.exe new file mode 100644 index 0000000..3fdafb6 Binary files /dev/null and b/学习路径/算法/最大区间异或和.exe differ diff --git a/学习路径/算法/欧拉筛.cpp b/学习路径/算法/欧拉筛.cpp new file mode 100644 index 0000000..c66144e --- /dev/null +++ b/学习路径/算法/欧拉筛.cpp @@ -0,0 +1,24 @@ +#include +using namespace std; +vectorprime(1000000); +vectorvis(10000001); +int k1=0; +int main() { + vectorprime(); + vectorvis(); + int k1=0; + auto primeadd = [&](int small, int big) { + + int i, j; + if (small == 1)small = 2; + for (i = small; i <= big; i++) { + if (vis[i] == 0)prime[k1++] = i; + for (j = 0; j < k1; j++) { + if (i * prime[j] > big)break; + vis[i * prime[j]] = 1; + if (i % prime[j] == 0)break; + } + } + }; + primeadd(1,2); +} \ No newline at end of file diff --git a/学习路径/算法/高精度乘法.cpp b/学习路径/算法/高精度乘法.cpp new file mode 100644 index 0000000..b3cfdd9 --- /dev/null +++ b/学习路径/算法/高精度乘法.cpp @@ -0,0 +1,32 @@ +#include +#include +int main(){ + char a1[2005],b1[2005]; + int a[2005],b[2005],c[10000],lena,lenb,lenc,i,j,x; + memset(a,0,sizeof a); + memset(b,0,sizeof b); + memset(c,0,sizeof c); + //scanf("%[^\n]%*c%[^\n]%*c",&a1,&b1); + scanf("%s%s",&a1,&b1); + lena=strlen(a1); + lenb=strlen(b1); + for(i=0;i<=lena-1;i++)a[lena-i]=a1[i]-48;//дa + for(i=0;i<=lenb-1;i++)b[lenb-i]=b1[i]-48;//дb + for(i=1;i<=lena;i++) + { + x=0; //ڴŽλ + for(j=1;j<=lenb;j++) //Գÿһλд + { + c[i+j-1]=c[i+j-1]+a[i]*b[j]+x; //ԭϵǰ˻ϴγ˻λ + x=c[i+j-1]/10; + c[i+j-1]%=10; + } + c[i+lenb]=x; //λ + } + lenc=lena+lenb; + while(c[lenc]==0&&lenc>1) //ɾǰ0 + lenc--; + for(i=lenc;i>=1;i--) + printf("%d",c[i]); + printf("\n"); +} diff --git a/学习路径/算法/高精度加法.cpp b/学习路径/算法/高精度加法.cpp new file mode 100644 index 0000000..48db2c1 --- /dev/null +++ b/学习路径/算法/高精度加法.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +using namespace std; +int a1[500],b1[500],c[500]; +int main() +{ + memset(a1,0,sizeof a1); + memset(b1,0,sizeof b1); + memset(c,0,sizeof c); + int lena,lenb,lenc,i; + char a[500],b[500]; + cin>>a>>b; //ַabֱint + lena=strlen(a); + lenb=strlen(b); + for(i=0;i<=lena-1;i++)a1[lena-i]=a[i]-48; //дa; + for(i=0;i<=lena-1;i++)b1[lenb-i]=b[i]-48; //дb; + + + + //ʽӷ + int x=0; //λ + lenc=lena>lenb? lena:lenb; // + for(i=1;i<=lenc;i++) + { + c[i]=a1[i]+b1[i]; //ʽӷ + x=c[i]/10; + c[i]%=10; //λ + } + c[i+1]=x; //λ + lenc=lenc+1; + while(c[lenc]==0&&lenc>1)lenc--; //ɾǰ0; + for(i=lenc;i>=1;i--) + cout<> i) & 1 + if not node.children[bit]: + node.children[bit] = TrieNode() + node = node.children[bit] + + def find_max_xor(self, num): + node = self.root + max_xor = 0 + for i in range(31, -1, -1): + bit = (num >> i) & 1 + opposite_bit = 1 - bit + if node.children[opposite_bit]: + max_xor |= (1 << i) # Set the bit in the result + node = node.children[opposite_bit] + else: + node = node.children[bit] + return max_xor +``` + +#### 3. 查询并更新最大异或和 + +```python +trie = Trie() +max_xor_sum = 0 +for i in range(1, n + 1): + trie.insert(prefix[i - 1]) # Insert prefix[i-1] into the trie + max_xor_sum = max(max_xor_sum, trie.find_max_xor(prefix[i])) + +print(max_xor_sum) +``` + +注意:上述代码中的 `find_max_xor` 函数实际上是在查找与 `prefix[i]` 之前的某个前缀异或和的最大异或值,而不是直接求区间 $[l, r]$ 的最大异或和。但是,由于我们使用了前缀异或和,所以可以通过 $prefix[r] \oplus prefix[l-1]$ 来计算区间 $[l, r]$ 的异或和。因此,上述算法实际上是在遍历所有可能的区间,并找到能产生最大异或和的区间。 + +另外,上述代码中的 `31` 是基于32位整数的假设。如果你的整数位数不同,需要相应地调整这个值。 +内容由AI大模型生成,仅供参考 \ No newline at end of file diff --git a/思路/思路/P1045.md b/思路/思路/P1045.md new file mode 100644 index 0000000..084e427 --- /dev/null +++ b/思路/思路/P1045.md @@ -0,0 +1,5 @@ +快速幂 +2^P +P对2取模:P&1 +整除为0 +下一个 \ No newline at end of file diff --git a/思路/思路/Pasted image 20240722135718.png b/思路/思路/Pasted image 20240722135718.png new file mode 100644 index 0000000..20e88a0 Binary files /dev/null and b/思路/思路/Pasted image 20240722135718.png differ diff --git a/思路/思路/Pasted image 20240722135849.png b/思路/思路/Pasted image 20240722135849.png new file mode 100644 index 0000000..273d0f1 Binary files /dev/null and b/思路/思路/Pasted image 20240722135849.png differ diff --git a/思路/思路/Pasted image 20240723133310.png b/思路/思路/Pasted image 20240723133310.png new file mode 100644 index 0000000..52cb4c1 Binary files /dev/null and b/思路/思路/Pasted image 20240723133310.png differ diff --git a/思路/思路/Pasted image 20240723133402.png b/思路/思路/Pasted image 20240723133402.png new file mode 100644 index 0000000..c41c650 Binary files /dev/null and b/思路/思路/Pasted image 20240723133402.png differ diff --git a/思路/思路/Pasted image 20240723133440.png b/思路/思路/Pasted image 20240723133440.png new file mode 100644 index 0000000..6761433 Binary files /dev/null and b/思路/思路/Pasted image 20240723133440.png differ diff --git a/思路/思路/Pasted image 20240723133551.png b/思路/思路/Pasted image 20240723133551.png new file mode 100644 index 0000000..45bf647 Binary files /dev/null and b/思路/思路/Pasted image 20240723133551.png differ diff --git a/思路/思路/Pasted image 20240723133840.png b/思路/思路/Pasted image 20240723133840.png new file mode 100644 index 0000000..e493416 Binary files /dev/null and b/思路/思路/Pasted image 20240723133840.png differ diff --git a/思路/思路/algorithm/algorithm库.md b/思路/思路/algorithm/algorithm库.md new file mode 100644 index 0000000..ac0e0b0 --- /dev/null +++ b/思路/思路/algorithm/algorithm库.md @@ -0,0 +1,101 @@ +**<1>序列容器遍历操作** + +常用参数对照: +frist : 起点,为一个[[迭代器]] +last : 终点,为一个[[迭代器]] + +[[for_each]] +功能: 遍历序列容器,将区间【fist,last)之内每一个元素传入函数fn,在函数fn内对元素进行操作; + +[[find]] +功能: 返回一个迭代器,该迭代器返回等于val的范围内的第一个元素的迭代器。如果找不到这样的元素,则函数返回last迭代器。 + +[[find_if]] +功能: 将区间【fist,last)之内每一个元素传入一元判断式:当pred(elem) 返回true时返回第一个达成条件的元素迭代器; + +[[equal]] +功能: 比较两个序列的逐个元素是否相等; + +[[count]] +功能: 返回序列中等于给定值元素的个数; + +**<2> 序列修改操作** +[[swap]] + +函数功能:交换a和b + +[[replace]] + +功能: 把序列中等于old_value元素替换为 new_value; + +[[replace_if]] + +功能: 将区间[fist,last)之内每一个元素传入一元判断式:当pred(elem) 返回true时的元素替换成new_value; + +**序列排序** +[[sort]] + +函数功能: +两个重载: 第一个对first到last 升序排序 +第二个在第一个基础上传入一个传入一元判断式comp为a < b则升序,否则降序 + +**排列函数** +[[next_permutation]] + +函数功能: +求的是序列当前排列的下一个排列,当当前序列不存在下一个排列时,函数返回false,否则返回true。 +注意: next_permutation() 在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。 + +代码: + + #include + #include + using namespace std; + int main() + { + int num[3]={1,2,3}; + do + { + cout< +#include +#include +using namespace std; +int main() +{ + int n,p[10]; + + scanf("%d",&n); + for(int i = 0;i < n;i ++) + { + scanf("%d",&p[i]); + } + sort(p,p+n); //事先排序以保证全排列 + do + { + for(int i = 0;i < n;i ++) + { + printf("%d ",p[i]);//对于排好序的数组,直接输出即为第一个排列 + } + printf("\n"); + }while(next_permutation(p,p+n)); + + return 0; +} \ No newline at end of file diff --git a/思路/思路/algorithm/count.md b/思路/思路/algorithm/count.md new file mode 100644 index 0000000..1407a85 --- /dev/null +++ b/思路/思路/algorithm/count.md @@ -0,0 +1,32 @@ +函数原型: +``` +template + typename iterator_traits::difference_type + count (InputIterator first, InputIterator last, const T& val) +{ + typename iterator_traits::difference_type ret = 0; + while (first!=last) { + if (*first == val) ++ret; + ++first; + } + return ret; +} +``` +功能: 返回序列中等于给定值元素的个数; + +示例: + +``` +#include +#include +#include + +int main() { + std::vector numbers = {1, 2, 3, 2, 4, 2, 5}; + + int countOfTwos = std::count(numbers.begin(), numbers.end(), 2); + std::cout << "数字 2 出现的次数: " << countOfTwos << std::endl; + + return 0; +} +``` \ No newline at end of file diff --git a/思路/思路/algorithm/equal.md b/思路/思路/algorithm/equal.md new file mode 100644 index 0000000..347688b --- /dev/null +++ b/思路/思路/algorithm/equal.md @@ -0,0 +1,29 @@ +函数原型: + +``` +template + bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 ) +{ + while (first1!=last1) { + if (!(*first1 == *first2)) // or: if (!pred(*first1,*first2)), for version 2 + return false; + ++first1; ++first2; + } + return true; +} +``` +功能: 比较两个序列的逐个元素是否相等。返回的是一个bool值; + +示例: + +``` +// 比较 vec1 和 vec2 +if (std::equal(vec1.begin(), vec1.end(), vec2.begin())) +{ + std::cout << "vec1 和 vec2 是相等的。" << std::endl; +} +else +{ + std::cout << "vec1 和 vec2 是不相等的。" << std::endl; +} +``` diff --git a/思路/思路/algorithm/find.md b/思路/思路/algorithm/find.md new file mode 100644 index 0000000..6314cbb --- /dev/null +++ b/思路/思路/algorithm/find.md @@ -0,0 +1,24 @@ +函数原型: + +``` +template + InputIterator find (InputIterator first, InputIterator last, const T& val) +{ + while (first!=last) { + if (first*val) return first;* + *++first;* + *}* + *return last;* +} + +``` + +功能: 返回一个迭代器,该迭代器返回等于val的范围内的第一个元素的迭代器。如果找不到这样的元素,则函数返回last迭代器。 +示例: + +``` +int a[] = {1,2,3,4,5,6,7}; +vector v(a,a+7); +vector::iterator it = find(v.begin(),v.end(),5);//*it = 5 +it = find(v.begin(),v.end(),9);//*it = 0* +``` \ No newline at end of file diff --git a/思路/思路/algorithm/find_if.md b/思路/思路/algorithm/find_if.md new file mode 100644 index 0000000..f28f5e3 --- /dev/null +++ b/思路/思路/algorithm/find_if.md @@ -0,0 +1,25 @@ +函数原型: +``` +template + InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) +{ + while (first!=last) { + if (pred(*first)) return first; + ++first; + } + return last; +} +``` + + +功能: 将区间【fist,last)之内每一个元素传入一元判断式:当pred(elem) 返回true时返回第一个达成条件的元素迭代器; + +示例: + +``` +std::vector numbers = {1, 2, 3, 4, 5, 6}; +// 查找第一个大于4的元素 +auto it = std::find_if(numbers.begin(), numbers.end(), [](int n) { +return n > 4; +}); +``` \ No newline at end of file diff --git a/思路/思路/algorithm/for_each.md b/思路/思路/algorithm/for_each.md new file mode 100644 index 0000000..8ae74ac --- /dev/null +++ b/思路/思路/algorithm/for_each.md @@ -0,0 +1,27 @@ +函数原型: +template Function for_each(InputIterator first, InputIterator last, Function fn) +功能: 遍历序列容器,将区间【fist,last)之内每一个元素传入函数fn,在函数fn内对元素进行操作; + +示例: + +``` +#include +#include +#include +using namespace std; +//遍历数组vector,修改vector里的所有元素值为5,输出元素 +void fn(int &item) +{ + item = 5; + cout << item << endl; +} + +int main() +{ + int a[] = {1,2,3,4,5,6,7}; + vector v(a,a+7); + for_each(v.begin(),v.end(),fn); +} + +``` + diff --git a/思路/思路/algorithm/next_permutation.md b/思路/思路/algorithm/next_permutation.md new file mode 100644 index 0000000..14894ae --- /dev/null +++ b/思路/思路/algorithm/next_permutation.md @@ -0,0 +1,8 @@ +函数原型: +``` +bool next_permutation(iterator start,iterator end) +``` + +函数功能: +求的是序列当前排列的[[下一个排列]],当当前序列不存在下一个排列时,函数返回false,否则返回true。 +注意: next_permutation() 在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。 diff --git a/思路/思路/algorithm/replace.md b/思路/思路/algorithm/replace.md new file mode 100644 index 0000000..5f4262f --- /dev/null +++ b/思路/思路/algorithm/replace.md @@ -0,0 +1,23 @@ +函数原型: + +``` +template + void replace (ForwardIterator first, ForwardIterator last, + const T& old_value, const T& new_value) +{ + while (first!=last) { + if (*first == old_value) *first=new_value; + ++first; + } +} +``` + +功能: 把序列中等于old_value元素替换为 new_value; + +示例: + +``` +int a[] = {1,4,6,5,5,3,7}; + vector v(a,a+7); + replace(v.begin(),v.end(),5,55);//把5替换成55 +``` \ No newline at end of file diff --git a/思路/思路/algorithm/replace_if.md b/思路/思路/algorithm/replace_if.md new file mode 100644 index 0000000..72ac66b --- /dev/null +++ b/思路/思路/algorithm/replace_if.md @@ -0,0 +1,35 @@ +函数原型: + +``` +template < class ForwardIterator, class UnaryPredicate, class T > + void replace_if (ForwardIterator first, ForwardIterator last, + UnaryPredicate pred, const T& new_value) +{ + while (first!=last) { + if (pred(*first)) *first=new_value; + ++first; + } +} +``` +功能: 将区间[fist,last)之内每一个元素传入一元判断式:当pred(elem) 返回true时的元素替换成new_value; + +示例代码: + +``` + #include + #include + #include + using namespace std; + //把小于5的替换为8 + bool fun(int i) + { + return i < 5; + } + int main() + { + int a[] = {1,2,3,4,5,6,7}; + vector vec(a,a+7); + replace_if(vec.begin(),vec.end(),fun,8); //vec = [8 8 8 8 5 6 7] + return 0; + } +``` \ No newline at end of file diff --git a/思路/思路/algorithm/sort.md b/思路/思路/algorithm/sort.md new file mode 100644 index 0000000..dc4f5a8 --- /dev/null +++ b/思路/思路/algorithm/sort.md @@ -0,0 +1,29 @@ +函数原型: + +``` +template + void sort (RandomAccessIterator first, RandomAccessIterator last); +template + void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); +``` + +函数功能: +两个重载: 第一个对first到last 升序排序 +第二个在第一个基础上传入一个传入一元判断式comp为a < b则升序,否则降序 + +示例: + +``` + bool fun(int a,int b) + { + return a < b; // a < b : vec = 1 2 3 4 5 6 7 + // a > b : vec = 7 6 5 4 3 2 1 + } + int main() + { + int a[] = {1,3,2,4,6,7,5}; + vector vec(a,a+7); + sort(vec.begin(),vec.end(),fun); //vec = [1 2 3 4 5 6 7] + return 0; + } +``` \ No newline at end of file diff --git a/思路/思路/algorithm/swap.md b/思路/思路/algorithm/swap.md new file mode 100644 index 0000000..7fe0cef --- /dev/null +++ b/思路/思路/algorithm/swap.md @@ -0,0 +1,3 @@ +``` +swap(a,b); +``` \ No newline at end of file diff --git a/思路/思路/algorithm/迭代器.md b/思路/思路/algorithm/迭代器.md new file mode 100644 index 0000000..400d2b5 --- /dev/null +++ b/思路/思路/algorithm/迭代器.md @@ -0,0 +1 @@ +C++中的迭代器是提供对容器(如数组、向量、列表等)中元素进行访问的方法,它类似于指针,但比指针更通用、更安全,可以遍历容器中的元素而不需要了解容器的内部结构。 \ No newline at end of file diff --git a/思路/思路/tips.md b/思路/思路/tips.md new file mode 100644 index 0000000..089e323 --- /dev/null +++ b/思路/思路/tips.md @@ -0,0 +1,3 @@ +scanf(“%c”)会识别换行符。 +![[Pasted image 20240723133840.png]] +不如cin \ No newline at end of file diff --git a/思路/思路/下一个排列.md b/思路/思路/下一个排列.md new file mode 100644 index 0000000..141e3fb --- /dev/null +++ b/思路/思路/下一个排列.md @@ -0,0 +1,11 @@ +要手动计算下一个排列,可以遵循以下步骤。我们将使用字典序来说明如何找到下一个排列。 + +### 方法步骤: +1. **找到最大的 i**:从后向前找到第一个地方 `i`,使得 `nums[i] < nums[i + 1]`。如果没有找到这样的 i,表示当前排列是最后一个排列,返回第一个排列(即将数组逆序)。 + +2. **找到最大的 j**:从后向前找到一个 `j`,使得 `nums[j] > nums[i]`。这一步的目的是找到一个比 `nums[i]` 大的最小元素。 + +3. **交换**:交换 `nums[i]` 和 `nums[j]`。 + +4. **反转**:然后,将 `nums[i + 1]` 到 `nums[n - 1]` 的部分进行反转(使其按照升序排列)。 + diff --git a/思路/思路/控制输出.md b/思路/思路/控制输出.md new file mode 100644 index 0000000..0395fd5 --- /dev/null +++ b/思路/思路/控制输出.md @@ -0,0 +1,66 @@ +[C++ 格式化输出(前置补0,有效位数,保留小数,上下取整,四舍五入)_c++输出前面补0-CSDN博客](https://blog.csdn.net/HYY_2000/article/details/124026458) +![[Pasted image 20240723133310.png]] +头文件iomanip +控制符setw +输出控制符setfill +![[Pasted image 20240723133402.png]] +setprecision控制有效数字、 +![[Pasted image 20240723133440.png]] +fixed控制小数点后几位 +![[Pasted image 20240723133551.png]] +cmath +ceil向上取整 +floor向下取整 +round四舍五入 + + +string str:生成空字符串 + +string s(str):生成字符串为str的复制品 + +string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值 + +string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值 + +string s(num ,c):生成num个c字符的字符串 + +string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值 + +eg: + + + string str1; //生成空字符串 + string str2("123456789"); //生成"1234456789"的复制品 + string str3("12345", 0, 3);//结果为"123" + string str4("012345", 5); //结果为"01234" + string str5(5, '1'); //结果为"11111" + string str6(str2, 2); //结果为"3456789" + +1. size()和length():返回string对象的字符个数,他们执行效果相同。 + +2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常 + +3. capacity():重新分配内存之前,string对象能包含的最大字符数 + +1. C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。 +在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小, +比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面) +同时,string (“aaaa”) 序列容器遍历操作 +常用参数对照: +frist : 起点,为一个迭代器 +last : 终点,为一个迭代器 + +for_each +函数原型: + +template + Function for_each(InputIterator first, InputIterator last, Function fn) +1 +2 +功能: 遍历序列容器,将区间[fist,last)之内每一个元素传入函数fn,在函数fn内对元素进行操作; + +示例: + +#include +#include +#include +using namespace std; +//遍历数组vector,修改vector里的所有元素值为5,输出元素 +void fn(int &item) +{ + item = 5; + cout << item << endl; +} + +int main() +{ + int a[] = {1,2,3,4,5,6,7}; + vector v(a,a+7); + for_each(v.begin(),v.end(),fn); +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +find +函数原型: + +template + InputIterator find (InputIterator first, InputIterator last, const T& val) +{ + while (first!=last) { + if (*first==val) return first; + ++first; + } + return last; +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +功能: 返回一个迭代器,该迭代器返回等于val的范围内的第一个元素的迭代器。如果找不到这样的元素,则函数返回last迭代器。 +示例: + +int a[] = {1,2,3,4,5,6,7}; +vector v(a,a+7); +vector::iterator it = find(v.begin(),v.end(),5);//*it = 5 +it = find(v.begin(),v.end(),9);//*it = 0 +1 +2 +3 +4 +find_if +函数原型: + +template + InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) +{ + while (first!=last) { + if (pred(*first)) return first; + ++first; + } + return last; +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +功能: 将区间[fist,last)之内每一个元素传入一元判断式:当pred(elem) 返回true时返回第一个达成条件的元素迭代器; + +示例: + +int a[] = {1,4,6,2,5,3,7}; + vector v(a,a+7); + vector::iterator it = find_if(v.begin(),v.end(),fun);//*it = 6 +1 +2 +3 +equal +函数原型: + +template + bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 ) +{ + while (first1!=last1) { + if (!(*first1 == *first2)) // or: if (!pred(*first1,*first2)), for version 2 + return false; + ++first1; ++first2; + } + return true; +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +功能: 比较两个序列的逐个元素是否相等; + +count +函数原型: + +template + typename iterator_traits::difference_type + count (InputIterator first, InputIterator last, const T& val) +{ + typename iterator_traits::difference_type ret = 0; + while (first!=last) { + if (*first == val) ++ret; + ++first; + } + return ret; +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +功能: 返回序列中等于给定值元素的个数; + +示例: + +int a[] = {1,4,6,4,5,3,7}; + vector v(a,a+7); + //把所有的三的倍数替换为 8 + replace_if(v.begin(),v.end(),fun,8); //v = [1 4 8 4 5 8 7] +1 +2 +3 +4 +<2> 序列修改操作 +swap +函数原型: + +template void swap ( T& a, T& b ) +{ + T c(a); a=b; b=c; +} +1 +2 +3 +4 +函数功能:交换a和b + +replace +函数原型: + +template + void replace (ForwardIterator first, ForwardIterator last, + const T& old_value, const T& new_value) +{ + while (first!=last) { + if (*first == old_value) *first=new_value; + ++first; + } +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +功能: 把序列中等于old_value元素替换为 new_value; + +示例: + +int a[] = {1,4,6,5,5,3,7}; + vector v(a,a+7); + replace(v.begin(),v.end(),5,55);//把5替换成55 +1 +2 +3 +replace_if +函数原型: + +template < class ForwardIterator, class UnaryPredicate, class T > + void replace_if (ForwardIterator first, ForwardIterator last, + UnaryPredicate pred, const T& new_value) +{ + while (first!=last) { + if (pred(*first)) *first=new_value; + ++first; + } +} +1 +2 +3 +4 +5 +6 +7 +8 +9 +功能: 将区间[fist,last)之内每一个元素传入一元判断式:当pred(elem) 返回true时的元素替换成new_value; + +示例代码: + + #include + #include + #include + using namespace std; + //把小于5的替换为8 + bool fun(int i) + { + return i < 5; + } + int main() + { + int a[] = {1,2,3,4,5,6,7}; + vector vec(a,a+7); + replace_if(vec.begin(),vec.end(),fun,8); //vec = [8 8 8 8 5 6 7] + return 0; + } + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +序列排序 +sort +函数原型: + +template + void sort (RandomAccessIterator first, RandomAccessIterator last); +template + void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); +1 +2 +3 +4 +函数功能: +两个重载: 第一个对first到last 升序排序 +第二个在第一个基础上传入一个传入一元判断式comp为a < b则升序,否则降序 +示例: + + bool fun(int a,int b) + { + return a < b; // a < b : vec = 1 2 3 4 5 6 7 + // a > b : vec = 7 6 5 4 3 2 1 + } + int main() + { + int a[] = {1,3,2,4,6,7,5}; + vector vec(a,a+7); + sort(vec.begin(),vec.end(),fun); //vec = [1 2 3 4 5 6 7] + return 0; + } +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +排列函数 +next_permutation +函数原型: + + bool next_permutation(iterator start,iterator end) +1 +函数功能: +求的是序列当前排列的下一个排列,当当前序列不存在下一个排列时,函数返回false,否则返回true。 +注意: next_permutation() 在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。 + +代码: + + #include + #include + using namespace std; + int main() + { + int num[3]={1,2,3}; + do + { + cout< +#include +#include +using namespace std; +int main() +{ + int n,p[10]; + + scanf("%d",&n); + for(int i = 0;i < n;i ++) + { + scanf("%d",&p[i]); + } + sort(p,p+n); //事先排序以保证全排列 + do + { + for(int i = 0;i < n;i ++) + { + printf("%d ",p[i]);//对于排好序的数组,直接输出即为第一个排列 + } + printf("\n"); + }while(next_permutation(p,p+n)); + + return 0; +} +———————————————— + + 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 + +原文链接:https://blog.csdn.net/qq_44829295/article/details/107632453 \ No newline at end of file diff --git a/思路/思路/未命名/未命名.md b/思路/思路/未命名/未命名.md new file mode 100644 index 0000000..0314df1 --- /dev/null +++ b/思路/思路/未命名/未命名.md @@ -0,0 +1,126 @@ +```cpp +#include + +using namespace std; + +int main() { + int n; + ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); + cin>>n; +// long long ans=0; //维护逆序对 + vectora(n); + for(int i=0;i>a[i]; + auto merge=[&](vector&a,vector&b)->vector + { + vectorres; + size_t ai=0,bi=0; + while(ai&arr)->vector{ + if(arr.size()<=1)return arr; + const size_t mid=arr.size()>>1; + vector left(arr.begin(),arr.begin()+mid); + vector right(arr.begin()+mid,arr.end()); + left=self(self,left); + right=self(self,right); + return merge(left,right); + }; + a=merge_sort(merge_sort,a); + for(auto i:a) + cout<&a) +{ + printf("[%d,%d]=(%d,%d,%d)\n",a[p].l,a[p].r,a[p].w,0,0); + dfssgt(p*2,a); + dfssgt(p*2+1,a); +} +void sgtdbg(vector&a) +{ + printf("Tree{\n"); + dfssgt(1,a); + printf("}\n"); +} +void build(int p,vector&tr) +{ + if(tr[p].l==tr[p].r)return; + int m=tr[p].l+tr[p].r>>1; + tr[2*p].l=tr[p].l,tr[2*p].r=m,tr[p*2+1].l=m+1,tr[p*2+1].r=tr[p].r; + build(2*p,tr);build(2*p+1,tr); +} +void modify(int n,int x,int p,vector&tr) +{ + if(tr[p].l==tr[p].r){ + tr[p].w=x; + return; + } + if(n<=tr[2*p].r)modify(n,x,p*2,tr); + else modify(n,x,p*2+1,tr); + tr[p].w=max(tr[2*p].w,tr[2*p+1].w); +} +int querys(int l,int r,int p,vector&tr) +{ + int s=tr[p].l,t=tr[p].r; + if(l<=s&&t<=r)return tr[p].w; + int maxx=0; + if(l<=tr[2*p].r)maxx=max(maxx,querys(l,r,2*p,tr)); + if(r>=tr[2*p+1].l)maxx=max(maxx,querys(l,r,2*p+1,tr)); + return maxx; +} +``` + + +线段交 +```cpp +struct pt { + long long x, y; + pt() {} + pt(long long _x, long long _y) : x(_x), y(_y) {} + pt operator-(const pt& p) const { return pt(x - p.x, y - p.y); } + long long cross(const pt& p) const { return x * p.y - y * p.x; } + long long cross(const pt& a, const pt& b) const { return (a - *this).cross(b - *this); } +}; + +int sgn(const long long& x) { return x >= 0 ? x ? 1 : 0 : -1; } + +bool inter1(long long a, long long b, long long c, long long d) { + if (a > b) + swap(a, b); + if (c > d) + swap(c, d); + return max(a, c) <= min(b, d); +} + +bool check_inter(const pt& a, const pt& b, const pt& c, const pt& d) { + if (c.cross(a, d) == 0 && c.cross(b, d) == 0) + return inter1(a.x, b.x, c.x, d.x) && inter1(a.y, b.y, c.y, d.y); + return sgn(a.cross(b, c)) != sgn(a.cross(b, d)) && + sgn(c.cross(d, a)) != sgn(c.cross(d, b)); +} +``` \ No newline at end of file diff --git a/思路/思路/板子.md b/思路/思路/板子.md new file mode 100644 index 0000000..a65b0e6 --- /dev/null +++ b/思路/思路/板子.md @@ -0,0 +1,1266 @@ +#### 快速幂: +``` +#include +#include +#include + +int ksm(int a, int x) { + int ans = 1; + while (x) { + if (x & 1) + ans = ans * a % n; + a = a * a % n; + x >>= 1; + } + return ans; +} +``` +#### 欧拉筛: +``` +#include +using namespace std; +vectorprime(1000000); +vectorvis(10000001); +int k1=0; +int main() { + vectorprime(); + vectorvis(); + int k1=0; + auto primeadd = [&](int small, int big) { + + int i, j; + if (small == 1)small = 2; + for (i = small; i <= big; i++) { + if (vis[i] == 0)prime[k1++] = i; + for (j = 0; j < k1; j++) { + if (i * prime[j] > big)break; + vis[i * prime[j]] = 1; + if (i % prime[j] == 0)break; + } + } + }; + primeadd(1,2); +} +``` +#### 高精度加法(高精度加高精度,处理负数) +``` +#include +using namespace std; +// 可以处理负数 +char a[1000005],b[1000005]; +int fa,fb,la,lb; +void show(int ed) { + if (fa) cout << "-"; + for (int i = ed;i >= fa;--i) + printf("%d",a[i]); +} +void add(){ + int i,j,t = 0,s,l; + for (i = fa;i < la || i < lb;++i) { + s = a[i] + b[i] + t; + t = s / 10; + a[i] = s % 10; + } + a[i] = t; + l = t ? i : i - 1; + show(l); +} +int cmp(){ + int la = strlen(a),lb = strlen(b); + if (la - fa > lb - fb) return 1; + else if (la - fa < lb - fb) return 0; + else{ + int i; + for (i = 0;i < la && a[i + fa] == b[i + fb];++i); + return a[i + fa] > b[i + fb]; + } +} +void minu(){ + int i,j,c = 0,l = -1,s; + for (i = 0;i + fa < la;i++) { + s = a[i + fa] - b[i + fb] - c >= 0 ? 0 : 1; + a[i + fa] = (10 + a[i + fa] - b[i + fb] - c) % 10; + l = a[i + fa] ? i + fa : l,c = s; + } + if (l < 0) cout << 0; + else show(l); +} + +// 应用部分 +int main(){ + scanf("%s%s",a,b); + fa = ('-' == a[0]), fb = ('-' == b[0]); + if (!cmp()) swap(a, b),swap(fa, fb); + la = strlen(a), lb = strlen(b); + reverse(a + fa, a + la),reverse(b + fb, b + lb); + int i = fa,j = fb; + while (i < la) a[i] -= '0',i++; + while (j < lb) b[j] -= '0',j++; + if (fa ^ fb) minu(); + else add(); + return 0; +} +``` +#### 高精度减法(高精度减高精度) + +##### 普通版 +``` +#include +using namespace std; +// 函数名称:cmp +// 函数参数:两个vector +// 函数返回值:true或false +// 函数功能:返回输入的第一个vector是否大于第二个vector +// 函数备注:请与减法sub1配合使用 +// 中文名称:高精度大小判断 +bool cmp(vector &A,vector &B){ + if (A.size() != B.size()) return A.size() > B.size(); + for (int i = A.size() - 1;i >= 0;i++){ + if (A[i] != B[i]) return A[i] > B[i]; + } + return true; +} +// 函数名称:sub +// 函数参数:两个vector +// 函数返回值:一个vector +// 函数功能:返回输入的两个vector的差 +// 函数备注:请与判断大小cmp配合使用 +// 中文名称:高精度减法 +vector sub(vector &A,vector &B){ + vector C; + int t = 0; + for(int i = 0; i < A.size(); i++){ + t = A[i] - t; + if(i < B.size()) t -= B[i]; + C.push_back((t + 10) % 10); // t+10是为了避免t<0 + if(t < 0) t = 1; // 借位 + else t = 0; // 不借位 + } + while(C.size() > 1 && C.back() == 0) C.pop_back(); //去掉前导0 + return C; +} + +// 应用部分 +vector A,B,C; // 请不要将这个定义放在函数上面 +string CA,CB;// 因为A、B过长,所以需要使用字符串读入 +int main(){ + cin >> CA >> CB; + // 别忘了是逆序读入 + for (int i = CA.size() - 1;i >= 0;i--) A.push_back(CA[i] - '0'); + for (int i = CB.size() - 1;i >= 0;i--) B.push_back(CB[i] - '0'); + if (cmp(A,B)){ + C = sub(A,B); + for (int i = C.size() - 1;i >= 0;i--) cout << C[i]; + }else{ + C = sub(B,A); + cout << "-"; + for (int i = C.size() - 1;i >= 0;i--) cout << C[i]; + } + cout << endl; + return 0; +} +``` +##### 能处理负数版 + +``` +#include +using namespace std; +string a,b,s,t; +int fa,fb; +void init(){ + fa = (a[0] == '-'), fb = (b[0] == '-'); + s = a.substr( 1, a.size() ), t = b.substr( 1, b.size() ); +} +bool cmp(string a,string b){ + int as = a.size(), bs = b.size(); + if (as > bs || as == bs && a > b) return 1; + else return 0; +} +void change(string &s,string &t,string a,string b) { + int as = a.size(), bs = b.size(),d = as > bs ? as - bs : bs - as; + for (int i = 0;i < d;i++) as > bs ? t += "0" : s += "0"; + s += a,t += b; +} +string cA(string a,string b){ + string s = "0", t = "0"; + change(s,t,a,b); + int len = s.size(); + for (int i = len - 1;i >= 1;i--){ + s[i] += t[i] - '0'; + if (s[i] > '9') s[i] -= 10,s[i - 1]++; + } + bool j = 1; + for ( int i = 0;i < len;i++) + if (s[i] != '0') j = 0; + if (j) return "0"; + return s[0] == '0' ? s.substr( 1, len ) : s; +} +string cB(string a,string b){ + string s = "", t = ""; + change(s,t,a,b); + if (s < t) swap(s,t); + int len = s.size(); + for (int i = len - 1;i >= 0;i--){ + if (s[i] < t[i]){ + s[i] += 10; + if (s[i - 1] >= '1') s[i - 1]--; + else{ + int j = i - 1; + while (s[j] == '0') s[j--] += 9; + s[j]--; + } + } + s[i] -= (t[i] - '0'); + } + if (len == 1) return s; + return s[0] == '0' ? cA(s.substr(1,len),"0") : s; +} + +// 应用部分 +int main() { + cin >> a >> b; + init(); + if (fa && fb){ + if (cmp(s, t)) cout << "-"; + cout << cB(s,t) << endl; + }else if (!fa && !fb){ + if (!cmp(a, b) ) cout << "-"; + cout << cB(a,b) << endl; + }else if (fa) cout << "-" << cA(s,b) << endl; + else cout << cA(a,t) << endl; + return 0; +} +``` +#### 高精度乘法: +``` +#include +#include +int main(){ + char a1[2005],b1[2005]; + int a[2005],b[2005],c[10000],lena,lenb,lenc,i,j,x; + memset(a,0,sizeof a); + memset(b,0,sizeof b); + memset(c,0,sizeof c); + //scanf("%[^\n]%*c%[^\n]%*c",&a1,&b1); +scanf("%s%s",&a1,&b1); + lena=strlen(a1); + lenb=strlen(b1); + for(i=0;i<=lena-1;i++)a[lena-i]=a1[i]-48;//倒序写入a +for(i=0;i<=lenb-1;i++)b[lenb-i]=b1[i]-48;//倒序写入b +for(i=1;i<=lena;i++) + { + x=0; //用于存放进位 +for(j=1;j<=lenb;j++) //对乘数的每一位进行处理 +{ + c[i+j-1]=c[i+j-1]+a[i]*b[j]+x; //原数加上当前乘积加上上次乘积进位 + x=c[i+j-1]/10; + c[i+j-1]%=10; + } + c[i+lenb]=x; //进位 +} + lenc=lena+lenb; + while(c[lenc]==0&&lenc>1) //删除前导0 +lenc--; + for(i=lenc;i>=1;i--) + printf("%d",c[i]); + printf("\n"); +} +``` +##### 能处理负数版 + +``` +#include +using namespace std; +// 可以处理负数版 +const int T = 1000000; +char a1[T],b1[T]; +int a[T],b[T],c[T],lena,lenb,lenc,x,t,f; +void mul() { + for (int i = 1;i <= lena;i++) { + x = 0; //x是进位 + for (int j = 1;j <= lenb;j++) { + c[i + j - 1] += a[i] * b[j] + x; + x = c[i + j - 1] / 10; + c[i + j - 1] %= 10; + } + c[i + lenb] = x; + } + lenc = lena + lenb; + while (c[lenc] == 0 && lenc > 1) lenc--; + if (f == -1) cout << "-"; + for (int i = lenc;i >= 1;i--) cout << c[i]; + cout << endl; +} + +// 应用部分 +int main() { + cin >> a1 >> b1 ; + lena = strlen(a1), lenb = strlen(b1); + f = 1, t = 0; + if (a1[0] == '-') f *= -1, t++; + for (int i = t;i <= lena - 1;i++) a[lena - i] = a1[i] - '0'; // 转换为int + t = 0; + if (b1[0] == '-') f *= -1,t++; + for (int i = t;i <= lenb - 1;i++) b[lenb - i] = b1[i] - '0'; + mul(); + return 0; +} +``` +#### 高精度除法 +##### 普通版(带余数) +``` +#include +using namespace std; +// 减法部分 +int a[101],b[101],c[101],d,i; +void inp(int a[]){ // 读入 + string s; + cin >> s; //读入字符串 + a[0] = s.size(); //a[0]储存字符串的长度 + for (i = 1;i <= a[0];i++) a[i] = s[a[0] - i] - '0'; +} +void pri(int a[]){ // 输出 + if (a[0] == 0){ + cout << "0" << endl; + return; + } + for (i = a[0];i > 0;i--) cout << a[i]; + cout << endl; + return; +} +int cmp(int a[],int b[]){//比较a和b的大小关系,若a>b则为1,若a b[0]) return 1; //若a的位数大于b,则a>b + if (a[0] < b[0]) return -1; //若a的位数小于b,则a 0;i--){ + if (a[i] > b[i]) return 1; + if (a[i] < b[i]) return -1; + } + return 0; +} +void jian(int a[],int b[]){ + int pd = cmp(a,b); // 比较大小 + if (pd == 0){ // 相等 + a[0] = 0; + return; + }else if (pd == 1){ + for (i = 1;i <= a[0];i++){ + if (a[i] < b[i]) a[i + 1]--,a[i] += 10; // 借位 + if (a[i] >= b[i]) a[i] -= b[i]; + } + while((a[a[0]] == 0) && (a[0] > 0)) a[0]--; + return; + } +} +void numcpy(int p[],int q[],int det){ + for (i = 1;i <= p[0];i++) q[i + det - 1] = p[i]; + q[0] = p[0] + det - 1; +} +void chugao(int a[],int b[],int c[]){ + int i,tmp[101]; + c[0] = a[0] - b[0] + 1; + for (i = c[0];i > 0;i--){ + memset(tmp,0,sizeof(tmp)); + numcpy(b,tmp,i); + while (cmp(a,tmp) >= 0){ + c[i]++; + jian(a,tmp); + } + } + while((c[c[0]] == 0) && (c[0] > 0)) c[0]--; +} + +// 应用部分 +int main(){ + inp(a),inp(b); + chugao(a,b,c); + pri(c),pri(a); + return 0; +} +``` +##### 能处理负数版(不带余数,见取模) +``` +#include +using namespace std; +// 此版本无法输出余数,求余数见高精度取模 +string fixedNum(string a) { + if (a.size() == 1) return a; + for (int i = 0;i < a.size();i++){ + if ('1' <= a[i] && a[i] <= '9') return a.substr( i, a.size() ); + } + return "0"; +} +string cA(string a,string b) { + a = fixedNum(a),b = fixedNum(b); + int as = a.size(), bs = b.size(), d = as > bs ? as - bs : bs - as; + string s = "0", t = "0"; + for (int i = 0;i < d;i++) as > bs ? t += "0" : s += "0"; + s += a,t += b; + for (int i = s.size() - 1;i >= 1;i--){ + s[i] += t[i] - '0'; + if (s[i] > '9') s[i] -= 10,s[i - 1]++; + } + return s[0] == '0' ? s.substr( 1, s.size() ) : s; +} +string cS(string a, string b){ + int as = a.size(), bs = b.size(), d = as - bs; + string s = "", t = ""; + for (int i = 0;i < d;i++) t += "0"; + s += a,t += b; + for (int i = s.size() - 1;i >= 0;i--) { + if (s[i] < t[i]) { + s[i] += 10; + if (s[i - 1] >= '1') s[i - 1]--; + else { + int j = i - 1; + while (s[j] == '0') s[j--] += 9; + s[j]--; + } + } + s[i] -= (t[i] - '0'); + } + if (s.size() == 1) return s; + for (int i = 0;i < s.size();i++){ + if ('1' <= s[i] && s[i] <= '9') return s.substr(i,s.size()); + } + return "0"; +} + +// 应用部分 +int main() { + string a, b, c, sum = "0", cnt = "1"; + bool j1 = 0; + cin >> a >> b; + if (a == "0"){ + cout << 0 << endl; + return 0; + }else if (a[0] == '-' && b[0] == '-') a = a.substr(1,a.size()),b = b.substr(1,b.size()); + else if (a[0] == '-') j1 = 1,a = a.substr(1, a.size()); + else if (b[0] == '-') j1 = 1,b = b.substr(1, b.size()); + c = b; + int as = a.size(),bs = b.size(), cs, d = as - bs; + for (int i = 0;i < d - 1;i++) c += "0",cnt += "0"; + cs = c.size(); + bool j2 = 0; + while (c != b) { + while (as > cs || as == cs && a >= c) j2 = 1,a = cS(a,c),as = a.size(),sum = cA(sum,cnt); + c = c.substr(0,c.size() - 1),cnt = cnt.substr(0,cnt.size() - 1),cs = c.size(); + } + while (as > bs || as == bs && a >= b) j2 = 1,a = cS(a,b),sum = cA(sum,cnt),as = a.size(); + if (j1 && j2) cout << '-'; + cout << sum << endl; + return 0; +} +``` +#### 高精度取模(高精度取模高精度) +##### 能处理负数版 +``` +#include +using namespace std; +// 可以处理负数版 +string cA(string a,string b){ + int as = a.size(), bs = b.size(), d = as > bs ? as - bs : bs - as; + string s = "0", t = "0"; + for (int i = 0;i < d;i++) as > bs ? t += "0" : s += "0"; + s += a,t += b; + for ( int i = s.size() - 1; i >= 1; i-- ) { + s[i] += t[i] - '0'; + if (s[i] > '9') s[i] -= 10,s[i - 1]++; + } + bool j = true; + for (int i = 0;i < s.size();i++) + if (s[i] != '0') j = false; + if (j) return "0"; + return s[0] == '0' ? s.substr( 1, s.size() ) : s; +} +string cS(string a,string b){ + int as = a.size(), bs = b.size(), d = as - bs; + string s = "", t = ""; + for (int i = 0;i < d;i++) t += "0"; + s += a,t += b; + for (int i = s.size() - 1;i >= 0;i--){ + if (s[i] < t[i]){ + s[i] += 10; + if (s[i - 1] >= '1') s[i - 1]--; + else{ + int j = i - 1; + while (s[j] == '0') s[j--] += 9; + s[j]--; + } + } + s[i] -= (t[i] - '0'); + } + if (s.size() == 1) return s; + for ( int i = 0; i < s.size(); i++ ) { + if ('1' <= s[i] && s[i] <= '9') return s.substr(i,s.size()); + } + return "0"; +} + +// 应用部分 +int main() { + string a, b, c; + cin >> a >> b; + c = b; + int as = a.size(), bs = b.size(),cs,d = as - bs; + for (int i = 0;i < d - 1;i++) c += "0"; + cs = c.size(); + while ( c != b ) { + while (as > cs || as == cs && a >= c) a = cS(a,c),as = a.size(); + c = c.substr(0,c.size() - 1),cs = c.size(); + } + while (as > bs || as == bs && a >= b) a = cS(a,b),as = a.size(); + cout << a << endl; + return 0; +} +``` +### 高精度op低精度 +#### 高精度加低精度 +``` +#include +using namespace std; +// 函数名称:add +// 函数参数:一个vector和一个int变量 +// 函数返回值:一个vector +// 函数功能:返回输入的一个vector和一个int的和 +// 中文名称:高精度加低精度 +vector add(vector &A, int b){ + vector C; + int t = A.size(); + A[0] += b; + for(int i = 0;i < t - 1; i ++){ + C.push_back(A[i] % 10); + A[i + 1] += A[i] / 10; + } + if (A[t - 1] > 0){ + C.push_back(A[t - 1] % 10); + A[t - 1] /= 10; + } + return C; +} + +// 应用部分 +vector A,C; +string CA; +int b; +int main(){ + cin >> CA >> b; + for (int i = CA.size() - 1;i >= 0;i--) A.push_back(CA[i] - '0'); + C = add(A,b); + for (int i = C.size() - 1;i >= 0;i--) cout << C[i]; + cout << endl; + return 0; +} +``` +#### 高精度减低精度 +``` +#include +using namespace std; +// 函数名称:sub +// 函数参数:一个vector和一个int变量 +// 函数返回值:一个vector +// 函数功能:返回输入的一个vector和一个int的差 +// 中文名称:高精度减低精度 +vector sub(vector A, int b){ + int t = A.size(); + A[0] -= b; + for (int i = 0;i < t - 1; i ++){ + if (A[i] < 0){ + int x = (( -1 * A[i] ) / 10 + 1); + A[i] += x * 10; + A[i + 1] -= x; + } + } + while (A.size() > 1 && A.back() == 0) A.pop_back(); + return A; +} + +// 应用部分 +vector A,C; +string CA; +int b; +int main(){ + cin >> CA >> b; + for (int i = CA.size() - 1;i >= 0;i--) A.push_back(CA[i] - '0'); + C = sub(A,b); + for (int i = C.size() - 1;i >= 0;i--) cout << C[i]; + cout << endl; + return 0; +} +``` +#### 高精度乘低精度 +``` +#include +using namespace std; +// 函数名称:mul2 +// 函数参数:一个vector和一个int变量 +// 函数返回值:一个vector +// 函数功能:返回输入的一个vector和一个int的积 +// 中文名称:高精度乘低精度 +vector mul(vector & A, int b) { + vector C; + int t = 0; + for (int i = 0; i < A.size(); i ++) { + t += A[i] * b; + C.push_back(t % 10); + t /= 10; + } + while (t){ + C.push_back(t % 10); + t /= 10; + } + while (C.size() > 1 && C.back() == 0) C.pop_back(); + return C; +} + +// 应用部分 +vector C,A; +string a; +int b; +int main() { + cin >> a >> b; + for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0'); + C = mul(A,b); + for (int i = C.size() - 1; i >= 0; i --) cout << C[i]; + return 0; +} +``` +#### 高精度除低精度 +``` +#include +using namespace std; +// 函数名称:mul2 +// 函数参数:一个vector和一个int变量 +// 函数返回值:一个vector +// 函数功能:返回输入的一个vector和一个int的积 +// 中文名称:高精度乘低精度 +vector mul(vector &A,int b,int &r) { + vector C; + r = 0; + for (int i = A.size() - 1;i >= 0;i--){ + r = r * 10 + A[i]; + C.push_back(r / b); + r %= b; + } + reverse(C.begin(),C.end()); + while(C.size() > 1 && C.back() == 0) C.pop_back(); //去掉前导0 + return C; +} + +// 应用部分 +vector C,A; +string a; +int b,r; // 不要漏了r,r是余数 +int main() { + cin >> a >> b; + for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0'); + C = mul(A,b,r); + for (int i = C.size() - 1; i >= 0; i --) cout << C[i]; + cout << endl << r << endl; + return 0; +} +``` +#### 高精度取模低精度 +``` +#include +using namespace std; +// 高精度取模低精度 +int mod(string a,int b){ + int d = 0; + for(int i = 0;i < a.size();i++) d = (d * 10 + (a[i] - '0')) % b; //求出余数 + return d; +} + +// 应用部分 +string a; +int b; +int main(){ + cin >> a >> b; + cout << mod(a,b); + return 0; +} +``` +#### 高精度开根低精度 +``` +#include +#define Ll unsigned long long +// 感谢洛谷的dalao +using namespace std; +const Ll NN = 1e9; +const int N = 9; +struct H{ + Ll a[1500],len; + H(){ + memset(a,0,sizeof a); + len = 1; + } +}; +int n; +H s; +void init(H &a){//读入 + string s; + cin >> s; + int l; + a.len = 0; + for(int r = s.size() - 1;r >= 0;r -= N){ + a.len++; + if(r >= N - 1) l = r - N + 1; + else l = 0; + for(int i = l;i <= r;i++) a.a[a.len] = a.a[a.len] * 10 + s[i] - '0'; + } +} +void outit(H a){//输出 + cout << a.a[a.len]; + for(int i = a.len - 1;i;i--){ + for(int k = NN / 10;a.a[i] < k;k /= 10) cout << 0; + if(a.a[i]) cout << a.a[i]; + } + cout << endl; +} +void in(H &a,int x){ + if(!x)return; + a.len = 0; + while(x) a.a[++a.len] = x % NN,x /= NN; +} +bool bigD(H a,H b){ // 比较 + if(a.len > b.len) return 1; + if(a.len < b.len) return 0; + for(int i = a.len;i;i--){ + if(a.a[i] != b.a[i]){ + if(a.a[i] > b.a[i]) return 1; + else return 0; + } + } + return 1; +} +H jia(H a,H b){ + H c; + int l = max(a.len,b.len); + for(int i = 1;i <= l;i++){ + c.a[i] += a.a[i] + b.a[i]; + c.a[i+1] = c.a[i] / NN; + c.a[i] %= NN; + } + if(c.a[l + 1]) l++; + c.len = l; + return c; +} +H chu(H a){ + H c; + if(a.len == 1){ + c.a[1] = a.a[1] >> 1; + return c; + } + for(int i = a.len;i;i--){ + if(a.a[i] & 1ll)a.a[i-1] += NN; + c.a[i] = a.a[i] >> 1; + } + if(c.a[a.len]) c.len = a.len; + else c.len = a.len - 1; + return c; +} +H rrr(H a){ + if(a.len == 1) a.a[1]--;return a; + H c = a; + c.a[1]--; + int l = 1; + while(c.a[l] < 0) c.a[l] = NN - 1,c.a[++l]--; + if(!c.a[c.len]) c.len--; + return c; +} +H chen(H a,H b){ + H z; + z.len = a.len + b.len + 2; + for(int i = 1;i <= a.len;i++){ + for(int j = 1;j <= b.len;j++) z.a[i + j - 1] += (a.a[i] * b.a[j]); + } + for(int i = 1;i <= z.len;i++) z.a[i + 1] += z.a[i] / NN,z.a[i] %= NN; + while(z.len > 1 && !z.a[z.len]) z.len--; + return z; +} +H ksm(H a,int n){ + if(n == 1) return a; + H c = ksm(a,n >> 1); + c = chen(c,c); + if(n & 1) c = chen(c,a); + return c; +} +bool Chu(H a){ + if(a.len * n - n + 1 > s.len) return 0; + if(bigD(s,ksm(a,n))) return 1; + return 0; +} + +// 应用部分 +int main(){ + cin >> n; + init(s); + if(n == 1){ + outit(s); + return 0; + } + H l,r,mid,ans; + in(l,1); + r = s; + while(bigD(r,l)){ + mid = jia(l,r); + mid = chu(mid); + if(Chu(mid)){ + if(bigD(mid,ans)) ans = mid; + H c; + in(c,1); + l = jia(mid,c); + }else{ + r = rrr(mid); + } + } + outit(ans); + return 0; +} +``` +### 高精度浮点数 +``` +#include +using namespace std; +// 高精浮点数 +const int SIZE=264000; +complex e[SIZE],A[SIZE],w1[SIZE],w2[SIZE]; +void DFT(complex *A, complex *w, int l, int r, int dt){ + int N = r - l; // 全检长度 + if (N == 1){ + w[l] = A[l]; + return; + } + int N1 = N >> 1,mid = (l + r) >> 1,pos1 = l,pos2 = mid; + for (int i = 0; i < N; i++){ + if (i & 1) w[pos2] = A[i + l],pos2++; + else w[pos1] = A[i + l],pos1++; + } + DFT(w,A,l,mid,dt << 1),DFT(w,A,mid,r,dt << 1); + for (int i = 0;i < N1;i++) w[l + i] = A[l + i] + e[i*dt] * A[i + mid],w[i + mid] = A[l + i] - e[i*dt] * A[i + mid]; +} +struct Wfloat{ + const static int size = SIZE; + int *a,length,sign,pos; + Wfloat(){ + a = (int*)malloc(sizeof(int)* size); + a[0] = 0,length = 1,sign = 0,pos = 0; + } + Wfloat(const Wfloat &ans){ + a = (int*)malloc(sizeof(int)* size); + length = ans.length,sign = ans.sign,pos = ans.pos; + for (int i = 0;i < length;i++) a[i] = ans.a[i]; + } + Wfloat(char *word){ + a = (int*)malloc(sizeof(int)* size); + int wordlength = strlen(word); + pos = 0,length = 0,sign = 0; + for (int i = wordlength - 1; i >= 0; i--){ + char c = word[i]; + if (c == '.') pos = length + 1; + else if (c == '-') sign = 1; + else a[length] = c - '0',length++; + } + } + Wfloat operator = (const Wfloat &ans){ + length = ans.length,sign = ans.sign,pos = ans.pos; + for (int i = 0; i < length; i++) a[i] = ans.a[i]; + return *this; + } + Wfloat operator =(char *word){ // 无小数点 + int wordlength = strlen(word); + pos = 0,length = 0,sign = 0; + for (int i = wordlength - 1; i >= 0; i--){ + char c = word[i]; + if (c == '.') pos = length + 1; + else if (c == '-') sign = 1; + else a[length] = c - '0',length++; + } + return *this; + } + ~Wfloat(){free(a);} +}; +void Print(const Wfloat &ans){ + if (ans.sign == 1) cout << "-"; + if (ans.pos >= ans.length){ + cout << "0."; + for (int i = 0;i < ans.pos - ans.length;i++) cout << "0"; + for (int i = ans.length - 1;i >= 0;i--) cout << ans.a[i]; + }else{ + for (int i = ans.length - 1;i >= ans.pos;i--) cout << ans.a[i]; + if (ans.pos != 0){ + cout << "."; + for (int i = ans.pos - 1;i >= 0;i--) cout << ans.a[i]; + } + } + cout << endl; +} +Wfloat operator * (const Wfloat &number1, int number2){ + Wfloat ans = number1; + if (number2 < 0) ans.sign = -number1.sign,number2 = -number2; + for (int i = 0;i < ans.length;i++) ans.a[i] *= number2; + for (int i = 0;i < ans.length;i++){ + if (ans.a[i] >= 10){ + if (i == ans.length - 1) ans.length++,ans.a[i + 1] = 0; + ans.a[i + 1] += ans.a[i] / 10.ans.a[i] %= 10; + } + } + return ans; +} +Wfloat operator / (const Wfloat &number1, int number2){ + Wfloat answer; + int lastnumber = 0,length = -1; + for (int i = number1.length - 1;i >= 0;i--){ + lastnumber *= 10,lastnumber += number1.a[i],answer.a[i] = lastnumber / number2,lastnumber -= answer.a[i] * number2; + if (length == -1 && answer.a[i] != 0) length = i + 1; + } + answer.length = length,answer.pos = number1.pos,answer.sign = number1.sign; + return answer; +} +Wfloat Multiplication(const Wfloat &number1, const Wfloat &number2, int eps){ + Wfloat ans; + double pi = 3.1415926535897932384626; + int length1 = min(eps, number1.length),length2 = min(eps, number2.length); + if (length1 > 1000 && length2 > 1000){ + int tempLength = max(length1 / 3, length2 / 3),N = 1; + while (N < tempLength) N <<= 1; + N <<= 1; + for (int i = 0; i < N; i++) e[i] = complex(cos(2 * pi * i / N), sin(2 * pi * i / N)); + int lastPos; + for (int i = 0; i < length1; i++){ + lastPos = i / 3; + if (i % 3 == 0) A[lastPos] = complex(number1.a[number1.length - length1 + i], 0); + else if (i % 3 == 1) A[lastPos] += complex(number1.a[number1.length - length1 + i] * 10.0, 0); + else if (i % 3 == 2) A[lastPos] += complex(number1.a[number1.length - length1 + i] * 100.0, 0); + } + for (int i = lastPos + 1; i < N; i++) A[i] = complex(0, 0); + DFT(A, w1, 0, N, 1); + for (int i = 0; i < length2; i++){ + lastPos = i / 3; + if (i % 3 == 0) A[lastPos] = complex(number2.a[number2.length - length2 + i], 0); + else if (i % 3 == 1) A[lastPos] += complex(number2.a[number2.length - length2 + i] * 10.0, 0); + else if (i % 3 == 2) A[lastPos] += complex(number2.a[number2.length - length2 + i] * 100.0, 0); + } + for (int i = lastPos + 1; i < N; i++) A[i] = complex(0, 0); + DFT(A, w2, 0, N, 1); + for (int i = 0;i < N;i++) w2[i] *= w1[i]; + for (int i = 0;i < N;i++) e[i] = complex(cos(-2 * pi * i / N), sin(-2 * pi * i / N)); + DFT(w2,w1,0,N,1); + long long temp = 0,temp1 = 0; + for (int i = 0;i < N;i++){ + temp += w1[i].real() / N + 0.001,temp1 = temp / 1000,temp %= 1000; + ans.a[i * 3] = temp % 10,ans.a[i * 3 + 1] = temp % 100 / 10,ans.a[i * 3 + 2] = temp / 100; + temp = temp1; + if (ans.a[i * 3 + 2] != 0) ans.length = i * 3 + 3; + else if (ans.a[i * 3 + 1] != 0) ans.length = i * 3 + 2; + else if (ans.a[i * 3] != 0) ans.length = i * 3 + 1; + } + ans.pos = number1.pos + number2.pos - (number1.length - length1 + number2.length - length2),ans.sign = number1.sign^number2.sign; + return ans; + }else{ + int length3 = length1 + length2 + 4; + for (int i = 0;i < length3;i++) ans.a[i] = 0; + ans.length = 0; + for (int i = 0;i < length1;i++){ + int number = number1.a[number1.length - length1 + i]; + for (int j = 0; j < length2; j++) ans.a[i + j] += number2.a[number2.length - length2 + j] * number,ans.length = max(ans.length, i + j + 1); + } + for (int k = 0;k < ans.length;k++){ + if (ans.a[k] >= 10){ + if (k == ans.length - 1) ans.length++; + ans.a[k + 1] += ans.a[k] / 10,ans.a[k] %= 10; + } + } + ans.pos = number1.pos + number2.pos - (number1.length - length1 + number2.length - length2),ans.sign = number1.sign^number2.sign; + return ans; + } +} +Wfloat Multiplication(const Wfloat &number3, const Wfloat &number4){ + Wfloat number1 = number3,number2 = number4,ans; + int eps = max(number1.length, number2.length),length1 = number1.length,length2 = number2.length; + if (length1 > length2){ + int length3 = length1 - length2; + for (int i = 0; i < length3; i++) number2.a[number2.length] = 0,number2.length++; + }else if (length1 < length2){ + int length3 = length2 - length1; + for (int i = 0;i < length3;i++) number1.a[number1.length] = 0,number1.length++; + } + ans = Multiplication(number1, number2,eps); + int temp = ans.length - ans.pos; + for (int i = 0;i < temp;i++) ans.a[i] = ans.a[ans.pos + i]; + ans.length = temp,ans.pos = 0; + return ans; +} +Wfloat Subtraction(const Wfloat &number3, const Wfloat &number4, int eps){ + Wfloat number1 = number3,number2 = number4,ans; + int tempLength = eps,length1 = number1.pos - number1.length,length2 = number2.pos - number2.length; + if (length1 > length2){ + int length3 = length1 - length2; + for (int i = 0;i < length3;i++) number1.a[number1.length] = 0,number1.length++; + }else if (length1 < length2){ + int length3 = length2 - length1; + for (int i = 0;i < length3;i++) number2.a[number2.length] = 0,number2.length++; + } + int pos = 1; + for (int i = tempLength - 1; i >= 0; i--){ + int b1,b2; + if (number1.length - pos < 0) b1 = 0; + else b1 = number1.a[number1.length - pos]; + if (number2.length - pos < 0) b2 = 0; + else b2 = number2.a[number2.length - pos]; + ans.a[i] = b1 - b2; + pos++; + } + int length = 0; + for (int i = 0; i < tempLength; i++){ + if (ans.a[i] < 0) ans.a[i + 1]--,ans.a[i] += 10; + if (ans.a[i] != 0) length = i; + } + length++; + ans.length = length,ans.pos = number1.pos - number1.length + tempLength; + return ans; +} +Wfloat Subtraction(const Wfloat &number1, const Wfloat &number2){ + Wfloat ans; + int eps = max(number1.length, number2.length); + ans = Subtraction(number1, number2, eps); + int temp = ans.length - ans.pos; + for (int i = 0;i < temp;i++) ans.a[i] = ans.a[ans.pos + i]; + ans.length = temp,ans.pos = 0; + return ans; +} +Wfloat Reciprocal(const Wfloat &N, int eps1){ + Wfloat ans; + if (N.pos == 0){ // 整数 + Wfloat x0, x1; + int N1length = N.length; + int Effectbit = 16; + Effectbit = min(Effectbit, N.length); + int lastZero = N1length - Effectbit; + double num = 0; + for (int i = 1; i <= Effectbit; i++) num *= 10,num += N.a[N1length - i]; + x0.pos = lastZero; + num = pow(num, -1); + int tempNum,count1 = 0,flag = 0; + x0.length = 16; + int n1 = 15; + while (count1 < 16){ + num *= 10,tempNum = num; + if (tempNum != 0) num -= tempNum; + if (tempNum == 0 && flag == 0) x0.pos++; + else flag = 1,x0.a[n1] = tempNum,n1--,x0.pos++; + if (flag) count1++; + } + int lastbiteps = eps1; + int biteps = 32; + while (1){ + x1 = Multiplication(N, x0, biteps); + x1 = Multiplication(x1, x0, biteps); + x0 = Subtraction(x0 * 2, x1, biteps); + if (biteps > lastbiteps) break; + biteps *= 2; + } + ans = x0; + return ans; + } + return ans; +} +Wfloat Division(const Wfloat &number1, const Wfloat &number2, int eps){ + Wfloat ans; + + return ans; +} +Wfloat Division(const Wfloat &number1, const Wfloat &number2){ + Wfloat ans; + if (number1.length < number2.length) return ans; + int eps = number1.length - number2.length + 50; + ans = Reciprocal(number2, eps),ans = Multiplication(ans, number1, eps); + int temp = ans.length - ans.pos; + for (int i = 0; i < temp; i++) ans.a[i] = ans.a[ans.pos + i]; + ans.length = temp; + ans.pos = 0; + return ans; +} +Wfloat sqrt(Wfloat &N){ + Wfloat ans; + if (N.sign == 1) return ans; + if (N.pos == 0){ // 整数 + int eps = 50; + Wfloat x0, x1; + int N1length = N.length,Effectbit = 16; + Effectbit = min(Effectbit, N.length); + int lastZero = N1length - Effectbit; + double num = 0; + for (int i = 1; i <= Effectbit; i++) num *= 10,num += N.a[N1length - i]; + if (lastZero % 2 != 0) num *= 10,Effectbit++,lastZero--; + x0.pos = lastZero / 2; + num = pow(num, -0.5); + int tempNum,count1 = 0,flag = 0,n1 = 15; + x0.length = 16; + while (count1 < 16){ + num *= 10,tempNum = num; + if (tempNum != 0) num -= tempNum; + if (tempNum == 0 && flag == 0) x0.pos++; + else flag = 1,x0.a[n1] = tempNum,n1--,x0.pos++; + if (flag) count1++; + } + int lastbiteps = N.length / 2 + eps;//最终需要的精度 + int biteps = 32; + x0.a[1]--; + if (x0.a[1] < 0){ + for (int i = 1;; i++){ + if (x0.a[i] < 0) x0.a[i + 1]--,x0.a[i] += 10; + else break; + } + } + while (1){ + x1 = Multiplication(N, x0, biteps),x1 = Multiplication(x1, x0, biteps),x1.a[x1.pos] = 3,x1.length = x1.pos + 1; + for (int i = 0;i < x1.pos;i++) x1.a[i] = -x1.a[i]; + for (int i = 0;i < x1.pos;i++){ + if (x1.a[i] < 0) x1.a[i] += 10,x1.a[i + 1]--; + } + x1.length = x1.pos + 1,x1 = x1 / 2,x1 = Multiplication(x0, x1, biteps),x0 = x1; + if (biteps > lastbiteps) break; + biteps *= 2; + } + ans = Multiplication(x0, N, lastbiteps); + int temp = ans.length - ans.pos; + for (int i = 0;i < temp;i++) ans.a[i] = ans.a[ans.pos + i]; + ans.length = temp; + ans.pos = 0; + return ans; + } +} +double Reciprocal(double a){ + double x0 = 0.2,x1; + while (1){ + x1 = 2 * x0 - a * x0 * x0; + if (abs(x0 - x1) < 1e-15) break; + printf("%.16lf\n", x1); + getchar(); + swap(x0, x1); + } + return x1; +} + +// 应用部分 +char word[100100]; +int main(){ + Wfloat A, B; + scanf("%s", word); + A = word; + scanf("%s", word); + B = word; + Wfloat ans = Division(A, B); + Print(ans); + ans = Subtraction(A, Multiplication(ans, B)); + Print(ans); +} +``` +### 高精度低精度互转 +``` +#include +using namespace std; +// 对于这份代码的to_string函数,版本低的C++识别不出来 +vector int_to_vec(int in){ + string str = to_string(in); + vector res; + for (int i = str.size() - 1;i >= 0;i--) res.push_back(str[i] - '0'); + return res; +} +int vec_to_str(vector &A){ // 请确保int能装下 + string res; + for (int i = 0;i < A.size();i++) res += to_string(A[i]); + reverse(res.begin(),res.end()); + return stoi(res); +} +vector mul(vector &A, vector &B){ // 用乘法示范 + vector C(A.size() + B.size(), 0); + for (int i = 0; i < A.size(); i++) { + for (int j = 0;j < B.size();j++){ + C[i + j] += A[i] * B[j]; + if (C[i + j] >= 10){ + C[i + j + 1] += C[i + j] / 10; + C[i + j] %= 10; + } + } + } + while (C.size() > 1 && C.back() == 0) C.pop_back(); + return C; +} + +// 应用部分 +int CA,CB; +int main(){ + cin >> CA >> CB; + vector A = int_to_vec(CA); + vector B = int_to_vec(CB); + int result = vec_to_str(A) + vec_to_str(B); // 用加法当范例 + vector C = mul(A,B); // 用乘法测试 + cout << vec_to_str(A) << endl << vec_to_str(B) << endl; + for (int i = A.size() - 1;i >= 0;i--) cout << A[i]; + cout << endl; + for (int i = B.size() - 1;i >= 0;i--) cout << B[i]; + cout << endl; + for (int i = C.size() - 1;i >= 0;i--) cout << C[i]; + cout << endl; + cout << result << endl; + return 0; +} +``` +#### 01trie(自己写的版本) +``` +#include +#include +#include +#include +int ch[25*600005][2],idx; +using namespace std; +void insert(int &x){ + int p=0; + for(int i=8;i>=0;i--) { + int j=x >> i & 1; + if(!ch[p][j])ch[p][j]=++idx; + p=ch[p][j]; + } +} +int query(int x){ + int p=0,res=0; + for(int i=8;i>=0;i--) { + int j=x >> i & 1; + if(ch[p][!j]){ + res+= 1 << i; + p=ch[p][!j]; + } + else p=ch[p][j]; + } + return res; +} +void solve(){ + int n,res1; + cin>>n; + vector preres(n,0); + for(int i=0;i<=n-1;i++) { + if(i==0)cin>>res1; + else { + int x; + cin>>x; + res1 ^= x; + } + preres[i]=res1; + } + for_each(preres.begin(),preres.end(),insert); + int ans=0; + for(int i=0;i<=n-1;i++) { + ans=max(ans,query(preres[i])); + ans=max(ans,preres[i]); + } + cout<>t; + for(int i=1;i<=t;i++){ + memset(ch,0,sizeof ch);solve(); + } +} +``` diff --git a/思路/思路/类扫雷算法(有边界的多维数组).md b/思路/思路/类扫雷算法(有边界的多维数组).md new file mode 100644 index 0000000..b2af00f --- /dev/null +++ b/思路/思路/类扫雷算法(有边界的多维数组).md @@ -0,0 +1,5 @@ +当模型存在边界时可以将边界扩大使所有数据执行统一操作如 +![[Pasted image 20240722135718.png]] +可以在创建时扩大数组边界并使数据从(1,1)开始输入 +![[Pasted image 20240722135849.png]] +进而化简问题。 \ No newline at end of file diff --git a/思路/思路/需要学习的东西.md b/思路/思路/需要学习的东西.md new file mode 100644 index 0000000..f4c1b6b --- /dev/null +++ b/思路/思路/需要学习的东西.md @@ -0,0 +1,43 @@ +1.01tire +2.实现遍历区间的运算。 +代码: +``` +#include +#include +#include +using namespace std; + +auto f() +{ + using vec_t=vector; + vec_t vec; + std::move(vec); + // + return vec; +} +int main() +{ + + // 右值引用 + vector&& v=f(); + // auto f=f_impl; + + int x; + int& y=x ; + static_cast(x); + + //const auto& xx=1; + const auto xx_impl=1; + auto&& xx=xx_impl; "aaaaa"; + + int n; + cin>>n; + vector a(n); + for(int i=0;i>a[i]; + sort(a.begin(),a.end()); + for(auto&& x:a){ + cout<