上一页 1 ··· 22 23 24 25 26 27 28 29 30 ··· 32 下一页
摘要: /*http://poj.org/problem?id=2828这道线段树的题竟然弄了两天,太菜了,后来在队友的讲解下才终于恍然大悟这道题呢,就是插队,但如果从前往后处理的话,一般方法,每插一个,移动后面的元素,移动位置,这样会超时,所以 用另一种方法,就是从后往前找,用线段树查找要插入的位置,(这就是线段树的魅力);每一个节点记录,l-----r存在几个空位,运用插空的方法,每一次查找,应该插入的第pos[i]空位;如一开始 1 2 3 4 为全为空,当插入一个 元素到 1号位置 那么 原来的2好空位变为了1好,3变为了24->3*/#include<stdio.h>#de 阅读全文
posted @ 2012-04-16 20:56 Szz 阅读(326) 评论(0) 推荐(0)
摘要: /* 离散化+线段树 由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话, 首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可。 */#include<stdio.h>#include<stdlib.h>#define N 10040struct node{ int l; int r;}p[N*2];struct color{ int l; int r; int c;}q[N*8];int cmp ( const void *a , const void *b ){return *(int *)a - *(in... 阅读全文
posted @ 2012-04-13 20:25 Szz 阅读(136) 评论(0) 推荐(0)
摘要: /*线段树染色,经典题,在这道题中学到了,只改变段,而没有下放到点,当下一次的改变,须向下进行是,则要将父节点的颜色下方到子节点 vis[]用来标记 ,避免重复计算*/#include<stdio.h>#include<string.h>#define N 100010struct node{ int b; int e; int c; }p[N*4];int sum,vis[N];void build(int x,int l,int r){ p[x].c=1; p[x].b=l; p[x].e=r; p[x].nu... 阅读全文
posted @ 2012-04-12 21:36 Szz 阅读(168) 评论(0) 推荐(0)
摘要: set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)set模板原型://Key为元素(键值)类型template <class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Ke 阅读全文
posted @ 2012-04-10 20:26 Szz 阅读(336) 评论(0) 推荐(0)
摘要: http://poj.org/problem?id=3096#include<iostream>#include<string.h>#include<set>using namespace std;set<string>s;int main(){ string str; int i,j; while(cin>>str) { int f=0; if(str[0]=='*')break; int len=str.size(); for(i=1;i<len-1;i++){ s.clea... 阅读全文
posted @ 2012-04-10 20:25 Szz 阅读(192) 评论(0) 推荐(0)
摘要: #include<stdio.h>int ans,a[22],f,step;int judge(){ int i; for(i=1;i<=20;i++) if(a[i]==1)return 0; return 1;}void change(int x){ a[x]=!a[x]; if(x-1>=1)a[x-1]=!a[x-1]; if(x+1<=20)a[x+1]=!a[x+1];}void dfs(int x,int num){ if(step==num) { if(judge()) { ... 阅读全文
posted @ 2012-04-09 17:41 Szz 阅读(186) 评论(0) 推荐(0)
摘要: 注意 标记hash[],不然会错(数据状态好像很多 ,所以要标记)http://poj.org/problem?id=3185#include<stdio.h>#include<string.h>#define N 1000000struct node{ int num; int step;}p[N];bool hash[1048576];int d[20]={0xC0000,0xE0000,0x70000,0x38000,0x1C000,0xE000,0x7000,0x3800,0x1C00, 0xE00,0x700,0x380,0x1C0,0xE0,0x... 阅读全文
posted @ 2012-04-08 21:59 Szz 阅读(258) 评论(0) 推荐(0)
摘要: http://poj.org/problem?id=3191此题的解法基于以下几点:(1) 如果一个数是奇数,那么它的二进制形式的最后一位肯定是1,我们可以去掉此 1,就是(x-1)/-2,进入(2)(2) 如果一个数的最后一位为 0 ,我们可以把这个数右移(可以类比以 2 为基的二进制数的操作)一位,然后它的二进制的倒数第二个数就成了最后一个,就是 x=x/-2,然后进入(1)迭代,直到变为 0#include<stdio.h>#include<math.h>int a[40];int main(){ int n,i; while(scanf("%d&quo 阅读全文
posted @ 2012-04-07 17:46 Szz 阅读(310) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4038这题的题意就是给一序列的数,有两种操作,一种是把序列中某个数的值加1,要么在序列中增添一个数为1,然后给出操作数,最后要求这些数的乘积最大,求出这个乘积。做这个题要考虑的细节很多,首先要把负数的个数求出,如果为奇数,那么要把最大的那个负数尽量加到0,就相当于转化为偶数的情况了,然后负数就不用在管了,这时候,序列中如果有0的话,很显然他们相乘就是0,所以尽量把所有的0要变成1,之后,如果操作数还有剩余,就要尽量把所有的1变成2了,因为1在序列中是没有任何用处的,增加到2就是翻一番,用1个操作数达到这种效果 阅读全文
posted @ 2012-04-07 10:16 Szz 阅读(321) 评论(0) 推荐(0)
摘要: /*http://acm.hdu.edu.cn/showproblem.php?pid=4039题意:给出N对好友关系,之后Q次提问,问可以对该用户推荐的相识度最高的好友;推荐好友满足的条件:该用户的所有好友的好友中,出现次数最多的,而且推荐好友本身不是该用户的好友;若有多个推荐好友时,按字典序输出;一道悲剧的题啊*/#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 2500#include<iostream>#include<algorithm>using 阅读全文
posted @ 2012-04-06 20:52 Szz 阅读(319) 评论(0) 推荐(0)
上一页 1 ··· 22 23 24 25 26 27 28 29 30 ··· 32 下一页