01 2014 档案
摘要:题意:给定三个操作添加删除查询大于a的的第k大值----树状数组的逆向操作给定a利用BIT查询有多少值比a小,这样比a大的k大值就应该有k+sum(a)个小于他的值因此可以二分枚举k大值看看是不是满足条件。这里有一点需要注意,就是二分出答案时当前答案的的数量一定大于1因为这个wa了一次详见代码:1#include2#include3#include4usingnamespacestd;5constintMAX=100000+10;6constintinf=0x3f3f3f3f;7intc[MAX],n,use[MAX];8intlowbit(intx)9{10returnx&(-x);
阅读全文
摘要:题意:给定一个矩阵有查询有添加操作。hit :很明显是二维树状数组(第一道二维fenwick哈) 横向纵向维护两个树状数组所以是二维,详见代码1//二维树状数组2#include3#include4#include5usingnamespacestd;6constintMAX=1024+10;7intc[MAX][MAX];8intn;9intlowbit(intx)10{11returnx&(-x);12}13voidadd(intx,inty,intd)14{15for(inti=x;i=1;i-=lowbit(i))27{28for(intj=y;j>=1;j-=lowbi
阅读全文
摘要:树状数组简单题(第一道树状数组哈)唯一有点意思的是这道题目需要离散化。详见代码题意: 求一组数的逆序数1//离散化+树状数组2#include3#include4#include5usingnamespacestd;6constintMAX=500000+10;7structnode8{9intval,pos;10}v[MAX];11intnum[MAX],n,c[MAX];12intcmp(nodea,nodeb)13{14returna.val0)32{33ans+=c[x];34x-=lowbit(x);35}36returnans;37}38intmain()39{40longlong
阅读全文
摘要:数论好题题目要求:求给定序列的素因子如果在给定区间内该数字个数加1;思路:打表时求出包含给素数因子的数的个数,详见代码1#include2#include3#include4usingnamespacestd;5constintMAX=10000000+10;6intvis[MAX],sum[MAX],num[MAX];7intmain()8{9inta,l,r,n,m;10scanf("%d",&n);11memset(vis,0,sizeof(vis));12memset(sum,0,sizeof(sum));13for(inti=0;i<n;i++)14
阅读全文
摘要:1intvis[MAX];2voidgetp(){3for(inti=2;i<maxn;++i){4if(vis[i]==0){5p[cnt++]=i;6for(intj=i;j<maxn;j+=i){7a[j][vis[j]++]=i;8}9}10}11}样题:Codeforces Round #226 (Div. 2)C题枚举质因子后二分素数的位置
阅读全文
摘要:题意:给定区间和判定那个说法是错误的带权并查集需要判环2//主要是权值压缩类似于LA3027。3//注意区间左或右端点要减14#include5#include6#include7usingnamespacestd;8constintMAX=200000+10;9intpa[MAX],d[MAX],ans;10intmake(intn)11{12for(inti=0;i0)41{42ans=0;make(n);43for(inti=0;i<m;i++)44{45scanf("%d%d%d",&a,&b,&w);46Union(a-1,b,w);
阅读全文
摘要:题意描述:有一个类似滚轮式的密码锁放在一排共n个,有m种操作每次操作一个区间,且此次操作后的所有密码相同,问最多能形成多少种密码解决:将区间分为可变部分和不可变部分,没当有可变部分时候总区间数要减去一。因为在可变 区间内第一个滚轮一定是固定的(可以转)并查集合并区间后做下快速幂就好了1//组合数学+快速幂+并查集2//统一区间内的组合数指数在原先基础上要减去13//证明可以枚举开始的字母因为是循环的所以第一个字母唯一4//注意边界重叠的情况,初始化要从0开始56#include7#include8#include9typedeflonglongll;10usingnamespacestd;11
阅读全文
摘要:题意:给定一个地图,和一个X计算包围给定X的最大的周长。1//用栈实现2//简单深搜,边界向四个方向搜索,其他的向8个方向搜索3//周围用‘*’代表省去边界判断4#include5#include6#include7#include8usingnamespacestd;9constintMAX=100;10structnode11{12intx,y;13}st;14charmap[MAX][MAX];15intvis[MAX][MAX];16intn,m,a,b,ans;17intdx[8]={-1,-1,-1,0,0,1,1,1};18intdy[8]={-1,0,1,-1,1,-1,0,1
阅读全文
摘要:简单的矩阵上的dp从左上角扫到右下角,dp[i][j][0] 代表在i,j处选A ,dp[i][j][1] 代表在i,j处选B.dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j][0])+suma[i][j]-suma[i][0];dp[i][j][1]=max(dp[i][j-1][1],dp[i][j-1][0])+sumb[i][j]-sumb[0][j];View Code
阅读全文
摘要://从上到下从左向右扫一遍即可,类似一维硬币拼凑1//二维0-1背包2//dp[i+k][j+p]+=dp[i][j];(计数dp)3//中等偏下题目4#include5#include6#include7#defineMAX10008#definemod100009usingnamespacestd;10intdp[MAX][MAX];11intmap[MAX][MAX];12intmain()13{14intcas,m,n;15scanf("%d",&cas);16while(cas--)17{18scanf("%d%d",&n,&a
阅读全文