
ACM
文章平均质量分 62
ehi11
这个作者很懒,什么都没留下…
展开
-
Ubiquitous Religions 简单并查集
/*基础的并查集。初始值设为n。只要合并两个人一次,就n--*/#include const int maxn=50001;int f[maxn];int sum;int find(int a){ if(f[a]==a) return a; else f[a]=find(f[a]);}void unit(int a,int b){原创 2012-08-01 22:10:09 · 475 阅读 · 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 评论 -
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 评论 -
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 评论 -
Radar Installation 贪心 hoj
/*这道贪心挺不错的.首先预处理出每个点对应的雷达极限位置.然后就是区间覆盖的贪心揭发.先进行排序,.开始时以第一个点的右位置为标准,当某一个点的左边大于他的时候,更新标准,ans++.当某点的右位置小于他的时候,更新标准即可.*/#include #include #include #include struct point{ dou原创 2012-08-05 13:05:41 · 470 阅读 · 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 评论 -
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 评论 -
水题 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 评论 -
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 评论 -
Ananagrams hoj 字符串模拟
/*一道比较水的字符串模拟。刚开始的时候题意有点看错了。就是注意在有重组可以相同的字符串的时候要把原有的字符串也删除掉。这里用标记。只要将每个字母重排就可以了。还有大小写并没有区分在匹配的时候。*/#include #include #include using namespace std;char a[1001][21];原创 2012-07-18 21:53:10 · 731 阅读 · 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 评论 -
UVA 10361 Automatic Poetry
/*这是一道字符串模拟的题,只需要把括号的位置记录下来,按顺序直接输出即可*/#include #include #include using namespace std;int main(){ int n; char a[110]; char b[110]; scanf("%d",&n); getchar();原创 2012-06-12 21:19:20 · 560 阅读 · 0 评论 -
bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.
/*提供的输入数据:输入行数列数 起点终点然后输入任意点的位置,可求起点到终点的距离, 0 0 表示结束.input:6 5 0 0 0 41 1 0 1 11 0 1 1 11 0 1 0 01 0 1 1 11 1 1 0 11 1 1 1 10 41 34 04 40 0output:原创 2012-07-21 20:03:13 · 1821 阅读 · 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 评论 -
黑白图像
/*一道很基础的搜索DFS。对没有访问过的黑色块进行拓展。拓展时以该黑色块为中心拓展他相邻的八个块。存图的时候可以先将周围的一圈标记为白色。防止越界。*/#include #include const int maxn=710;char s[maxn];int dis[maxn][maxn];int mat[maxn][max原创 2012-06-22 23:31:38 · 437 阅读 · 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 整数划分问题 经典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 评论 -
拓扑排序
/*存在环的话则不存在拓扑.所以用dfs搜环.用数组c记录状态.-1表示正在搜索,尚未返回.0表示还未搜索.1表示搜索完毕.数据输入为n节点个数 m对关系 输出一组拓扑排序.*/#include #include #include #define maxn 1001using namespace std;int map[maxn][maxn]原创 2012-07-21 12:39:26 · 320 阅读 · 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 评论 -
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 评论 -
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 encoding 搜索化的模拟
/*先将字母读入二维数组。然后用四个while实现环形数组的输出。保险的方法可先将数组周围一圈用特殊元素标记,然后移动的时候只需判断是否扫描到特殊元素,是则拐向,然后将已经走过的元素也标记为这一特殊元素,防止数组越界。先判断方向,再移动。*/#include #include #include using namespace std;int原创 2012-06-13 22:36:53 · 445 阅读 · 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 评论 -
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 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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
Assemble hoj 不错的二分题 稍有繁琐
/*大致的题意就是从每一种类型的组件里挑选一样,使得所有部件里面最便宜的那个价钱尽量高,而所有部件的钱数综合又不超过给定值。这道题感觉比较难写。首先定义结构体,然后对里面的所有元素进行排序。然后对同一个type里的部件在满则quality的要求去价钱的最小值。*/#include #include #include #include #include using namespac原创 2012-07-24 22:01:37 · 498 阅读 · 0 评论 -
IP Filtering hoj 二分好题!!
/*用位运算将ip转化成数字。对左端点进行排序。然后将区间合并。如果二分的值在左边界左边,则向上一个区间查询,若果在中间,则返回true,否则,向下一个区间找。最后一个很蛋疼的地方就是high=n-1而不是n,数组的下标越界。这个地方wa到吐血啊。*///>为除#include #include #include using namespace std;struct IP{原创 2012-07-24 21:56:57 · 694 阅读 · 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 评论 -
Magic-Pen1 hoj
/*原本是线段树的基础题。结果用模拟也能水果的话就不多说了,奇怪的是用int 0 1表示会超时,用bool ac。*/#include int main(){ bool a[10005]; int n,m,x,y,c; while(scanf("%d%d",&n,&m)==2) { for(int i=1;i<=n;i++)原创 2012-07-24 21:42:48 · 430 阅读 · 0 评论