08 2013 档案
摘要:题目链接来个水题。。难得的1Y。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define LL __int64 6 int flag[31],que[31]; 7 LL fact[31]; 8 int n; 9 LL m;10 void dfs(LL x,int step)11 {12 LL temp = 0;13 int i;14 for(i = 1;i = x)19 {20 flag[i] = 1;21 ...
阅读全文
摘要:题目链接很早 很早之前就看过的一题,今天终于A了。状态转移,还算好想,输出路径有些麻烦,搞了一个标记数组的,感觉不大对,一直wa,看到别人有写直接输出的。。二了,直接输出就过了。。 1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[201][201]; 6 int flag[201]; 7 int pos[201]; 8 char str[201]; 9 int dfs(int L,int R) 10 { 11 int i,minz; 12 if(dp[L][R]) 13 ...
阅读全文
摘要:题目链接什么都不想说,最近状态暴跌。。 1 #include 2 #include 3 #include 4 using namespace std; 5 int p[4][101]; 6 int sum[30][30]; 7 int dp1[30][30],dp2[30][30]; 8 int dp[30][30][30][30]; 9 int dfs1(int x1,int y1)10 {11 if(dp1[x1][y1])12 return dp1[x1][y1];13 if(x1 == y1)14 return dp1[x1][y1] = p[1]...
阅读全文
摘要:题目链接USACO 第6章,第一题是一个插头DP,无奈啊。从头看起,看了好久的陈丹琦的论文,表示木看懂。。。大体知道思路之后,还是无法实现代码。。此题是插头DP最最简单的一个,在一个n*m的棋盘上,有些点能走,有些点不能走,可以走一条回路,也可以多回路,把所有点走完,有多少种走法。。这题的背景还是dota,还是屠夫,还是吃树。。。我还是不会玩屠夫啊。。。学习此题,看的下面的大神的博客,图画很棒,位运算又学了一个新用法。http://blog.csdn.net/xymscau/article/details/6756351 1 #include 2 #include 3 using name..
阅读全文
摘要:非常不容易的一题,思路就是DP之后输出路径。但是此题,路径和DP的方式不一样,路径要按字典序输出。开始写了一个版本,N 10000的时候就是过不了,后来才发现,自己的写法有问题,无法保证字典序。看了看题解,其实也不是很懂。终于还有3个题,加油了!! 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: twofive 5 */ 6 #include 7 #include 8 using namespace std; 9 char str[101];10 char te[101];11 int dp[6][6][6][6][6];12 int judge(int x,i..
阅读全文
摘要:水了好几下。优化1:开始初始化的时候,如果左边那个也是最小值,那么此点就不用进队了。优化2:如果队列里的位置,已经超过了后面位置的初始位置,那么后面这个位置也没用了。 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: hidden 5 */ 6 #include 7 #include 8 #include 9 #include 10 #include 11 using namespace std;12 int que1[200001],que2[200001];13 char str[300001];14 int main()15 {16 int i,l...
阅读全文
摘要:POJ最近做过的原题。 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: picture 5 */ 6 #include 7 #include 8 #include 9 #include 10 #include 11 using namespace std; 12 #define maxn 10000 13 #define lson l , m, rt S.s; 29 return y x) 42 end = mid - 1; 43 else 44 st...
阅读全文
摘要:面对最小割之类的题目,完全木想法。。。枚举+最大流。。复杂度很大了。。。居然很快的就过了。。 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: telecow 5 */ 6 #include 7 #include 8 #include 9 #include 10 using namespace std; 11 #define INF 0xffffff 12 struct node 13 { 14 int u,v,w,next; 15 } edge[10001]; 16 int first[1001],flag[1001],dis[10...
阅读全文
摘要:水过,水过,这个程序跑7,跑5分钟左右把。。。 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: betsy 5 */ 6 #include 7 #include 8 #include 9 using namespace std;10 int p[8][8],ans,n;11 int o[8][8];12 int a[4] = {0,0,1,-1};13 int b[4] = {1,-1,0,0};14 void dfs(int x,int y,int step)15 {16 int i,j,k;17 if(step == n*n)18 ...
阅读全文
摘要:非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的。。。这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径。。。写起来挺非常麻烦,代码不贴了,丢人。。。把USACO,赶紧刷完把。
阅读全文
摘要:再次 回升,rating涨了150+,这次到了1670,发挥不稳定啊。什么时候来次DIV1啊。。。感觉这次题,还是挺适合我做的,没有坑爹的题意,基本都挺短的,样例+提示,基本很快就可以得到题意。第一题水题。。7分钟1Y。第二题题意跑偏了一点点。。20分钟交了次,发现理解错题意了,又折腾了20分钟,2Y。第三题推公式,高中数学递推式F(n) + 1是一个等比数列,认真检查+实现,花了我很多时间。第四题在剩下半小时,理解了题意,写了个暴力,还写错了,第二组没过。今天又看了看,最近老是做,关于树上的题。给一些时间,还是可以做出来的。用一个标记数组,标记此点到m个点里 最长的距离。先搞出m个点里的最长
阅读全文
摘要:题目链接枚举A和B中每一段含有C的段,A的前面 后面和B前面后面,求最长公共子序。观察发现,可以预处理最长公共子序。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp1[1001][1001],dp2[1001][1001]; 8 char s1[1010]; 9 char s2[1010]; 10 char s3[1010]; 11 char s4[1010]; 12 char s5[1010]; 13 int que1[1010][3]; ...
阅读全文
摘要:如果不在最长路的边,那么肯定是w*最长路。如果在最长路,那么把最长路分成两段,左边树的最长路就是左段+左边点的次短路(不包含最长路上的点的最长路) ,右边同理。还有就是更新,经过左端点的最长路,不一定是整颗左边树的最长路,乱搞一下就可以了。我是搞成一条链,写的很麻烦。。从一点搞到了快四点。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define INF 1000000 9 struct node 10 { 11 i...
阅读全文
摘要:题目链接这是最早看懂题意的一题,状态转移,挺好想。。但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到。先预处理的dp[0]的情况,就是以p[0]为结尾的情况。之后D就行了,例如样例此位6,去重只要把642896 去掉就行了,dp[1][642896%m] --;注意这个值的更新。突然发现。 1 #include 2 #include 3 using namespace std; 4 #define LL __int64 5 int dp[50100][201]; 6 int p[50100]; 7 int d[50100]; 8 int po[200100]; 9 int ..
阅读全文
摘要:题目链接这是HDU第400个题。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int p[30],qur[60001][6]; 7 int main() 8 { 9 int i,j,k,n,m,num;10 while(scanf("%d%d",&n,&m)!=EOF)11 {12 multiset se[40];13 multiset::iterator it;14 for(k = 1; k <= n; k ++)15 ...
阅读全文
摘要:题目链接省赛训练赛上一题,貌似不难啊。当初,没做出。离线+树状数组+二分。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 100000 6 int p[100100]; 7 int qur[300001][3]; 8 int lowbit(int t) 9 {10 return t&(-t);11 }12 void insert(int t,int d)13 {14 while(t getsum(N))34 return -1;35 str = 1;36 e...
阅读全文
摘要:题目链接我看的这里:http://www.cnblogs.com/ka200812/archive/2012/01/20/2328316.html然后整理一下当做模版。0换成eps,会wa,应该要写成精度特判把。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define eps 1e-8 8 #define N 110 9 struct point10 {11 double x,y;12 }p[N],temp[N],pre[N];13 int n,m;14 d...
阅读全文
摘要:题目链接类似求面积并。。2Y。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL __int64 8 #define maxn 40100 9 #define lson l , m, rt x) 35 end = mid - 1; 36 else 37 str = mid + 1; 38 } 39 return mid; 40 } 41 void pushup(int r...
阅读全文
摘要:这场CF,脑子乱死啊。。。C题,搞了很长时间,结束了,才想到怎么做。B题,没看,D题,今天看了一下,很不错的组合题。如果n和m都挺多的时候以下情况都是变为1,根据偶数个0,最后将会为1,奇数个0,最后变为0,以1开头,全都是0.0 1..0 0 0 1....0 0 0 0 01....总的情况是C(n+m,m),算1也可以算出来。注意m = 1的时候特判,0的时候,我也全写的特判。10^5的组合数,用费马小定理求逆元。看了下题解,题解直接来了个逆元。。inv(a) = a^(mod-2),完全没看懂,查了查资料,明白了。。a*inv(a) 模 mod = 1因为mod是素数,根据费马小定理,
阅读全文
摘要:题目链接看的HH的题解。。周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define maxn 10000 8 #define lson l , m, rt S.s; 24 return y x) 37 end = mid - 1; 38 else 39 str = ...
阅读全文
摘要:题目链接终于过了,边界让我wa了好几次,猥琐的用AC代码对拍,很无奈,用非常麻烦的方法。写一下,估计以后再碰到,肯定看不懂这是写的什么了。以前做过,统计1和2的,统计0比1和2麻烦多了,有前导0的情况,不太好弄。算是用统计方法,先把sp[len-1]所有的加上,长度为len-1的情况。然后就是长度为len的情况。从高位到低位,遍历。如果此位是0,judge(str+1) + 1 + dfs(str+1),是统计当前为是0的,多少情况,但是会漏解,算是受以前那个题统计1和2的影响把。如果下一位是0,那么就不用管了,交给下位统计去把。下位不是0,计算会漏掉下位是0的情况,所以定住下位是0,组合一下
阅读全文
摘要:题目链接中间计算的各种细节。有的细节没处理好,就wa了。。。主要思路就是根据卡特兰数列的:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2) 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define LL __int6410 LL ctl[101];11 LL sum[101];12 struct node13 {14 int l,r;15 }tree[...
阅读全文
摘要:题目链接 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL __int64 9 #define MOD 100000000710 #define INF 0xffffff11 int dp[101][101],g[101][101],pre[101][101];12 int ans[1001];13 int main()14 {15 int n,m,minz,i,j,k,sv,ev,w,num,temp;16 wh...
阅读全文
摘要:题目链接测试dinic模版,不知道这个模版到底对不对,那个题用这份dinic就是过不了。加上优化就WA,不加优化TLE。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define INF 0x3ffffff 9 struct node 10 { 11 int u,v,next,re,w; 12 } edge[200001]; 13 int first[501],dis[501]; 14 int p[251][251];...
阅读全文
摘要:题目链接思路题。看的题解。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL __int64 7 LL p[100001]; 8 int main() 9 {10 int i,n,m,sv,ev,w;11 while(scanf("%d%d",&n,&m)!=EOF)12 {13 memset(p,0,sizeof(p));14 for(i = 1;i <= n;i ++)15 {16 ...
阅读全文
摘要:题目链接这题,明显考察搜索能力。。。在中文版的维基百科中找到了公式。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MOD 1000000007 7 #define LL __int64 8 LL dp[200001]; 9 int que[1001],flag[1001];10 int main()11 {12 int i,n,t,j,num;13 LL x;14 num = 0;15 for(i = 0;;i ++)16 {17 ...
阅读全文
摘要:题目链接6Y什么水平。。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL __int64 7 #define INF 10000000 8 int dp1[10001]; 9 int dp2[10001];10 LL p[200001];11 LL sum[200001];12 int main()13 {14 int n,m,i,ans;15 while(scanf("%d%d",&n,&m)!=EOF)16 {17 memset(s...
阅读全文
摘要:题目链接暴力水过的,比赛的时候T了两次,优化一下初始化,终于水过了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MOD 1000000007 7 #define LL __int64 8 double dp[2][1<<20]; 9 int que[1<<20];10 int flag[1<<20];11 double o[250];12 char str[250];13 int p[250];14 int judge(char s)15 {16
阅读全文
摘要:题目链接主要是pushup的代码,其他和区间更新+扫描线差不多。那个区间如果要再刷一层x,那么sum[x][rt] = que[r+1] - que[l];但是如果原本有颜色为i,颜色将会变成i|x,sum[x][rt] 要减去以前的i颜色的部分。sum[i|x][rt]要加上那部分。这个题还可以用容斥,容斥的话,多次求面积并就可以了,代码直接是模版,对扫描线,还是不熟啊。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL __int64 7 #define ma...
阅读全文
摘要:题目链接 1 #include 2 #include 3 #include 4 using namespace std; 5 #define lson l,m,rt>1; 22 lsame = (m - l + 1); 23 for(i = l;i sorted[m]) 43 { 44 val[d+1][rpos++] = val[d][i]; 45 } 46 else 47 { 48 if(same = k) 81 { 82 ...
阅读全文
摘要:题目链接参考HH大神的模版。对其中一些转移,还没想清楚,大体明白上是怎么回事了,划分树就是类似快排,但有点点区别的。多做几个题,慢慢理解。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define lson l,m,rt>1; 23 lsame = (m - l + 1); 24 for(i = l;i sorted[m]) 44 { 45 val[d+1][rpos++] = val[d][i]; 46 } 47 ...
阅读全文
摘要:题目链接做的我很无奈,当时思路很乱,慌乱之中,起了一个想法,可以做,但是需要优化。尼玛,思路跑偏了,自己挖个坑,封榜之后,才从坑里出来,过的队那么多,开始的时候过的那么快,应该就不是用这种扯淡方法做的。 1 表示很无奈,没有想到简单的递推式,搞了一个MLE+TLE的方法。 2 最初版本,多了一个for的复杂度,只要标记一下就好,可是在递归了不好处理,让我折腾了老一会,才弄好。 3 复制代码 4 int dfs(int l,int r) 5 { 6 int i,ans = 0; 7 if(l == r) 8 return 1; 9 els...
阅读全文
摘要:题目链接看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到最后的最大值,插入的时候,往前更新就好了,类似求和。 1 #include 2 #include 3 #include 4 using namespace std; 5 int num[50100]; 6 int p[50100]; 7 int n; 8 struct node 9 {10 int l,r,id;11 } que[50001];12 bool cmp(node a,no...
阅读全文