acm之路
文章平均质量分 61
帐下幕僚
我只是一个普普通通的大学学生,我来到这里是想获得我在学校所不能得到的知识。
展开
-
poj2352题解
线段树经典入门题,线段树本弱是一个半月前听的课,没练题,今天第一次做线段树,一个半小时。。。。 这道题由于数据给出是按y递增的,所以难度降低了,否则应该是先根据y大小由小到大来排序。刚开始我不知道要维护那些数据,翻了一下当时的课件,才渐渐理解只需记录元素个数。。。。tree数组要比maxn大两倍(理论上好像是,一般直接三倍)#include <stdio.h>#include <string.h原创 2016-05-23 19:49:52 · 361 阅读 · 0 评论 -
poj3264题解
线段树入门题 在分支的时候没把握好,出来了奇奇怪怪的答案,再加忘了初始化,,,#include <stdio.h>#include <string.h>#define MAx(X,Y) ((X)>(Y)?(X):(Y))#define MIn(X,Y) ((X)<(Y)?(X):(Y))int N,minnn,maxxx;struct _tag{ int tmax,tmin;原创 2016-05-23 20:47:26 · 258 阅读 · 0 评论 -
hdu1166题解
这道入门题十分经典,基本给出线段树的模板了(建树,改变树,取值) 很容易看出这道题区间维护的是和。#include <stdio.h>#include <string.h>int tree[150001],N,res[40000];void build(int tn,int left,int right){ int mid; if(left==right) { scan原创 2016-05-24 09:35:07 · 312 阅读 · 0 评论 -
uva 10305 ordering tasks题解
经典拓扑排序入门题 先让入度0的顶点输出,然后将这些顶点所在的边剪掉,然后再让入度为0的顶点输出……直至所有顶点输出。此题注意有一个陷阱,m=0是可以的,就相当于任何一个都可以直接输出。 此题还有一点就是它的输出顺序,先把所有入度为0 的顶点按序号从小到大输出,然后再去剪掉边,所以就加了flag0数组来存放这些顶点#include <stdio.h>#include <string.h>st原创 2016-05-25 22:28:20 · 281 阅读 · 0 评论 -
zoj水题分类(自己练习)
zoj分类转载 2016-05-12 20:54:00 · 4701 阅读 · 0 评论 -
hdu 2795 billboard题解
刚开始看到题总不知道要维护什么?估计是因为我弱爆了。。。。 维护区间的最大值,先走左子树,#include <stdio.h>#define maxx(X,Y) ((X)>(Y)?(X):(Y))int tree[800003],h,w,n;int find(int tn,int left,int right,int wi){ int mid,res; if(left==r原创 2016-05-26 10:48:15 · 337 阅读 · 0 评论 -
poj2828题解buy tickets
排队问题 大神都说简单的题,想了很久忍不住看了别人的题解,从后面反向读取(本来我是有这样想的,很快被我否定掉了,简直zz),线段树维护区间中未填充元素的个数。 如果一个元素的‘位置’(pos+1)<=当前树的左子树,否则走右子树(走右子树必须减去左子树的未填充个数) 再开个ans放答案,注意当left==right时,left就是当前元素应该的输出位置,所以直接ans[left]=val.#i原创 2016-05-26 23:20:11 · 342 阅读 · 0 评论 -
zoj2514题解
题目的大概意思就是将密码的几种字符(如果存在的话)替换一下,纯水题。不过注意还是有几个坑。#include <stdio.h>#include <string.h>int main(int argc, char const *argv[]){ int n,ccount,i,ii,lenth,flag; char usn[1010][20],upas[1010][20];原创 2016-05-15 20:45:30 · 318 阅读 · 0 评论 -
zoj3123题解
本来实在二分分类找到这道题的,就直接用二分做,时间1001ms,tle了,限时是1000ms,一直想水过。结果只能放弃二分,其实很简单。。。。。。#include <stdio.h>int N,S,arr[100000];int main(void){ int T,i,sum,current,mil; scanf("%d",&T); while(T--) {原创 2016-05-15 22:44:01 · 344 阅读 · 0 评论 -
poj题目分类
DP: 1011 NTA 简单题 1013 Great Equipment 简单题 1024 Calendar Game 简单题 1027 Human Gene Functions 简单题 1037 Gridland 简单题 1052 Algernon s Noxious E转载 2016-05-15 23:05:11 · 321 阅读 · 0 评论 -
hdu2955 robberies题解(01背包)
注意要先转换成不被抓的概率再来算 状态转移方程money[k]=max(money[k],money[k-M[i]]*p[i])//这里的p[i]是不被抓的概率。#include <stdio.h>#include <string.h>#define Max(X,Y) ((X)<(Y)?(Y):(X))double money[10050];int main(int argc, char原创 2016-05-30 22:48:45 · 271 阅读 · 0 评论 -
hdu2602题解bone collector(01背包)
这是我做的第一道背包问题,推荐背包九讲,经典!!! 状态转移方程: f[i][vi]=maxx(f[i-1][vi],f[i-1][vi-vo[i]]+va[i]) 这是直接由状态转移方程推出的代码(网上很少见到,但初学者容易理解),内存上可以进行优化#include <stdio.h>#include <string.h>#define maxx(X,Y) ((X)>(Y)?(X):(Y)原创 2016-05-30 23:13:12 · 310 阅读 · 0 评论 -
hdu2063investment题解(完全背包)
这道题需要一个小技巧,由于所有的value都是multiple of 1000,所以将总钱数除以1000,每个value除以1000,将dp数组的大小降下来 #include <stdio.h>#include <string.h>#define bttm 1000#define M(X,Y) ((X)>(Y)?(X):(Y))int bond1[12];int dp[50050],b原创 2016-05-30 22:59:53 · 333 阅读 · 0 评论 -
hdu1114Piggy-Bank题解(完全背包)
这是一道简单的完全背包问题,套模板就可以a了。#include <stdio.h>#define INF 29999999#define mmin(X,Y) ((X)<(Y)?(X):(Y))int n,p[510],w[510],f[10510];int main(int argc, char const *argv[]){ int t,i,j,ep,fp,nw; sca原创 2016-05-30 22:54:16 · 400 阅读 · 0 评论 -
hdu1349(题解) Minimum Inversion Number
先用线段树求出最初的逆序数(O(nlogn)),然后推其他(O(n)) 设a1,a2,……an的逆序数为sum,an的逆序数为invn,则an,a1,……an-1的逆序数=sum-invn+比an小的数,而由于输入的数是0,1,……,n-1 所以比an小的数==an,而且invn=n-1-an;所以an,a1,……an-1的逆序数=sum+2*an-n+1,下面代码是反过来,道理是一样的#inc原创 2016-05-30 23:26:11 · 422 阅读 · 0 评论 -
hdu1551题解(wa了好多次)
二分题,卡精度,刚开始我是先转化为整数做的,wa到死,破水题!!!#include <stdio.h>#include <stdbool.h>int N,K;double cable[10001];bool is_ok(double size){ int i,sum=0; for(i=0;i<N;i++) sum+=(int)(cable[i]/size);原创 2016-05-21 20:15:25 · 392 阅读 · 0 评论 -
poj2785题解
二分经典题,注意边界,否则wa到。。。。 由于4个for必定wa,所以分别对a和b,c和d求和,然后对其中一个进行排序,二分查找#include <stdio.h>#include <stdlib.h>#include <string.h>int ab[4010*4010],cd[4010*4010];int N;int mycmp(const void *a,const void *b原创 2016-05-21 17:12:36 · 456 阅读 · 0 评论 -
the die is cast 题解
双层dfs,小心点就过了,一星期没玩dfs,居然弄了我两个小时多。。。。。。这种智障#include <stdio.h>#include <string.h>int h,w;char str[51][52];int ccnt[7],cnt,flag;int mx[5]={0,1,-1,0,0},my[5]={0,0,0,1,-1};void dfs2(int posy,int posx)原创 2016-05-19 22:03:39 · 998 阅读 · 0 评论 -
zoj1171题解
题很长,仔细看完是哈弗曼编码,原先想着能不能不建树直接求,实在想不出就只能建树了(其中本弱参考了一下课本)。 第一次提交wa了,仔细检查发现只有一个不重复字符时出现了bug 不多说,上本弱的代码#include <stdio.h>#include <string.h>#include <stdlib.h>struct _node{ int ccount,length; ch原创 2016-05-14 15:46:27 · 413 阅读 · 0 评论 -
poj1321题解(也是我的第一篇博客)
和八皇后问题基本类似,回溯算法搞定。//在poj提交时最好不要用布 //尔类型,ce过#include <stdio.h>#include <string.h>#include <stdbool.h>char chess[9][10];//最后一个放换行符int n,k,count;bool is_put(int row,int cline){ int i; for(i=原创 2016-05-12 10:06:51 · 809 阅读 · 0 评论 -
zoj3203题解
三分查找入门题 算是二分查找的推广,但要求函数是在查找范围内是凸的或凹的.#include <stdio.h>#define esp 1e-6double H,h,D;double func(double rnum){ double ll=rnum*H/(H-h); if(ll<=D) return ll-rnum; else return D+H-rnum-(H-原创 2016-05-21 22:18:08 · 448 阅读 · 0 评论 -
hdu 2438题解
三分题,公式推不出来。。。。 汽车最高点离拐角的水平距离s=l*cos(sita)-x; 汽车最高点离拐角的垂直距离h= s*tan(sita)+w/cos(sita); 显然h先增后减,所以用三分求出h的最大值,然后与y一比即得答案 http://pic002.cnblogs.com/images/2011/276015/2011082521195360.jpg#include <stdi原创 2016-05-22 10:48:23 · 338 阅读 · 0 评论 -
poj2182 lost cows题解(线段树)
这道题如果思路对了就很简单,倒着读数据,然后这道题维护的是区间上未填充元素的个数。#include <stdio.h>int tree[8010<<2],arr[8010],i,n;void build(int tn,int l,int r){ int mid; tree[tn]=r-l+1; if(l==r) return; mid=((r-l)>>1)+l;原创 2016-06-03 20:10:26 · 449 阅读 · 0 评论 -
hdu1754 i hate it(题解)
这道题果然是i hate it,虽然是线段树的最最基础题,但我tle了30,40发,debug一个月多才知道tle在哪里。 由于我是用纯C写的,没有max函数,我就自己用预处理宏,写了一个,对,tle就在这里,如果你是用c++里面的max就ac了。 我tle的代码#include <stdio.h>#define mMax(X,Y) ((X)>(Y)?(X):(Y))int tree[800原创 2016-06-03 21:28:28 · 505 阅读 · 0 评论 -
poj 1157 little shop of flowers题解
线性dp 状态转移方程 dp[i][j]=max(dp[i-1][k]+dp[i][j],tmp)(此处k为小于j但大于i-1的任意整数)#include <iostream>#include <algorithm>#include <string.h>#include <stdio.h>using namespace std;int dp[110][110];int main(in原创 2016-06-09 19:40:34 · 299 阅读 · 0 评论 -
hdu5187 zhx's contest题解(快速幂快速积)
公式: ans=2^n-2;(n!=1) 用快速幂快速积即可求得答案 显然n==1时,ans=n%p 当p=2时,由公式ans必为0(当然n!=1)“`include using namespace std; typedef long long ll; ll quick_multify(ll a,ll b,ll p) { ll res=0; a%=p; b原创 2016-06-11 18:58:37 · 260 阅读 · 0 评论 -
hdu1575 Tr A(矩阵快速幂)题解
先写一个矩阵乘法,然后应用快速幂即可#include <iostream>using namespace std;typedef long long ll;ll arr[11][11],n;void quick_multipy(ll a[][11],int p){ ll nres[11][11]={0}; for(int i=0;i<n;i++) for(原创 2016-06-11 19:54:49 · 254 阅读 · 0 评论 -
uva442 Matrix chain multiplication(数据结构)
看错题意,以为是给出如ABCDE然后求出最少的策略使乘积次数最少,直到看了别人的代码才回过神来。 其实这道题就和括号匹配那道题差不多,用栈解决。 由于不会用stl,就直接模拟了。(本来说好要学的,结果考试月到来,加上自己懒,已被同学甩得远远的。 人一我百,人十我万。我会坚持下去的,跪着也要走下去)#include <stdio.h>#include <iostream>#include <原创 2016-06-28 15:27:46 · 316 阅读 · 0 评论 -
hdu1698Just a Hook(线段树+懒惰标记)
这是一道成段更新的典型例题。成段更新需要用到懒惰标记。简单来说就是每次更新的时候先不更新到底,用懒惰标记使更新延迟到下一次要更新or询问时。(P.S. 大数据输出和读取不要用cin,cout,今天手残,没事做,tle,tle,。。。)#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>原创 2016-06-28 20:37:22 · 499 阅读 · 0 评论 -
poj3468(A simple Problem with Integers)(线段树成段增减)
利用懒惰标记使更新延迟到下一次需要更新or询问时。#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>#include <stdlib.h>using namespace std;#define ms(X) memset(X,0,sizeof(X));typedef long long原创 2016-06-28 21:35:33 · 261 阅读 · 0 评论 -
hdu1052(田忌赛马题解)
区间dp 状态转移方程 dp(l,r)=max(dp(l+1,r)+cost(l,k),jdp(l,r-1)+cost(r,k)); cost(t,q)是田忌与齐王比赛一局下来的结果#include <stdio.h>#include <string.h>#include <algorithm>#include <stdlib.h>using namespace std;int dp原创 2016-06-13 20:15:12 · 648 阅读 · 0 评论 -
hdu1829题解(A BUG'S LIFE)简单并查集
题意应该不难理解,Professor Hopper的猜想是任何bug都只会和异性interaction,如果不能确定猜想是否错误,输出No suspicious bugs found!; 如果猜想一定错误,输出Suspicious bugs found! 再解释一下,如果出现两只bug interaction,说明他们是异性,那么出现冲突(出现同性和同性interaction)的话猜想就一定错误原创 2016-07-22 21:45:43 · 370 阅读 · 0 评论 -
Codefores 689D. Friends and Subsequences(二分+st)
题意:求max(l,r)与min(l,r)相等的对数。 用st表保存max和min的信息。 但是这样子如果枚举左端点再枚举右端点,n2绝对t了。 我刚开始写的是二分区间(递归写的),wa了,找不出哪里错了,不过比起下面这种又不好写又不好查代码。所以要利用区间性质进行二分, 利用序列a的最大值单调非递减,序列b的最小值单调非递增,二分两次。 第一次求出最大值与最小值相等时j的最小值p,第二次原创 2016-07-23 16:43:02 · 310 阅读 · 0 评论 -
hdu1576(A/B)扩展欧几里得
由于A必能被B整除,不妨设整数k使得A=B*k, 则A=n(mod 9973)->B*k=n(mod 9973)(i式)。 又B与9973互素,即gcd(B,9973)=1 又即存在整数x,y使得x*B+y*9973=1(ii式)。(x,y可由扩展欧几里得算法求得) 由数论的知识,(i式左右两边同乘x式子依旧成立),即 x*B*k=n*x(mod 9973),结合(ii式)得 (1-y*原创 2016-07-01 20:22:43 · 234 阅读 · 0 评论 -
hdu1211(RSA)(扩展欧几里得+快速幂+快速乘)
其实题意可以这样理解,已知e,n,F(n),且gcd(e,F(n))=1 求d使得 d*e = 1 mod F(n)。 由扩展欧几里得算法可求出d。 然后给一个整数an,输出 (an)^d (mod n)的对应的字符。(显然快速幂搞定)#include <iostream>#include <stdio.h>#include <algorithm>using namespace st原创 2016-07-01 21:04:10 · 368 阅读 · 0 评论 -
poj2142(THE BALANCE)(扩展欧几里得入门题)
总共要考虑一下三种情况 1. a *x=b*y+d; 2. a*x=b*y-d; 3. a*x+b*y=d;(其中x和y均为非负整数,可由扩展欧几里得算法求得)#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;#define INF 0xffffffftypedef l原创 2016-07-02 15:04:15 · 405 阅读 · 0 评论 -
hdu2824(the Euler Function)
用欧拉筛求出欧拉函数。http://blog.csdn.net/nk_test/article/details/46242311 欧拉函数:在数论中,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。先给出一个结论:设P是素数,若p是x的约数,则E(x*p)=E(x)*p.若p不是x的约数,则E(x*p)=E(x)E(p)=E(x)(p-1).证明如下:E(x)表示比x小的且与x互质的正原创 2016-07-02 17:41:34 · 365 阅读 · 0 评论 -
codeforces672Robin Hood(经典二分)
怎么都没想到是二分,我真弱爆了。 二分求出k天后最小的人的财富, 理由: 最小的人的财富必然小于或等于平均数向下取整(记为la), 所以范围在0~la之间,二分答案。 再用二分求出k天后最大的人的财富。相减即得答案。 注意:sum等可能会爆int.#include <iostream>#include <algorithm>#include <string.h>#include <原创 2016-07-02 20:52:58 · 293 阅读 · 0 评论 -
poj2689(Prime Distance两次筛)
两次筛,这里第一次用的是欧拉筛,第二次用的是埃氏筛(似乎第二次只能用埃氏筛)。 for(int i=0;i<=R-L;i++) if(!isnPres[i]) res[l++]=i+L; /* for(int i=L;i<=R;i++)//如果这样写的话就runtime error if(!is原创 2016-07-04 19:21:37 · 409 阅读 · 0 评论 -
poj2082(Terrible Sets单调栈入门题)
题意就是求最大连续矩形的面积。 这道题是poj2559的内涵加强版。 对于一个新的元素 (1)如果此时栈为空或者栈顶元素比新元素小,则该元素入栈; (2)如果栈顶元素与新元素相等,则跳过该元素; (3)如果栈顶元素比新元素大,那么此时需要更新栈顶元素并更新面积,一直到栈顶元素小于该元素为止。#include <iostream>#include <stdio.h>#include <s原创 2016-07-18 17:21:21 · 369 阅读 · 0 评论