摘要:转:题意:给定一个二维平面,其中x取值为1-N,y取值为1-M,现给定K个点,问至少包括K个点中的一个的满足要求的共有多少中取值情况。也就是说K个点中至少一个点落在所给定的区间内。解法:正面求解,由于点只有1000个,因此直接暴力离散化之后的x轴坐标,对于y轴则可以通过增加一个一个加入点,使用一个set来维护纵轴有多少种不同的取法。代码如下;#include #include #include #include #include #include #include #include #include #define LL long long
#define mod 1000...
阅读全文
摘要:裸的2-SAT,详见刘汝佳训练指南P-323不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two balloons after rounded.模版题,代码如下:#include #include #include #include #include #include #include #include #include #include #define LL long long
#define eps 1e-5
#define M 205
#define mod 100...
阅读全文
摘要:题目要求找到至少存在m个连续被染成红色的情况,相对应的,我们求至多有m-1个连续的被染成红色的情况数目,然后用总的数目将其减去是更容易的做法。用dp来找满足条件的情况数目,,状态:dp[i][0]和dp[i][1]分别表示第i个柱子被染成红色和蓝色的情况数目。状态转移:dp[i][0] = dp[i-1][0]+dp[i][1]-dp[i-m][1]; dp[i][1] = dp[i-1][0]+dp[i][1];代码如下:#include #include #include #include #include #include #include #includ...
阅读全文
摘要:这道题是有规律的博弈题目,,,所以我们只需要找出规律来就ok了牛人用sg函数暴力找规律,菜鸟手工模拟以求规律。。。【牢骚】if(m>=2){if(n
#include #include #include #include #include #include #include #include #include #define LL long long
#define eps 1e-8
#define N 15
#define K 15 using namespace std; int main ()
{ int t, k = 0; scanf("%d",...
阅读全文
摘要:思路来自于:http://www.cnblogs.com/wuyiqi/archive/2011/11/06/2238530.html枚举两个多边形的两个点组成的直线,判断能与几个多边形相交因为最佳的直线肯定可以经过某两个点(可以平移到顶点处),所以暴力枚举两个点就好了如果有模版的话,写代码就快多了。代码如下:#include #include #include #include #include #include #include #include #include #include #define LL long long
#define eps 1e-8
#defi...
阅读全文
摘要:这道题比赛中没做出来,赛后搞了好久才出来的,严重暴露的我薄弱的数学功底,这道题要推公式的,,,有类似于1*a+2*a^2+3*a^3+...+n*a^n的数列求和。最后画了一张纸才把最后的结果推出来。::(x*M^x)/N.而且通过这道题我发现有些数学函数还不如直接循环来的快,例如这道题中求x的值的时候。【我在此收回前面的话,昨天是oj的问题,今天我又交了一遍log的代码,耗时变成了0ms了。。。OMG】方法一:int x = int(log(n)/log(m)+0.5); if(_pow(m,x)=n) break;耗时0ms代码如下:#include #include...
阅读全文
摘要:好文章转自:http://blog.tianya.cn/blogger/post_show.asp?BlogID=287129&PostID=3668453scanf详解 scanf 原型: # include int scanf( const char *format, ... ); 函数 scanf() 是从标准输入流 stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。scanf() 是 printf() 的补函数。 在 C99 中,format 用 restrict 修饰。 format 指向的控制串由以下三类字符组成: ...
阅读全文
摘要:搞死人的题目,,,就是在n*n的方格中找路径长度为L的回路。开始的思路值适合n为偶数的情况,而忽视了奇数的case,所以wa了一次。然后找奇数case的策略,代码从70多行变成了100多,然后改了又改,自己在下面测了好久,交上去1y,但心里却无成就感。这样的一个题目,提不上什么思路,可以算作是乱搞的,下次比赛中再次碰到类似甚至同样的题目,我并不能保证能写出来。代码如下:#include #include #include #include #include #include #include #include #include #define M 1005 using n...
阅读全文
摘要:水题一个,代码挫了一下:题意不好理解。你去一个洞窟内探险,洞窟内有许多宝石,但都有魔法守护,你需要用魔法将它们打下来。每个宝石都有自己的防御等级,当你的魔法超过它的防御等级时它就会被你打下来。但是,当它被你打下来的时候,它会反弹你的魔法。如果反弹的魔法过强,你就会被自己的魔法杀死。很不幸的是,你的魔法是群体性的,你不能选择攻击谁,只要防御等级低于你魔法水平的宝石都会被你打下来。并且每个都会反弹你的魔法。你可以假设你的魔法水平无限大,但你躲避反弹的魔法的能力却并不是很强。输入:第一行两个数,分别是:N,宝石总数。P:你躲避反弹魔法的能力。(只要达到这个数你就会死)第二行N个数,每个宝石的防御等级
阅读全文
摘要:搞这个题差不多是从比赛开始到结束。从自信慢慢的看题一直到wrong到死。这个题目可以说成是思路题,以为我们只要明白一点,这道题就成了纯暴力的水题,那就是当操作数不足栈中数字数目的时候,我们就没有必要复制了。注意数组要开足,如果是一路复制的话,2^20就可以到10^6次方级了,在cur
#include #include #include #include #include #include #include #include #define M 1000005 using namespace std; int st[2*M]; int main ()
{ int...
阅读全文
摘要:搜索的好题,,,,摘自题解:题意; 给一个数n,求n 的最小的倍数,满足它的10进制 表示中每一位不是0就是1。思路: 用f(x)表示被n整除取模后的最小数,那么从0开始,每次往后添0或者1,如果得到的数与某个已经得到的数同余,就扔掉,不然就加入队列中继续搜。。。时间复杂度O(N).代码如下:#include #include #include #include #include using namespace std;
#define M 20005
struct Node{ int m; bool flag;
};
bool vis[M];
Node a[M];
...
阅读全文
摘要:定理详见维基百科。。。。http://zh.wikipedia.org/wiki/%E4%BA%94%E9%82%8A%E5%BD%A2%E6%95%B8%E5%AE%9A%E7%90%86代码如下:#include #include #include #define LL long long
#define INF 0x7fffffff
#define MOD 1000000007
#define M 100005 using namespace std; int p[M];
LL ans[M];
void presolve()
{ int c = 0; for(i...
阅读全文
摘要:摘自题解:若没有边权,则对点权从大到小排序即可。。考虑边,将边权拆成两半加到它所关联的两个点的点权中即可。。。因为当两个人分别选择不同的点时,这一权值将互相抵消。代码如下:#include #include #include #define LL long long
#define INF 0x7fffffff
#define M 100010 using namespace std;
int comp(const double a, const double b) { return a=2; i-=2) ans+=node[i]-node[i-1]; ...
阅读全文
摘要:摘自题解: 题意转化一下就是:给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除。分析:设这列数前i项和为s[i],则一段连续的数的和a[i]+a[i+1]+...+a[j-1]+a[j]=s[j]-s[i-1],所以这段连续的数的和能被m整除的条件就是(s[j]-s[i-1])%m==0,即s[j]%m-s[i-1]%m==0,因此,只需要每一个余数找使s[i]%m等于该余数的最小的i,和s[j]%m等于该余数的最大的j,相减即为最长的连续的数的长度。然后,可以预处理一下,用一数组存下模相同几个前缀和的最小坐标,使得代码优化为O(N)的时间复杂度。代码如下:
阅读全文
摘要:题意:TheBeet正在参加一场越野车大赛。比赛的场地如右图: 共分三块,每一块地面的长宽均为N与M,但地表情况不同,越野车在这段路面上的最高速度也不同。 蓝色线表示TheBeet可能的行车路线。 比赛的要求是要求选手从比赛的场地左上角驾车至右下角。TheBeet想知道如果他在所有路段都以最快速度行驶(不考虑加速阶段),最快能在多少时间内完成比赛。把 横向的边放到X轴上,设第一拐点距起点为x,第二个拐点距第一个拐点的距离为y,则方程很容易的便列出,f(x,y) =sqrt(x*x+M*M)/S1+sqrt(y*y+M*M)/S2+sqrt((N-x-y)*(N-x-y)+M*M)/S3;...
阅读全文
摘要:题意:已知x,y,l,d,要求判断汽车能不能安全通过该转角。思路:三分角度,求解h 的最大值,若max>y的话,则汽车能安全通过,否则便不能安全通过。代码如下:#include #include #include #include #include #include #include #include #include #include #define LL long long
#define LLU unsigned long long
#define INF 0x7fffffff
#define eps 1e-7 const double PI = acos(-1....
阅读全文
摘要:三分第一题,,,,题意:某人在房间内左右走动,要求这个人的影子最大长度是多少。思路:明显的,人在灯下的影子长度是0,这时他如果向前走的话,影子会逐渐变长,到影子投到墙上的时候,由于情况复杂,就不考虑如果变化的了,反正到最后人走到墙的位置的时候,影长度便是人的身高了,所以影长的变化曲线要么是单调递增的【如第一组样例】要么是向上凸的【如第二、三组样例】,所以三分的方法还是比较适合的。。。由于影长从灯下0一直到恰好没投影到墙上的过程是一个单调的过程,我们可以把这段忽略,直接求解,投影到墙上后,影长的变化即可。代码如下:#include #include #include #include #...
阅读全文
摘要:比赛时水过的,现在贴一下正规做法。#include #include #include #include #include #include #include #include #include #include #define LL long long
#define LLU unsigned long long
#define INF 0x7fffffff using namespace std; int main()
{ double ans = -1e30, temp, a, b; int ansk, anskk, k; scanf("...
阅读全文
摘要:摘自刘汝佳:不难想到这样的递推法:令d(i)表示从字符i开始的字符串(即后缀S[i..L])的分解方案数,则d(i)=sum{d(i+len(x))|单词x是S[i..L]的前缀}。 如果先枚举x,再判断它是否为S[i..L]的前缀,时间无法承受(最多可能有4000个单词,判断还需要一定的时间)。可以换一个思路,先把所有单词组织成Trie,然后试着在Trie中“查找”S[i..L]。查找过程中每经过一个单词结点,就找到一个上述状态转移方程中的x,最多只需要比较100次就能能找到所有的x。
代码如下:#include #include #include #include #inclu...
阅读全文
摘要:刚开始的时候虽然也用了哈希,但复杂度是n^n的,所以果断的tle了。搜了一篇题解,顿时,膜拜之意油然而生,虽然复杂度都是n^n的,但是大神的代码果断的优化了。把复杂度从10^8降到了10^7了。同样使用哈希,达到的效果果断的有天差地别呀。。。代码如下:#include #include #include #include #include #include #include #include #include #include #define LL long long
#define LLU unsigned long long
#define INF 0x7ffffff...
阅读全文
摘要:题意:给定一个1到n的排列,输出三元组(x,y,z) (满足条件x
#include #include #include #include #include #include #include #include #include #define LL long long
#define LLU unsigned long long
#define INF 0x7fffffff
#define MOD 100000007 using namespace std; #define lowbit(x) x&-x
#define M 100005
int c[M];
LL su...
阅读全文
摘要:A URAL 1097 B URAL 1066 【已整理】C URAL 1069 【已整理】D URAL 1169 E URAL 1117 【已整理】
阅读全文
摘要:题意:给定一个关系树,a和b之间传递信息,问需要经过多长时间,其中每个人只能想编号临近的人传递信息,有上下关系的两人传递信息不花时间。思路;这个题的题意很不好理解,我在比赛中只能看出这道题是找规律的题目,但是由于题意没有理解清楚,代码交上一直wa。。后来就放弃了。。。两个没有上下关系的人中间隔了几个人,就得花费几天的时间。这里的间隔是指沿树的路径走上去经过的人数。例如从7到8 就经过了6 4。把草图画出,就可以看出其中的规律。代码如下;#include #include #include #include #include #include #include #include ...
阅读全文
摘要:比赛的时候明明知道是二分,却没有写出来。。。用二分法的特征:单调用三分法的特征:只有一个凸点开始的时候我还想对最后一个节点二分,其实没这个必要,因为我有个同学对这道题目推了大半张纸,最后的推出来的式子还是跟第二个点相关,下面说一个比较巧妙的方法,二分第二个点,(这是因为第二个点的高度和最后一个点的高度是正相关的,第二个点的高度如果跟第一个点相同,则第三,四个点的高度会依次增加,如果第二个点的高度小很多,中间某个节点就可能接触到地面,这个很容易想到),最后把所有点的高度全部求出。如果中间有某个点的高度小于0,则第二个点稍微升高一点,如果全部的点都不会接触地面,那么第二个点就稍微降低一点。一直到逼
阅读全文
摘要:给定一个树,每次删除一个编号最小的叶子节点,然后将叶子节点的父亲节点输出,要求根据该序列还原这棵树。思路:找度为0的点,(这样的点不会成为父亲节点,只能是叶子节点)放到优先队列中,模拟删除点的过程即可。(没删除一个点,就对应序列中的一个父亲节点)代码如下:#include #include #include #include using namespace std;
#define M 7505
priority_queue, greater >q;
int n, du[M], a[M], x;
vectorg[M];
int main ()
{ n = 1; whi...
阅读全文
摘要:STL的容器可以分为以下几个大类:一:序列容器, 有vector, list, deque, string.二 : 关联容器, 有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap三: 其他的杂项: stack, queue, valarray, bitsetSTL各个容器的实现:(1) vector内部数据结构:数组。随机访问每个元素,所需要的时间为常量。在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。可动态增加或减少元素,内存管理自动完成
阅读全文
摘要:动态最大连续和。思路:完全参照刘汝佳厚书的思路。几天前,就从书上得到一个思路,却不知怎么实现,于是乎,几天来一直广搜结题报告,结合人家现成的代码,今天写成了代码,又调了半下午的bug,终于ac了。构造一课线段树,其中每个节点维护3个信息,最大连续和(x,y),最大前缀和(pre),最大后缀和(suf),虽然都叫做什么什么和,存的却都是位置标记,1、建树2、若干次查询这道题目没有加入树节点的修改,算是数据结构中的基础题了。思路来自于静态最大连续和的求解,(最大连续和或在[1...m],或在[m+1......n],或在[x...m......y])代码如下:#include #include .
阅读全文
摘要:今天比赛的一道题目,有位同学写的代码比我写的好多了,而且有点贪心的意思,所以就贴了上来,用sum来存前面的正和,如果sum
#define M 100005
#define INF 0x7fffffff
int main ()
{ int t, n, x, start, end, sum, maxx, tt, k = 0; scanf("%d",&t); while(t--) { scanf("%d",&n); start = 1; end = 1; sum = 0; tt = 1; maxx = ...
阅读全文