![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acwing
我不是手机
这个作者很懒,什么都没留下…
展开
-
acwing 1230. K倍区间 前缀和+同余
题目链接 #include<bits/stdc++.h> using namespace std; const int N=100100; ; long long res=0,cnt[N],s[N]; int main(){ int n,k; cin>>n>>k; for(int i=1;i<=n;i++){ cin>>s[i]; s[i]+=s[i-1]; } cnt[0]=1;原创 2021-02-18 15:47:11 · 180 阅读 · 0 评论 -
acwing 1414. 牛异或 异或前缀和+trie树
题目链接 对于异或来说,组成前缀和数组时应该对上一位取异或值,在判断范围[i,j]时会与普通前缀和相同: 普通的前缀和sum=w[j]-w[i-1],但是异或区间的前缀和是sum=w[j]^w[i-1] 因为如果在数组中遍历两遍的端点,时间复杂度是on2的,所以需要使用01trie来维护。 对于每个点都insert到trie中创建当前的空间和记录当前的位置,每次插入一个就query一次寻找当前长度中最长的异或值,如果当前点有分支的话就走到不同分支,否则就走到相同分支 #include<bits/std原创 2021-02-17 17:19:42 · 151 阅读 · 0 评论 -
acwing 1102. 移动骑士 马走日bfs
题目链接 总共8个方向 #include<bits/stdc++.h> using namespace std; const int N=350; typedef pair<int, int> PII; PII a,b; int n,m,d; int dist[N][N]; int bfs(PII start,PII end){ if(start==end) return 0; queue<PII>qu; qu.push(start); m原创 2021-02-03 10:36:13 · 132 阅读 · 0 评论 -
acwing 1613. 数独简单版 DFS爆搜
题目连接 数独问题,需要在横、纵、每9个方格之中填1到9数字。我们可以构建一棵dfs树,对于每一个节点要求满足以上三总条件才可以更新这一个点,如果这个点可以走下去那么就深度搜索下去,并且更新当点的状态以此复原现场。 y总代码 #include<bits/stdc++.h> using namespace std; const int N=10; char g[N][N]; bool row[N][N],col[N][N],cell[3][3][N]; bool dfs(int x,int y)原创 2021-02-02 20:58:11 · 100 阅读 · 0 评论 -
acwing 1402. 星空之夜 哈希+连通块
题目链接 对于结构特别的连通块可以将它的每个点到其他点的距离之和作为hash值 并且在判断浮点数是否出现过时,应该比较fabs的差值 #include<bits/stdc++.h> #define lowbit(x) x&(-x) #define x first #define y second using namespace std; typedef pair<int,int>PII; const int N=110; const double eps=1e-6; int原创 2021-02-02 11:26:43 · 131 阅读 · 0 评论 -
acwing 243. 一个简单的整数问题2 树状数组 区间操作
题目链接 树状数组对于单点操作只需要开一个树状数组就可以了,但是对于区间的整体进行修改需要开两个树状数组,通过差分操作去维护,一个维护bi,一个维护bi×i #include <bits/stdc++.h> using namespace std; #define ll long long #define lowbit(x) x&(-x) const int N=2e5; ll c1[N],c2[N],n,m,a[N]; inline void add(ll x,ll v){ f原创 2021-01-29 14:08:03 · 115 阅读 · 0 评论 -
acwing 482. 合唱队形 最长上升子序列+最长下降子序列 寒假集训
题目链接 假设中间有一个数n,那么排队的最多人数就是它左边的最长上升子序列和它右边的最长下降子序列的和。我们把每个点上的点作为中间的点去做同样的操作,取两个值的和的最大值 #include<bits/stdc++.h> using namespace std; const int maxn=500; int a[maxn],dp[maxn],dp1[maxn]; int main(){ int n,id,mx; cin>>n; for(int i=1;i<原创 2021-01-27 20:51:22 · 89 阅读 · 0 评论