摘要:题意:一个n*n的01矩阵,和几种动态操作,包括对子矩阵(x,y,xx,yy)的所有元素异或,查询某一点(x,y)的元素值。参见国家队 09年 武森《浅谈信息学竞赛中的“0”和“1”》代码:#include<iostream>#include<fstream>using namespace std;int b[1005][1005];int lowbit(int x){ return x&(-x);}int n;void add(int x,int y){ int i=y; while(x<=n) { y=i; while(y<=n) { b[x][
阅读全文
摘要:题意:一个n*n的矩阵,和几种动态操作,包括对某一点(x,y)值修改,查询子矩阵(x,y,xx,yy)的元素和。思路:二维树状数组,典型的动态操作题目。查询子矩阵(x,y,xx,yy)的元素和,注意一下就可以了: sum(xx, yy)-sum(x-1, yy)-sum(xx,y-1)+sum(x-1,y-1);代码:#include<iostream>#include<fstream>using namespace std;int b[1025][1025];int lowbit(int x){ return x&(-x);}int n;void add(in
阅读全文
摘要:题意:一棵具有n个节点的树,一开始,每个节点上都有一个苹果。现在给出m组动态的操作:(C,i)是摘掉第i个节点上面的苹果(若苹果不存在,则为加上一个苹果),(Q,i)是查询以第i个节点为根的子树有几个苹果(包括第i个节点)。思路:树状数组。这道题重点怎么建立树到树状数组的映射关系:利用dfs遍历树,对每个节点进行两次编号,第一次搜到第i个节点时的深度dep,为这个节点管辖区间的上限low[i](也为这个节点的下标),然后搜这个节点的子节点,最后搜回来后的深度dep,为这个节点管辖区间的下限high[i],如下图所示。接下来就是树状数组部分了。代码:#include<iostream>
阅读全文
摘要:题意:按y递增的顺序给出n颗星星的坐标(y相等则x递增),每个星星的等级,等于在它左边且在它下边(包括水平和垂直方向)的星星的数量,求出等级为0到n-1的星星分别有多少个。代码:#include<iostream>#include<fstream>using namespace std;int n,m;struct e{ int s,t;};e a[15001];int b[32020];int lowbit(int x){ return x&(-x);}void add(int s){ while(s<=m) { b[s]++; s+=lowbit(s)
阅读全文
摘要:题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值[S,E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj andEj <= Ei and Ei - Si > Ej -Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。代码:#include<iostream>#include<fstream>using namespace std;int n,m;struct e{ int id,s,w;};e a[100011];int cmp(const void *a,const void *b)
阅读全文
摘要:题意:日本东海岸有n个城市,西海岸有m个城市,现在要修建k条高铁连接东海岸的城市u和西海岸的城市v。问这k条高铁总共有多少个交点。代码:#include<iostream>#include<fstream>#include<vector>using namespace std;vector<long long> a[1001];long long n,m;long long b[1001];long long lowbit(long long x){ return x&(-x);}void add(long long s,long lon
阅读全文
摘要:逆序数。归并或树状数组代码:#include<iostream>#include<fstream>using namespace std;struct e{ int id; int w;};e a[500001];int n;int cmp(const void *a,const void *b){ return (*(e*)b).w-(*(e*)a).w;}int b[500001];int lowbit(int s){ return s&(-s);}void add(int s){ while(s<=n) { b[s]+=1; s+=lowbit(s)
阅读全文
摘要:第一道树状数组代码:#include<iostream>#include<fstream>using namespace std;int n;struct e{ int v,x;};e a[20001];long long cnt[20001],sum[20001];int lowbit(int x){ return x&(x^(x-1));}void modify(long long a[],int s,int t){ while(s<=20000) { a[s]+=t; s+=lowbit(s); }}long long getsum(long lon
阅读全文