ACM集训日记-8月23日
来源:互联网 发布:squid安装到linux 编辑:程序博客网 时间:2024/06/07 08:32
今天才知道原来树状数组的专题已经开了啊···很绝望,开始做题!一上来就先看到最后一题做的人很多,一看,原来是题解里做过的题,现在只能凭记忆和重新理解了,不过还好,关键的部分都还知道如何处理,就是求逆序数。然后做的B题点击打开链接,这道题读懂后,这就是排兵布阵的2维版本嘛,不过一开始我想用一位数组来解决这个问题,结果一直run time erro,我就是把每个点(x,y)以x*1000+y的形式放进了一个数组c[1001001],样例也过,就是死活不行
#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;const int MAXN=1005001;int c[MAXN];int lowbit(int x){ return x&(-x);}int sum(int x){ int res=0; while(x>1000) { res+=c[x]; x-=lowbit(x); } return res;}int add(int x,int v){ while(x<MAXN) { c[x]+=v; x+=lowbit(x); }}int main(){ int t,q,x1,x2,y1,y2,n1; scanf("%d",&t); for(int i=1;i<=t;i++) { //memset(c,1,sizeof(c)); for(int j=0;j<MAXN;j++) c[j]=1; //cout<<c[1001]<<endl; cout<<"Case "<<i<<":"<<endl; scanf("%d",&q); char s; while(q--) { scanf("%s",&s); if(s=='S') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1*1000+y1==x2*1000+y2)printf("%d\n",c[x2*1000+y2]); else if(x1*1000+y1<x2*1000+y2) printf("%d\n",sum(x2*1000+y2+1)-sum(x1*1000+y1-1)); else printf("%d\n",sum(x1*1000+y1+1)-sum(x2*1000+y2-1)); } else if(s=='A') { scanf("%d%d%d",&x1,&y1,&n1); add(x1*1000+y1,n1); } else if(s=='D') { scanf("%d%d%d",&x1,&y1,&n1); if(c[x1*1000+y1]<n1)add(x1*1000+y1,-c[x1*1000+y1]); else add(x1*1000+y1,-n1); } else if(s=='M') { scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,n1); if(c[x1*1000+y1]<n1) { add(x1*1000+y1,-c[x1*1000+y1]); add(x2*1000+y2,c[x1*1000+y1]); } else { add(x1*1000+y1,-n1); add(x2*1000+y2,n1); } } } } return 0;}然后就屈服了,换成了二维数组老老实实做,就要改一下sum 和add函数了
void add(int x,int y,int val) { int i=y; while(x<=n) { y=i; while(y<=n) { c[x][y]+=val; y+=lowbit(y); } x+=lowbit(x); } } int sum(int x,int y) { int i,sum=0; i=y; while(x) { y=i; while(y) { sum+=c[x][y]; y-=lowbit(y); } x-=lowbit(x); } return sum; }其他没什么亮点,就过了,不过我不服啊,为什么不能用一维解决呢?
明天加油!
阅读全文
0 0
- ACM集训日记-8月23日
- ACM集训日记-8月8日
- ACM集训日记-8月1日
- ACM集训日记-8月2日
- ACM集训日记-8月3日
- ACM集训日记-8月4日
- ACM集训日记-8月5日
- ACM集训日记-8月7日
- ACM集训日记-8月9日
- ACM集训日记-8月10日
- ACM集训日记-8月11日
- ACM集训日记-8月12日
- ACM集训日记-8月14日
- ACM集训日记-8月15日
- ACM集训日记-8月16日
- ACM集训日记-8月17日
- ACM集训日记-8月18日
- ACM集训日记-8月19日
- ACM第六次比赛题目及标准程序(动态规划)
- 查询线段树 Balanced Lineup POJ
- 三种简单排序用java实现(选择排序,冒泡排序,插入排序)
- hadoop 配置HA 重新格式化后 datanode 起不来
- hdu6146 递推
- ACM集训日记-8月23日
- Linux重点知识整理
- 链表中环的入口结点
- Python之print语句
- 频繁项集挖掘Apriori算法及其Python实现
- 设置图图图
- 图结构练习——最小生成树(prim算法)
- Dubbo入门学习--SPI实现@SPI和@Adaptive
- 2017年多校联训9 部分题解