
思路题
playwfun
宁静致远
展开
-
UVA - 815 Flooded
只需要对所有的单位square升序排序,从第一个开始往上添水ji原创 2014-08-21 14:15:43 · 1285 阅读 · 0 评论 -
codeforces round# 302(div 2 D)(思路)
本题目要让删除尽量多的边,使得图上存在一条从s1 -> t1 不超过 l1 的路径,和一条从s2 -> t2 不超过 l2 的路径。因为点数不超过3000,边数也不超过3000,且边权都为1那么直接bfs求出任意两点的最短路径。然后直接枚举重叠部分的两个点,重叠的起点和重叠终点然后暴力就可以了。//#pragma comment(linker, "/STACK:1024000000,1原创 2015-09-15 09:33:56 · 336 阅读 · 0 评论 -
codeforces 590C(bfs)
本体题意不再描述。把三个国家缩成三个点,那么把这三个点连起来,只有两种方法,可以尝试画一下,然后思路就很明显了。#include #include #include #include #include using namespace std;typedef long long ll;#define rep1(i,x,y) for(int i=x;i<=y;i++)#defi原创 2015-11-05 10:54:18 · 656 阅读 · 0 评论 -
codeforces 593B(思路)
题意:给定n条直线( y = kx + b) (n分析:首先每条线段与直线y = x1 , y=x2的 两个交点的y坐标记为(y1 , y2 )可以这样来看存在两个直线在x1,x2之间的截线段相交,(y1, y2) ,(y11 , y22) 若y1 > y11 , 那么必有y2 #include using namespace std;typedef long lon原创 2015-11-06 19:22:17 · 797 阅读 · 0 评论 -
BZOJ 3990(深搜思路题目)
题目: 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1 下面是一个操作事例: N=3,A[1..8]=[3,6,1,2,7,8,5,4]. 第一次操作,执行第3种操作,交换A[1..4]和A[5..8],交换后的A[1..8]为[7,8,5,4,3,6,1,2]. 第二次原创 2015-09-18 11:29:50 · 337 阅读 · 0 评论 -
codeforces round# 303(div2 E)(思路图)
求图从s出发的最短路径树的边权总和最小。在跑dijkstra时候,保证每个点的父边权值尽量小就可以了。//#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #includ原创 2015-09-22 12:42:33 · 294 阅读 · 0 评论 -
codeforces 589G(birnary serach + bit + 离线)
题意:很明显给定n,m(n,m并给定一个长度为m的数组 , 代表m天每个人可以工作多长时间。下面共有n对二元组,(d,t)代表第i个人需要完成工作量为t的任务,可是每天要么不干,要么先拿出d的时间来准备,然后剩下的可行时间工作,问每个人最少需要到第几天完成任务。分析:这样的题目,很明显的思路,离线排序使之产生顺序化,然后从一边开始考虑,是的前面兼顾后面的条件,加上点数据结构即可原创 2015-10-30 10:01:19 · 555 阅读 · 0 评论 -
codeforces 592D(树上的思路题)
题意:给出一颗n(n分析:首先我们来看一下,要把这m个点联通需要的最小联通子树的边是必须遍历到的,从其他不在该子树上的点出发,这些边也必须遍历到,那么从子树上一最远点出发最优。因为从一点出发的答案为 遍历到的边数*2 - 从该点出发的做能到达的最远点所需边数。所以从该公式可以很明显发现,在最小联通子树上的一个最远点出发最优。#include #include #inc原创 2015-11-03 08:41:32 · 618 阅读 · 0 评论 -
codeforces 589C(divide and conquer)
题意:给定一个长度不超过100的原串,让重复复制现在的串,然后向右循环移动pi次,粘贴到串的右端,重复该过程n次(每次串长都将翻倍),给定m(m分析:由于(1可以这样来看问题 记 f(i) 为从初始位置开始特定字母出现的次数,ans = f (r) - f(l-1);这样的查询,使我们想着能不能够递归60层,不分叉的统计出结果, 答案是可以的 , 注意到 深度为 i原创 2015-11-03 11:29:32 · 517 阅读 · 0 评论 -
codeforces 601A(脑筋急转弯 , 55)
题目意思,给了最多400个点的完全图,但是每条边可能是公路也可能是铁路,求1个火车和一个汽车同时都从1出发到n中间不走到重复点的最短时间.1 - n 这条边必定是铁路或公路,然后就没有然后了。下面是自己傻X用压缩了一下转移写的。直接辆车出发最短时间到n 的最小值即答案、#include using namespace std;typedef long long ll;ty原创 2015-11-26 10:59:42 · 503 阅读 · 0 评论 -
CodeForces 570D(dfs序 or 离线dfs)
题目意思: 给定一颗root为1的树,节点最多5e5个,每个节点有一个英文字母,要求在指定子树根节点x,和指定深度y,求该子树y深度所有节点的字母能不能组成回文串。解法1: 利用dfs序,为所有点标上进出两个标记,既可以代表一个区间(dfs序很重要的一个应用),顺便将每个深度下所有的单个字母出现的标号统计到相应的vector中后,在计算答案时进行26次二分上下界求原创 2016-04-06 14:24:11 · 504 阅读 · 0 评论 -
hdu 5662
一个很简单的问题,暴力枚举k,然后每次的复杂度位O(n/k);这样很明显的nlog(n);至于每次在数组A 上求一个L , R 使得sum(L , R) * MIN(L ,R) 最大,只需维护每个点的最大延伸区间,可以用栈边走变维护,或者直接保留成数组递推。#include #include #include #include #include using namespace s原创 2016-04-10 09:43:25 · 448 阅读 · 0 评论 -
山东省第七届省赛L题
#include #include #include #include #include using namespace std;typedef long long ll;#define rep(i , n) for(int i = 0 ; i < (int)n ; i++)#define rep1(i , x, y) for(int i = (int)x; i<=(int)y;原创 2016-06-09 22:20:49 · 731 阅读 · 0 评论 -
Codeforces 982D
此题从从一个特定角度想,就很好做,而直接枚举可行解,复杂度太高。 可以想到,将所有的长度从大到小排序,逐个放回原来所在位置,任何一个可行解,必然满足是比可行解大或者等于可行解的值是排序后序列的前缀,这样,逐个放回,统计剩余区间的长度和个数即可。这是自己笨拙的代码#include<cstdio>#include<iostream>#include<string>...原创 2018-05-21 09:30:15 · 390 阅读 · 0 评论 -
HDU 5411(矩阵快速幂)
本题目意思:给定n个点,给定一个n*n的转移矩阵,要求求出所有长度不大于M的序列个数,(M分析:记 d[i][j] 生成至多长度为i的且以j开头的所有串的个数,d[i+1][j] = sum( d[ i][ k ] )+1( 其中 j->k可达)那么记矩阵tran (n+1,n+1)= [ 0 A, 0原创 2015-08-21 08:38:39 · 1124 阅读 · 0 评论 -
HDU 5414
题意:给定串 S1,S2,要求判断S1是不是可以通过在原串任意字符后插入与该字符不同的字符得到S2。若没有不同这个条件,直接判断S1是不是S2的子串即可。若s1 是s2 的子串,我们可以对比他们的第一个字母所延伸的长度。若s1[0] != s2[0 ] 一定不可以。如aaaabb..... aaaaaab...这样的是不可以的,这意味着必须在一些a的后面插入a才能得到S原创 2015-08-21 07:49:11 · 651 阅读 · 0 评论 -
UVA - 10755 Garbage Heap(最大子矩阵)
#include #include #include #include #include #include #include using namespace std;#define rep(i,b,c) for(int (i)=(b); (i)<=(c) ; (++i) )const int maxn = 22;long long maze[maxn][maxn][maxn]原创 2014-11-11 16:12:04 · 497 阅读 · 0 评论 -
SPOJ 1023. Arranging Dominoes
1023. Arranging DominoesProblem code: ADOMINODominoes have long entertained both game enthusiasts and programmers for quite some time. Many games can be played with dominoes, i原创 2014-08-03 19:32:35 · 771 阅读 · 0 评论 -
UVA - 1330
#include #include #include #include //using namespace std;const int maxn = 1005;int max(int a, int b){ return a>b ? a:b; }int min(int a, int b){ return a<b ? a:b; }int up[maxn][maxn],left[m原创 2014-11-06 14:56:19 · 504 阅读 · 0 评论 -
UVA - 12545 (细心)
#include #include #include #include #include #include #include using namespace std;const int maxn = 210;char str[maxn],src[maxn];int main(){ int T; scanf("%d",&T); for(int kase原创 2014-11-07 14:43:31 · 808 阅读 · 0 评论 -
UVA - 11300(问题转换)
首先,定义 xi 为 i 给 i-1多少个硬币;记平均数为M可得到n-1个方程 A1(原来i有的硬币)- x1 + x2 = M; A2 - x2 + x3 = M; ..... 特别说明第n个方程可由前n-1个推出,所以去掉;将式子变形 x2 = x1 + M - A1; x3 = x1 + 2*M - A1 - A2; ..... 记A1 - M 为 c1 ; A1原创 2014-12-29 17:47:12 · 551 阅读 · 0 评论 -
UVA - 10795(新汉诺塔问题)
要从初始状态移动到目标状态,需要建立参考状态,然后根据移动的可逆性,只需将两个状态移动到参考状态的和加起来即可;首先,最大编号在两个状态中位置相同,则没必要移动,移动反而不够成最优解,若最优解中需移动该盘子,那么在最优解中去掉该盘子来回移动的两部依然构成解,与最优解的性质矛盾;所以只需找最大的那个不同位置的盘子,才是必须需要移动的,记为k假设将k从1移动到2,那么必须将前k-1个盘子移动到原创 2014-12-30 08:02:40 · 874 阅读 · 0 评论 -
UVA - 12124 Assemble(经典二分函数问题)
二分求最大满足条件的quality#include #include #include #include #include #include #include using namespace std;typedef long long LL;const int maxn = 1010;int id,n,m,b;map vis;int ID(char* str){原创 2014-12-30 08:34:51 · 526 阅读 · 0 评论 -
UVA - 12097 (pie 二分求解逼近值)
一开始开到y-x >1e-9直接超时;看来不可过度的去二分啊;#include #include #include #include #include #include #include using namespace std;typedef long long LL;const double P = acos(-1.0);const int maxn = 10010;原创 2014-12-30 10:29:34 · 541 阅读 · 0 评论 -
UVA - 1335(Beijing Guards 思路题目)
分奇偶讨论;#include #include #include #include #include #include #include using namespace std;typedef long long LL;const int maxn = 100000+10;int n,a[maxn],le[maxn],ri[maxn];int Judge(int x){原创 2014-12-30 11:43:02 · 524 阅读 · 0 评论 -
UVA - 311 Pockets(贪心策略)
总之从大到小填充,贪心放置;6,5,4,3都要自己独立的礼盒;剩下的空隙尽量填充2,然后全部塞入1#include #include #include #include #include using namespace std;const int u[4] = {0,5,3,1};int a[7];int main(){ while(scanf("%d",&a[1原创 2014-12-31 14:41:05 · 538 阅读 · 0 评论 -
HDU 4252(单调栈)
#include #include #include #include #include using namespace std;typedef long long LL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1stack Q;int n;int main(){ int kase=1; while(s原创 2015-04-18 18:54:12 · 329 阅读 · 0 评论 -
HDU 5401(计数dp)
题意描述:原先设定第0颗树只有一个节点0,现在要生成第i颗数,选 ai, bi, (ai < i, bi< i) 中两个节点(ci , di)相连接,构成一个新的树,且ai中节点的编号不变, bi中的所有节点编号都要在原来的基础上+ai树的大小,这样保证编号连续,对于每颗树T而言 ,,F(T)=∑n−1i=0∑n−1j=i+1d(vi,vj)(d(vi,vj)即任意两点之间距离总和。原创 2015-08-30 12:02:00 · 927 阅读 · 0 评论 -
HDU 5416(思路题目)
题意:给定一棵树,要求统计所有的F(U,V),使得路径上的权值异或之和为一个查询值, 魅族数据查询数至多为10解析:从 f[u->v] = f(u->1 )^(1->v);这样先预处理f(1->i)然后统计即可,注意统计的时候 cnt数组要开到 (1因为路径权值不超过1e5,至多为17位二进制数。异或最大值不超过(1#include#include#include#inc原创 2015-08-21 09:51:35 · 382 阅读 · 0 评论 -
HDU 5482(思路题目)
对于一个串来说我们粗略的看,它有多少个子串只和它各个位置的相等关系有关,所以我们没必要在乎字符集有多大,只需要枚举n的所有划分,处理出cnt[i][j][k]cnt[i][j][k]cnt[i][j][k]表示长度为iii的串有jjj个不同的字符且有kkk个子串的方案,每一次枚举的时候要么后面加一个已经出现过的字符,要么加一个新的字符。这样搜索状态总数只有BellnBell_nBelln个,原创 2015-09-27 10:15:24 · 506 阅读 · 0 评论 -
codeforces 982D (第二种实现方式)
改题目解析在上一篇点击打开链接这里使用了map来实现同样的过程,做上下界的查找,map内直接存的就是一个个对应的区间,对于所有的<key,value>对,map默认按key值升序排序,这样,可以将区间以<l , r>的形式存储,会以l升序排序。对于lower_bound 和 uppper_bound进行说明: // lower_bound 第一个大于或者等于查找值的...原创 2018-05-21 10:43:25 · 366 阅读 · 0 评论