随笔分类 -  00 . . |解题报告

[日后重做系列] 2014-04-20
摘要:zoj 3781 Paint the Grid Reloaded zoj 3779===================================zoj 3779 解法简记(反选可见):可以看成4个4*4的方格(答案可以两次开方)然后解决以下问题:n个颜色,涂4*4的方格,要求颜色必须都用,问... 阅读全文

posted @ 2014-04-20 20:08 ShineCheng 阅读(275) 评论(0) 推荐(0)

HDU 2767:Proving Equivalences(强连通)
摘要:题意:一个有向图,问最少加几条边,能让它强连通方法:1:tarjan 缩点2:采用如下构造法: 缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以是强连通了。如果说有几个结点不连通,那么让他们的尾结点相互只向对方的头结点就好了。那么,最后的答案就是,头结点和尾结点中比较小的那个数量。当然,如果缩点后只有一个点,那么就是0;代码:#include #include #include #include using namespace std;#define N 20010using namespace std;vector to[N];vector . 阅读全文

posted @ 2014-04-09 22:03 ShineCheng 阅读(148) 评论(0) 推荐(0)

POJ 2828: Buy Tickets(线段树)
摘要:扯淡:这题要赞。因为卡了我两次……第三次终于做出来了。。。好吧是看了别人代码之后T T。太弱太弱。。。题意:有n个人排队,但他们会插队。他们按先后顺序来到,每次每个人选择插在Pos[i]这个位置,问最后的排队情况(每个人用其val值表示)。(1 ≤ N ≤ 200,000) 思路:容易想到,最后一个人,插哪,那它就在哪。也就是说,一个人的最后位置,只会被它后面的人影响到。再分析,就会发现,如果一个人插在Pos[i]这个位置,那么表示,它插入的时候,前面有Pos[i]个人(废话)。那么我们倒着计算的时候,由于他后面的人已经进来了,那么第i个人站的实际位置,是在它前面还有pos[i]个空位的位置( 阅读全文

posted @ 2014-04-09 14:38 ShineCheng 阅读(153) 评论(0) 推荐(0)

HRBUST 2078:糖果(模拟,贪心)
摘要:题不难,但作为一道恶心到了我的题,我还是记录一下的好。题意:n个人围一圈,要求:相邻两人,分数高的要比分数低的得到更多的糖果,若分数相同则必须得到相同数量的糖果。问满足要求的最少需要分配的糖果数。(N#include #include using namespace std;#define N 1000010struct AA{ int id; int v; int num;}a[N], stk[N];bool cmpV(const AA &a, const AA &b) { return a.v 1 && stk[top-1].v == stk[0].v) { 阅读全文

posted @ 2014-03-31 19:11 ShineCheng 阅读(257) 评论(0) 推荐(0)

大视野 1016: [JSOI2008]最小生成树计数(最小生成树)
摘要:总结:此类题需要耐心观察规律,大胆猜想,然后证明猜想,得到有用的性质,然后解答。 简单的说:找隐含性质。传送门:http://61.187.179.132/JudgeOnline/problem.php?id=1016 题意:n个点m条边的图,问其最小生成树的个数(只要有一条边不同,就算不同)。n#include #include using namespace std;#define mod 31011#define N 200struct Edge{ int a, b, c; bool operator >=1; } ... 阅读全文

posted @ 2014-03-26 19:40 ShineCheng 阅读(307) 评论(0) 推荐(0)

HRBUST 2064:萌萌哒十五酱的宠物~(最近公共祖先LCA)
摘要:题意:一个n个点的树,询问某两点之间的简单路径,问路径上任选三边能否组成一个三角形。 N= A[i-1] + A[i-2];观察可以发现其增长类似斐波那契,又因为权值=45个时,必然可以组成三角形。剩下的,就暴力一下就好了。确定路径边的个数的方法是深度结合lca来做。暴力的话就是两点向上攀,直到公共祖先。然后sort一下,然后检查是否存在 A[i] #include #include using namespace std;#define N 100010struct BCJ{ int fa[N]; void init(int n) { for (int i = 0;... 阅读全文

posted @ 2014-03-25 19:47 ShineCheng 阅读(215) 评论(0) 推荐(0)

HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)
摘要:题意:n个点的一棵树,树的边上有权值。一条路径的权值定义成这条路径上所有边的权值的xor。问所有路径的最大权值是多少。思路:首先,树上任意两点之间的路可以表示成 这两点到根节点的路- 其最近公共祖先到根节点的路*2.那么这里如果是用xor操作,重复的那部分正好就没了。深搜一边,得出所有点到根节点的权值,这样问题就边成了n个数字,将其中两个xor,问得到的最大值是什么。然后这里我卡住了……实际上做法非常……用字典树记录所有这些树(二进制),然后对每一个数,去找现在存在的和它xor之后答案最大的那个数。暴力完n个数就得到答案= =……坑:深度太深爆栈了。只能自己写。用栈模拟了递归,但感觉又不像是深 阅读全文

posted @ 2014-03-25 19:04 ShineCheng 阅读(235) 评论(0) 推荐(0)

Codeforces 404E: Maze 1D(二分)
摘要:题意:指令“R”机器人会向右走一步,“L”是向左。起初机器人在0位置,可以在除了0以外的任何位置放障碍,如果机器人的指令将使它走到障碍上,那这一步他会保持不动。要求让机器人最终结束的那一步一定只走过一次,也就是最后一次,这样称为完成指令。求在放障碍最少的情况下,能使机器人完成指令的方案数。方法:我去,这题意略长啊。最开始从细节分析,然后枚举情况,感觉挺简单的,然后……就没有然后了……后面枚举情况的时候,好复杂,感觉怎么都想不全(至少短时间想不全诶)然后看解题宝宝。(是报告)额,原来可以用模拟+二分解决~真是暴力的思路呀,不过没有发现它的二分性质~诶,以后要从暴力的方面先想象咯,或者,太复杂的时 阅读全文

posted @ 2014-03-20 22:29 ShineCheng 阅读(325) 评论(0) 推荐(0)

POJ 3468:A Simple Problem with Integers(线段树[成段更新])
摘要:题意:N个数Q次操作。一共两种操作:Q l r :询问[l,r]这个区间里的数字和,C l r c: [l,r]区间里的每个数都加上c。1 ≤ N,Q ≤ 100000.方法:线段树的成段更新。注意懒惰标记。这只是为了有个模板。易错点在代码中以下划线标注。//16:06#include #include #define N 100010#define lson l, mid, rt mid) update(L,R,v,rson); pushUp(rt);}long long query(int L, int R, int l, int r, int rt) { if (L mid... 阅读全文

posted @ 2014-03-19 17:16 ShineCheng 阅读(171) 评论(0) 推荐(0)

Codeforces 403D: Beautiful Pairs of Numbers(DP)
摘要:题意:转换模型之后,就是1~n个数中选k个,放到一个容量为n的背包中,这个背包还特别神奇,相同的物品摆放的位置不同时,算不同的放法(想象背包空间就是一个长度为n的数组,然后容量为1的物体放一个格子,容量为n的物体放在相邻的n个格子里。问方案数。方法:选k个物品放在背包中有多少种放法。然后就是k个物品放了以后,还剩下几个空位,空位的位置不同,则方案数也不同。所以要求出几个空位放在几个地方有多少方案数最后相乘,再乘上阶乘就好了。#include #include #include #define mod 1000000007long long dp[1010][55];int ans[1010][ 阅读全文

posted @ 2014-03-18 19:50 ShineCheng 阅读(518) 评论(0) 推荐(0)

HDU 1394:Minimum Inversion Number(树状数组,线段树)[水]
摘要:题意:有0~n-1这n个数,以一定的排列。这个排列可以循环,就是可以把第一个拿到最后,然后形成新的排列。问这些排列中的逆序对最小值。思路:最后的循环,拿走一个之后,新的逆序对数 newsum = oldsum - nowni + ((n-1)-nowni)其中 ,nowni表示这个数所构成的逆序对数。Nowni = 原数列中此数往后构成的逆对数 + 原数列中此数往前构成的非逆对数。然后那两个辅助数组,就可以用扫描循环,然后求前面(或后面)比现在这个数大的(或小的)的数有多少。典型的树状数组。为了练习线段树,所以写了。//18:34//18:53//19:02//19:08 过#include 阅读全文

posted @ 2014-03-17 19:35 ShineCheng 阅读(176) 评论(0) 推荐(0)

训练赛占位……
摘要:诶。做了一天水题…… 阅读全文

posted @ 2014-03-16 20:32 ShineCheng 阅读(95) 评论(0) 推荐(0)

HDU 1754:I Hate It(线段树-单点更新)
摘要:题意:1~N这些人有一些分数,之后有M条操作。要求支持两种操作:更新其中某个人的成绩,查询[A,B]区间内的人的最高成绩。 ( 0#include #include using namespace std;#define N 200020#define lson l, mid, rt mid) ans = max(ans, query(L,R,rson)); return ans;}void update(int pos, int v, int l, int r, int rt) { if (l == r) { tree[rt] = v; return;... 阅读全文

posted @ 2014-03-15 12:55 ShineCheng 阅读(150) 评论(0) 推荐(0)

UPC 2223: A-Number and B-Number(数位DP+二分)
摘要:积累点:1: (l&r)+((l^r)>>1) == (l+r)/2 2: 注意判断现在是否有限制。当枚举下一个量时,是(isQuery && j==end),不要搞错。传送门:http://acm.upc.edu.cn/problem.php?id=2223题意:能被7整除或者含7的数称为A-Number,所有A-Number从小到大写好,下标编号(从1开始),去掉那些下标为A-Number的数,剩下的数称为B-Number。求第N个B-Number是多少。思路:求A-Number就是简单的数位DP。dp[i][mod] 表示所有i位数中,%7==mod 阅读全文

posted @ 2014-03-14 20:18 ShineCheng 阅读(423) 评论(0) 推荐(0)

LightOJ - 1032 Fast Bit Calculations (数位DP)
摘要:类型:数位DP题意:[0,N]范围内所有数的二进制表示,问出现"11"的次数。(“111”计为两次) (0 ≤ N #include int num[50];long long dp[50][2];long long nowx;long long dfs(int i, int d, bool isQuery) { if (i == 1) { return 0; } long long &nowdp = dp[i][d]; if (!isQuery && ~nowdp) return nowdp; int end = isQuery?num[i-1]: 阅读全文

posted @ 2014-03-14 14:25 ShineCheng 阅读(233) 评论(0) 推荐(0)

HDU 4734: F(x) (数位DP)
摘要:总结:去数字那维的方法,就是改成循环里面枚举当前位(之前的做法是枚举下一位)抽象出口,可以从前一个有意义的状态来推导出其意义。类型:数位DP题意:F(x) = A n * 2 n-1 + A n-1 * 2 n-2 + ... + A 2 * 2 + A 1 * 1.问[0,B]之间满足F(x) num[i])定义:dp[i][f] 表示所有i位数中(含前导0),F() #include int dp[12][10000];int num[30];int getf(int x) { int ans = 0; int len = 0; while (x) { a... 阅读全文

posted @ 2014-03-14 12:07 ShineCheng 阅读(207) 评论(0) 推荐(0)

LightOJ 1140: How Many Zeroes? (数位DP)
摘要:当前数位DP还不理解的点:1:出口用i==0的方式2:如何省略状态d(就是枚举下一个数的那个状态。当然枚举还是要的,怎么把空间省了)总结:1:此类DP,考虑转移的时候,应当同时考虑查询时候的情况。2:考虑x在第i位之后,能遍历多少数字,其答案为(x%10i-1+1) 3:这里的记忆化搜索不太一样喔,出口一定要写在递归里,不然,查询状态下差到出口就会出错了~类型:数位DP题意:求[A,B]区间内的所有数,写下来之后,0的个数。(a,b 为 unsigned int)思路:我的笨拙暴力状态:dp[i][d][okPre] 表示d开头的i位数,(okPre表示计算前导0的情况下,反之~),的0的个数 阅读全文

posted @ 2014-03-13 21:52 ShineCheng 阅读(440) 评论(0) 推荐(0)

HDU 2089:不要62(数位DP)
摘要:类型:数位DP题意:定义一个好的数为 没有出现“4”和“62” 这样的数。问[n,m]之间有多少这样的数。(0#include int dp[15][10];int num[120];int dfs(int i, int now, bool iscount) { if (!iscount && dp[i][now] != -1) return dp[i][now]; if (i == 1) { if (now == 4) return dp[i][now] = 0; else return dp[i][now] = 1; } int end ... 阅读全文

posted @ 2014-03-13 20:20 ShineCheng 阅读(159) 评论(0) 推荐(0)

HDU 4722:Good Numbers(数位DP)
摘要:类型:数位DP题意:定义一个Good Number 为 一个数所有位数相加的和%10==0.问[A,B]之间有多少Good Number.方法:正常“暴力”的定义状态:(i,d,相关量)定义dp[i][d][mod] 为 d开头的i位数中,%10==mod的数的个数dp[i][d][mod] = sum(dp[i-1][0~9][(mod-d+10)%10]出口:dp[1][d][mod] = (d==mod);代码:#include #include #include #include using namespace std;long long dp[20][10][10];int num[ 阅读全文

posted @ 2014-03-13 20:13 ShineCheng 阅读(198) 评论(0) 推荐(0)

HDU 3709: Balanced Number (数位DP)
摘要:类型:数位DP题意:定义平衡数为:以某位数为中心,左边的每位数*这个数离中心的距离 == 右边的每位数*这个数离中心的距离。问[x,y]之间有多少平衡数思路:做的莫名奇妙……定义:dp[i][d][k][b] 为 首位为d的i位数,以第k位为中心点,平衡因子为b的数的个数。平衡因子定义为,中心点右边的和-中心点左边的和。实际上这个状态定义冗余了。不需要定义首位d,同时,平衡因子如果定义成,之前所有数的加权和为b,那就不有写这么复杂了。唉,现在有点乱。理不清楚啊。#include #include #include #define BB 1000using namespace std;long 阅读全文

posted @ 2014-03-12 22:49 ShineCheng 阅读(165) 评论(0) 推荐(0)

导航