随笔分类 - csuoj
摘要:斜率dp#include#include#include#include#define maxn 10005#define maxm 5005using namespace std;int dp[maxn][maxm];int q[maxn*10];int num[maxn];bool check(int j,int tail,int i){ int yk=dp[q[tail-1]][j-1]+num[q[tail-1]+1]*num[q[tail-1]+1]; int yj=dp[q[tail]][j-1]+num[q[tail]+1]*num[q[tail]+1]; in...
阅读全文
摘要:Good Serial Inc.比较简单;#include#include#include#define maxn 1000009#define ll long longusing namespace std;const ll mod=987654321;ll f[maxn]; int main(){ ll n,m; f[1]=1; for(ll i=2;imod)f[i]%=mod; } while(scanf("%lld%lld",&n,&m)&&(n+m)>0) { ll ans=1; if(n0) {...
阅读全文
摘要:两种构造的方式都是正确的;1.#include#include#include#define maxn 60#define ll long longusing namespace std;int x;ll M,n;struct matrix{ int len_x; int len_y; ll data[maxn][maxn]; void ini() { len_x=0; len_y=0; memset(data,0,sizeof data); }};matrix mat_big;ll f[maxn][maxn];ma...
阅读全文
摘要:A题,一个简单的bfs#include#include#include#include#include#define maxn 100009 using namespace std;int vis[maxn];vectorve[maxn];queueq; bool bfs(int s){ int l; vis[s]=1; q.push(s); while(!q.empty()) { int v=q.front(); q.pop(); l=ve[v].size(); for(int i=0; ivis[v]+1...
阅读全文
摘要:这是一个非常神奇的题;感觉像一个模拟搜索;但是竟然可以用网络流来解决;直接粘题解把: 如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于:1.哪些雷之间可以相互“跳” ?2.哪些雷可以从右上角“跳”过去,哪些雷可以“跳”到左下角? 第二个问题很好办,如果地雷的范围能接触到最上或者最右的格子,就可以从右上角跳到这个雷上,如果地雷的范围能接触到最下或者最右的格子,就可以跳到左下角。 第一个问题需要分类讨论一下,如果两个雷在同一水平线或者竖直线上,当两个雷的距离不超过 2*K+1 时可以认为两...
阅读全文
摘要:这个题是计算不同子序列的和;spoj上的那个同名的题是计算不同子序列的个数;其实都差不多;计算不同子序列的个数使用dp的思想;从头往后扫一遍如果当前的元素在以前没有出现过,那么dp[i]=dp[i-1]*2+1;不然找到最右边的这个元素出现的位置j;dp[i]=d[i]*2-dp[j];spoj代码:#include#include#include#define mod 1000000007using namespace std;char s[100005];int pos[100005];int biao[30];int dp[100005];int main(){ int t,n; ...
阅读全文
摘要:这个题我想到要用kmp找到循环节;但是后面的我就不会做了;看到题解才知道是字符串的最小表示;#include#include#include#define maxn 100005using namespace std; char s[maxn*2];int next[maxn]; void kmp(int n){ int j=0; for(int i=2;i0&&s[i]!=s[j+1])j=next[j]; if(s[i]==s[j+1])++j; next[i]=j; }} void MinimumRepresentation(int n){ ...
阅读全文
摘要:因为每个元素都是移动到比它小1位的元素的后面;这样的话以后的一定就可以把他们两个打包;所以用这种方法最多扫一遍就可以了;但是最小的那个数要不要移动呢?如果最小的数后面的数都是升序的,那么一直扫到最小的那个数就行了;不然的话要完整的扫一遍;这个地方我没想清楚,WA的好惨,最后还是看到斌哥的代码才恍然大悟的;#include#include#define maxn 100005using namespace std;int n,t,m;int num[maxn],f[maxn],r[maxn],cnt[maxn]; bool cmp(const int &x,const int &
阅读全文
摘要:这是一个动态规划的题;当初想到要用dp,但是一直想不到状态转移的方程;题解上的原话: 动态规划,设 g[i]表示总结点数为 i 的方案种数,另设 f[i][j]表示各个孩子的总结点数为i,孩子的个数为 j 的方案数,那么有 g[i+1]=f[i][1]+f[i][2]+...+f[i][k],相当于添加一个根节点之后变成完整的树,同时要把有 1 个孩子,2个孩子, ……,k 个孩子的情况都考虑进去。对于 f[i][j]的求解可以用类似背包的方法去做,在求解的时候也会用到 g[1], g[2], ..., g[i]的值,根据前面的那个 g[i+1]的表达式来看,这些 g[]已经在前面算出来了。.
阅读全文
摘要:这个题目其实很简单,可惜当时比赛的时候看到出的人少,以为有trick,就和队友扯淡去了;因为每个数总是被相邻的数影响,所以往前往后扫两遍就行了; 1 #include 2 #include 3 #include 4 #define maxn 100005 5 using namespace std; 6 7 int num[maxn]; 8 int num1[maxn]; 9 int num2[maxn];10 11 int main()12 {13 int t;14 int n,d;15 scanf("%d",&t);16 while(t--)17 ...
阅读全文
摘要:DescriptionCX老湿经常被人黑,被黑得多了,自己也就麻木了。于是经常听到有人黑他,他都会深情地说一句:禽兽啊!一天CX老湿突发奇想,给大家出了一个难题,并且声称谁能够准确地回答出问题才能继续黑他,否则他就要反击了。这个难题就是:给出两个数p和q,接下来q个询问,每个询问给出两个数A和B,请分别求出:一、有多少个有序数对(x,y)满足1 2 #define maxn 10000001 3 #define ll long long 4 using namespace std; 5 int a,b,cnt[maxn]; 6 ll getans(int l,int r) 7 { 8 ...
阅读全文
摘要:Description 殷犇有很多队员。他们都认为自己是最强的,于是,一场比赛开始了~ 于是安叔主办了一场比赛,比赛有n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做出来,并且坑题具有传递性。(a和b一起做会坑、b和c会坑则a和c也会坑) ACM队员们想知道,于是他们想知道在能力范围内,它们最多可以作出多少价值的题目。 聪明的你,告诉我,能帮帮他们吗?Input 第1行两个整数,n,Wmax,k(0 2 #include 3 #include 4 #define maxn 1005 5 using namespace std; 6 7 int f[max..
阅读全文
摘要:Description CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好。现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的数量,每条边的长度。请你求出CX以最短路径赶到教室最多能看到多少学妹。Input 多组输入数据(最多20组),输入到文件结束。 每组数据第一行两个正整数N,M其中N代表点的个数(2 2 #include 3 #include 4 #define maxn 1005 5 #define inf 10000000 6 using namespace std; 7 8 int xuemei[maxn].
阅读全文
摘要:一道字典树异或的题,但是数据比较水,被大家用暴力给干掉了!以前写过一个类似的题,叫做the longest xor in tree;两个差不多吧!好久没写字典树了,复习一下!代码: 1 #include 2 #include 3 #include 4 #define maxn 100010 5 using namespace std; 6 int n,v[maxn],node,next[maxn][2],end[maxn]; 7 8 void add(int cur,int k) 9 {10 memset(next[node],0,sizeof(next[node]));11 ...
阅读全文
摘要:一个卡特兰数的应用;卡特兰数主要有以下几个用途:1.不同的出栈入栈数;2.n个点组成的不同的二叉树的数目;3.凸多边形的三角剖分划分;4.括号化问题;通项公式是:h(n) = C(2n-2,n-1)/n,n=1,2,3,...递推公式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2这个题就是第一种情况。代码: 1 #include 2 #define maxn 10009 3 #define mod 1000000007 4 #define ll long long 5 using namespace std; 6 7 l
阅读全文
摘要:Welcome to CSU OnlineJudgeProblem A: Small changeTime Limit:1 SecMemory Limit:128 MBSubmit:156Solved:91[Submit][Status][Web Board]Description打完网赛,就到了晚饭的时间,但CSU_ACM的同学们都已经没力气出去了,这时CX建议大伙一起点餐吧,因为正是饭点,CX为了不让大家等太久,找了一个承诺20分钟送到超时要打折的外卖。但CX的RP都在网赛上用光了,果然送餐的迟到了,按规定咱们是要少给钱的。可是那些送餐员十分的狡猾,他们没有带零钱,于是乎,原价为N元的饭,
阅读全文
摘要:DescriptionCSU又到了一年中评奖学金的时候了……各大学霸都或多或少地拿到了各种奖学金(你们自己看着办吧)。在这里,评奖学金有个很奇怪的规矩——每个同学得到的奖学金数一定满足相邻的两个非零数位上的数字不相等(奖学金都是非负整数,如果一个同学没有得到奖学金,我们也可以认为学校发给ta的奖学金为0)。然而,如果你问这里的孩子拿了多少奖学金,ta不会直接告诉你拿到了多少奖学金,而会告诉你ta拿到的奖学金数大于某一个整数X。同时为了不产生歧义,ta所说的那个数和ta所拿到的那个奖学金数目之间不会存在任何一个数满足学校发奖的规矩。现在你已经知道了每个同学说的那个整数X,你能确切地说出每个同学得
阅读全文