
hoj
文章平均质量分 64
ehi11
这个作者很懒,什么都没留下…
展开
-
Number sequence 树状数组基础
/*这是一道比较基础的树状数组。注意c下标的最大范围。c的下标是Ai<32768,用memset比较保险。初始化为0,输入的数对应的数组位置++,记为出现的次数。然后计算元素a左端所有<a的元素的个数只需要求sum(a-1)即可。然后再反向扫描一次。只需要将对应位置的左右两边都比该元素小的个数相乘即可。*/#include #include #define maxn 50005i原创 2012-08-01 22:07:25 · 520 阅读 · 0 评论 -
hdu 敌兵布阵 线段树基础
/*第一道线段树...参考了not only success的代码风格,挺好的.这是一道单点更新的线段树.先修改叶子,然后递归修改祖先.也可用树状数组.*/#include #include #define maxn 50001#define lson l,mid,rt<<1//<<箭头指向的为移动的方向#define rson mid+1,r,rt<<1|1i原创 2012-08-02 19:09:13 · 660 阅读 · 0 评论 -
hdu I hate it 区间最大值 线段树
#include #define maxn 200001#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int MAX[maxn<<2];int n,m;int max(int a,int b){ if(a>b) return a; else return b;}void pushup(原创 2012-08-02 19:11:07 · 774 阅读 · 0 评论 -
hdu Just a Hook 线段树成段更新.cpp
#include #define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define maxn 111111int col[maxn<<2];int sum[maxn<<2];void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void push原创 2012-08-02 19:12:31 · 495 阅读 · 0 评论 -
求最大值的条件下的位置 hdu Billboard
//思路:以竖直高度为x轴,则x轴的宽度应该为1到min(h,n)//该步骤是动态的过程,开始时横坐标为1,慢慢变为2,3,4,最大值的更新//开始是1,2的父亲,然后是2,3的最大值,接着是3,4......#include #define maxn 200200#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1i原创 2012-08-02 19:13:21 · 474 阅读 · 0 评论 -
poj3468 A Simple Problem with Integers 线段树区间累加求和
#include #include using namespace std;#define LL long long#define maxn 111111#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1LL add[maxn<<2];//add记录的是子节点一致增量,并不是累加和.LL sum[maxn<<2];void p原创 2012-08-02 22:18:15 · 669 阅读 · 0 评论 -
Atlantis 线段树经典问题 矩形面积并
/*这个很多参考了NotOnlySuccess的思路。cnt用的记为精妙啊。将区间起始端点标记为1,末端点标记为-1.则进入一个矩形为1,离开一个矩形为-1,cnt不为0表示线段有重叠。先对纵坐标进行排序,在x轴上求相应区间的最大值,取根节点即可。*/#include #include #include #include #define maxn 2222#define lson原创 2012-08-03 23:22:37 · 815 阅读 · 0 评论 -
Mine Sweeper 水题
/*这道超水的扫雷题。题意不明,蛋疼了好久。就是碰到雷以后,不仅要把走过的位置标出来,还要把雷的所有位置都标出来。还要注意格式,在测试之间打空行。*/#include int dx[]={0,0,1,-1,1,1,-1,-1};int dy[]={1,-1,0,0,1,-1,1,-1};int main(){ char a[11][11]; char b[11][11]原创 2012-08-04 21:37:37 · 740 阅读 · 0 评论 -
Knockout Tournament 水题 hoj
/*先按二叉树的顺序进行存图。然后从上到下扫描输了几个人。在结果累计保存到儿子节点。再从下往上扫描赢了几个人。再把左右儿子的节点保存到父亲节点。*/#include #include #define maxn 100000int a[maxn];struct st{ int l,r;}s[maxn];int main(){ int n; int ca=原创 2012-08-05 06:55:21 · 1108 阅读 · 0 评论 -
Radar Installation 贪心 hoj
/*这道贪心挺不错的.首先预处理出每个点对应的雷达极限位置.然后就是区间覆盖的贪心揭发.先进行排序,.开始时以第一个点的右位置为标准,当某一个点的左边大于他的时候,更新标准,ans++.当某点的右位置小于他的时候,更新标准即可.*/#include #include #include #include struct point{ dou原创 2012-08-05 13:05:41 · 470 阅读 · 0 评论 -
水题 Border
/*开始模拟的时候按照我想法答案有错.调整几下方向直到和图形一样就AC了.这种题大概敲出来后不用对具体的步骤去计算,可对照图直接修改.还是有写了一小会.囧...*/#include #include char a[33][33];int main(){ int t,p,y; scanf("%d",&t); char b[1000];原创 2012-08-05 14:20:47 · 481 阅读 · 0 评论 -
Flow Layout 水 hoj
/*有是一道水题,不过还是没写好.主要是题意又看错了.不需要进行排序.直接按位置选每一行的最值.一个i--省去了很多功夫额.*/#include struct st{ int w,h;}a[100];int main(){ int n,w,h; while(scanf("%d",&n)==1&&n) {原创 2012-08-05 15:57:34 · 508 阅读 · 0 评论 -
Incomplete chess boards 有趣.
/*代码超短.思路很有意思.想象成一个国际象棋的棋盘,黑白相间且颜色个数相同.一张牌可以覆盖两个格子.所以只要两个格子是一黑一白就必定有解.此时满足条件如下.*/ #include int main(){ int n,i=1,x1,y1,x2,y2; scanf("%d",&n); while(n--) {原创 2012-08-05 16:26:15 · 525 阅读 · 0 评论 -
hoj Count on Canton
/*y一道纯数学题。判断奇偶即可。水~*/#include int main(){ int n,k; long long s; while(scanf("%d",&n)==1) { s=0; k=1; for(;;) { s+=k原创 2012-06-23 23:14:01 · 581 阅读 · 0 评论 -
Complicated Translation 栈的模拟 hoj
/*对于这道题我表示非常无语。对getchar的用法不熟。主要是读入字符的问题。然后将每个词入栈。再按顺序弹栈即可。学会用getchar处理单个字符和对行数的控制。*/#include #include using namespace std;int main(){ int n,top; char a[1100];原创 2012-06-16 23:40:09 · 447 阅读 · 0 评论 -
hoj Quantum Blasting DP
/*注意子问题的构造和提取。这道题从最开始的情况考虑。一直到两端。f[i][j]=max(f[i+1][j]+a[i]*(t-j+i),f[i][j-1]+a[j]*(t-j+i));注意(t-j+i)表示次数。循环注意顺序。目标是使子问题的解得以重复利用。dp要认真考虑他的子问题和状态转移。注意预处理和循环。*/#include #include原创 2012-06-14 22:33:55 · 358 阅读 · 0 评论 -
hoj Score Sequence DP
/*模型为最长公共子序列。对数据预处理的时候先排序,将重复的元素设为0.不影响后面的求和。*/#include #include #include #include #define max(a,b) (a>b?a:b)const int mm=30;int a[mm+1];int b[mm+1];int maxlen[mm+1][mm+1];i原创 2012-06-14 22:29:31 · 377 阅读 · 0 评论 -
hoj 整数划分问题 经典dp
#include #include #include using namespace std;int dp[100];int n,k;//分成不同任意正整数之和void fa(int n,int k){ memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=k;i++)原创 2012-06-14 22:26:41 · 664 阅读 · 0 评论 -
Gridland 数学题 hoj
/*当m*n都为奇数的时候,结果为m*n+0.41,否则为m*n.*/#include int main(){ int t,m,n,i=1; scanf("%d",&t); for(int p=0; p<t; p++) { scanf("%d%d",&m,&n); printf("Scenario #%d:\n原创 2012-07-21 15:09:08 · 519 阅读 · 0 评论 -
hoj Excuses, Excuses! 字符串模拟
/*一个基础的字符串模拟。先将句子用get整串读入。然后用sscanf分离出逐个单词进行匹配。 char *p=temp; while(sscanf(p,"%s",tempkey)>0) { p++; p+=strlen(tempkey);char原创 2012-07-18 07:17:35 · 433 阅读 · 0 评论 -
hoj Printer Queue
/*这是一道用循环队列和优先队列模拟的题。用结构体来定义队列。使队列能够能够记录元素的值和下标。优先队列入队的同时已经自动进行排序。top()的值都为当前队列的最大值。具体模拟过程见程序*/#include #include #include struct Work{ int in; int pos;} work[110]原创 2012-06-20 22:37:45 · 414 阅读 · 0 评论 -
hoj WERTYU
因为课程是主学c++。所以对c的很多细节不甚了解啊。//一个是对转义字符的处理。形如\\ %%//还有一个是对未在数组a里的字符进行处理//getchar 返回的是一个int型的值//char型数组的最后一位是'\0' 即为0,其他的阿斯科马都不为0.所以if[a[i]]表示元素是数组a中的元素。//for(); 是满足for()内的条件一直进行。不满足就跳原创 2012-06-20 07:34:57 · 976 阅读 · 0 评论 -
hoj 1067 Rails 栈的模拟
/*栈的一道基本的模拟题。主要分为三种情况处理。一种是不需要进入C站,直接从A到B。一种是经过C站中转。用栈模拟进出的过程。*/#include #include using namespace std;const int inf=1005;int main(){ stack s; int target[inf]; in原创 2012-06-13 22:29:17 · 585 阅读 · 0 评论 -
hoj Tree Recovery
/*树的前序遍历,中序遍历和后续遍历。用递归的方法。char s+n 表示从s的第n个字符开始读取,前面的去掉。*/#include #include void build(int n,char* s1,char* s2,char *s){ if(n<=0) return; int p=strchr(s2,s1[0])-s2; build原创 2012-06-22 22:28:39 · 362 阅读 · 0 评论 -
hoj encoding 搜索化的模拟
/*先将字母读入二维数组。然后用四个while实现环形数组的输出。保险的方法可先将数组周围一圈用特殊元素标记,然后移动的时候只需判断是否扫描到特殊元素,是则拐向,然后将已经走过的元素也标记为这一特殊元素,防止数组越界。先判断方向,再移动。*/#include #include #include using namespace std;int原创 2012-06-13 22:36:53 · 445 阅读 · 0 评论 -
Java vs C++ hoj
/*一道比较水的题吧.就有几种情况要考虑.error的几种情况:首字母不能使大写,末尾不能是分隔符,不能有连续的分隔符.原来的输入用的是 while(scanf("%s",a)==1),结果就wa了.这个不解啊.望大家指点!!!!谢了.*/#include #include int main(){ char a[110];原创 2012-07-22 14:54:25 · 512 阅读 · 0 评论 -
Ananagrams hoj 字符串模拟
/*一道比较水的字符串模拟。刚开始的时候题意有点看错了。就是注意在有重组可以相同的字符串的时候要把原有的字符串也删除掉。这里用标记。只要将每个字母重排就可以了。还有大小写并没有区分在匹配的时候。*/#include #include #include using namespace std;char a[1001][21];原创 2012-07-18 21:53:10 · 731 阅读 · 0 评论 -
hoj Ordered Fractions
/*主要是快排的模板函数的应用*/#include #include #include #include using namespace std;struct node{ int x, y;}num[10000];int n;int gcd(int a,int b){ if(a%b==0) return b;原创 2012-06-14 22:25:27 · 472 阅读 · 0 评论 -
hdu football 概率DP
/*首先.dp的思路是dp[i][j].表示必到第i场的时候j还留在在场,即第i场比赛的时候j胜了.他的转移条件是i-1场j也胜了,而且i-1场还有另一支队伍k也胜了,且这两支队伍在第i场的时候相遇了,而此时j胜了k.所以.转移的方程可以写成dp[i][j]=dp[i-1][j]*dp[i-1][k]*p[i][k].而如何确定k成了现在的问题.经过计算,从高往低记为1,2,3,....n+1.原创 2012-08-07 21:58:44 · 527 阅读 · 0 评论 -
hdu 3835 概率DP
#include #include #define maxn 1010double p[maxn][maxn][4];double dp[maxn][maxn];using namespace std;int main(){ int r,c; while(scanf("%d%d",&r,&c)==2) { for(int i=1; i<=r;原创 2012-08-07 22:03:22 · 693 阅读 · 0 评论 -
ssworld VS DDD hdu 概率DP
#include //注意题意,是从第一个人先胜的常熟的=第二个人的hp时,才赢.所以n和m应该反过来枚举#include #define maxn 2001double dp[maxn][maxn];double a[6];double b[6];int main(){ int n,m; while(scanf("%d%d",&n,&m)==2) {原创 2012-08-07 22:10:27 · 865 阅读 · 0 评论 -
HDU——Anniversary party 树DP入门
/*问题大意是父亲和儿子不能同时邀请.先用一个二维数组记录父亲和儿子的关系.二维数组的第一个元素记录该父亲的节点的儿子数.然后状态转移就是考虑该点取或不取.dp[i][0]=sum(maxdp[sons][i],dp[sons][0]).dp[i][1]=sum(dp[suns][0]+cost[i]).可在初始的时候将cost[i]直接付给dp[i][1].*/#include #inclu原创 2012-08-07 22:06:55 · 770 阅读 · 0 评论 -
poj 2096 马克科夫链
/*重点是理解dp数组的含义。Poj 的collect bugs.题意就是给n种bug和s个子系统.发现一个bug需要一天的时间.求期望的天数.主要是dp[i][j]的构造.它表示当前已经在j个子系统内发现n个bug,里最后结果还相差的期望天数.一次推出四个转移方程.如dp[i+1][j]表示新发现了一种bug.则对应的概率为(n-i)*j/(n*s*1.0).表示在还剩n-i的bug里除以总原创 2012-08-07 22:09:07 · 1036 阅读 · 0 评论 -
Cable Master 实数的二分 hoj
/*这道题细节的地方有比较多。一个是将浮点数转化为整数来进行二分。貌似用浮点数进行二分的话精度问题会使人异常纠结。还有一个就是要注意出书不能是0.因此要加一个判断。*/#include #include #include using namespace std;int c[10005];int n,k;bool count(int t){ int sum=0;原创 2012-07-24 22:04:24 · 447 阅读 · 0 评论 -
Team Queue STL
#include #include #include #include #include using namespace std;int main(){ int t,n,m,w; char a[20]; bool visit[1010]; int cases=1; while(scanf("%d",&t)==1&&t原创 2012-07-25 09:06:44 · 422 阅读 · 0 评论 -
Bin Packing hoj
/*就是一超级大水题。没的说。排完序后每次去最大和最小值的和,如果大于给定数,则最大的置0.*/#include #include #include using namespace std;int a[100005];int main(){ int n,l; while(scanf("%d",&n)==1) { scanf("%d",&l);原创 2012-07-24 21:40:32 · 504 阅读 · 0 评论 -
mysterious 二分加贪心
/*好题啊!在比赛的时候光想贪心了。没想到二分。结果悲剧了。二分天数有一个注意点就是边界的控制,要选文n,而不是10000,因为数组a后面有很多的空白。二分的条件是用价钱来控制。将7天为一个周期,来进行控制。具体见代码。*/#include #include int a[10001][51];int n,m,b;int sum[8];bool cal(int t){原创 2012-07-24 22:15:40 · 697 阅读 · 0 评论 -
Sequences hoj 单调队列优化DP
/*可以用单调队列优化的DP一般是用于限定长度的区间,且区间有整体移动的趋势。即每一个元素是逐次进出区间,且只有一次。这样的题目一般都是有比较明显的模板。下面的这个就是集训的时候学长给的模板。感觉挺好写和理解。不过综合对比时间效率。感觉不一定是最高效的。题意是给你固定的区间长度范围。求该序列首端和末端的和最大值。简单。维护一个单调队列进行优化即可。有些细节看代码的注释。*/#include原创 2012-08-08 22:12:32 · 744 阅读 · 0 评论 -
Buy Tickets hoj 单调队列优化DP的简单应用
/*题意是问能相互看见的人有多少对。只需要建一个单调递减的队列。枚举每一个i时,对前i-1个元素形成的单调队列里找>=a[i]的元素的个数即可。简单、*/#include #include #define maxn 500001using namespace std;int q[maxn];int a[maxn];int main(){ int n; while(原创 2012-08-08 22:13:50 · 577 阅读 · 0 评论 -
Assemble hoj 不错的二分题 稍有繁琐
/*大致的题意就是从每一种类型的组件里挑选一样,使得所有部件里面最便宜的那个价钱尽量高,而所有部件的钱数综合又不超过给定值。这道题感觉比较难写。首先定义结构体,然后对里面的所有元素进行排序。然后对同一个type里的部件在满则quality的要求去价钱的最小值。*/#include #include #include #include #include using namespac原创 2012-07-24 22:01:37 · 498 阅读 · 0 评论