摘要:
题意:给一个固定长度为L的画板有两个操作:C A B C:区间AB内涂上颜色C。P A B:查询区间AB内颜色种类数。思路:首先显然是要线段树。每个节点有如下参数:l,r 表示区间。int color表示颜色,对于颜色要用位运算。刚开始我的做法是对于每个C操作,就更新区间为AB的节点及其所有子节点。然后TLE了。其实本质原因是没有理解好线段树的精髓。线段树的精髓在于插入(或者更新)和查询都是从根节点开始!所以我们无需每次涂色都更新到叶子节点。具体的解释在代码里。#include<iostream>
using namespace std;
int l,t,o;
const int
阅读全文
摘要:
题意:水晶数g,农民数目p,每个农民的造价c,起始状态金钱数m,游戏结束的秒数d。每秒每个农民可以制造g个水晶。制造农民不需要时间,任何时刻都行。思路:刚开始以为是dp。其实不然。每一秒内都有固定的p[i]、m[i]。i=0,1,2,3......d;任何时刻都可以生产农民。讨论对于第i秒内,可以生产农民数目为:x=0,1,2,3.....xmax.;(xmax=m[i-1]/c);显然是在第i秒初生产最好,这样再第i秒末就可以多出这一秒这个新农民生产的水晶。p[i]是第i秒末的人数,即上一秒的人数加上在这一秒初新造出的农民数,即p[i]=p[i-1]+x;m[i]是第i秒末的钱,m[i]=m
阅读全文
摘要:
题意:给一行数字,只能相邻的两个交换位置。为交换多少次之后能使得这行数字里的每个数的左右数字交换。(reverse)。注意!这行数是不是在一行里,是around the table ,即是一个环。思路:如果这个不是环的话,很显然,就是冒泡排序。1 2 3 4 5冒泡排序成5 4 3 2 1 交换次数是n*(n-1)/2。但是关键点也是蛋疼点就是这个是环:当时做的时候是写了不少数组都算看看,猜出蹊跷点。这里让我想到我一个获得过acm区域赛的金奖老乡给我说有次参加某校赛的时候,本来是没戏了,但是在最后一个小时的时候,猜了三道题的解法,都是自己设定出一些数组来猜想。没想到三道题都ac了。一下次就名次
阅读全文
摘要:
题意:给一个矩阵。从上到下一样,(题目里说的是从下到上,但是其实一样)代码里面就是从上到下考虑。每一行到下一行都只有三个选择,左下,下,右下。所以转移方程为:dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+w[i][j];因为dp还很不熟练。刚看到题目的时候其实第一反应是类似广搜的去模拟一下差不多,反正每一格只会影响下一行的三格。然后写的时候就注意到了其实就是dp。#include<iostream>
#define min(a,b) (a<b?a:b)
using namespace std;
const int N=1
阅读全文
摘要:
题意:很好懂。其实就是大小关系,如果a>b ,b>c 如果再出现个c>a即不合法。思路:floyd传递闭包。floyd的典型应用了。floyd处理之后,如果mat[a][a]=true,即可说明出现了闭环。即不合法。#include<iostream>
using namespace std;
const int N=105;
int n,m;
bool mat[N][N];
void floyd()
{ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ...
阅读全文