2012年8月31日
摘要: 这题用了初等数论的原根和欧拉函数的知识。http://zh.wikipedia.org/wiki/%E5%8E%9F%E6%A0%B9上面介绍的很详细。其他的,没什么难度了。View Code 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int p; 8 while (~scanf("%d",&p)) { 9 int ind(p-1),ans(p-1),temp(1);10 for (int i(2); i<=in 阅读全文
posted @ 2012-08-31 21:00 Dev-T 阅读(244) 评论(0) 推荐(0) 编辑
  2012年8月27日
摘要: 单调队列DP,开始想错了,WA了好多次。后来才发现错在哪了。。我们先枚举子串的结尾,并维护2个队列(单增,单减)。如果2个队列的队头的差别大于k,则较小的队头值的位置肯定不满足要求。那么就通过减小大的,增大小的来是dif更小。直到找到一个合法位置now,那么对于i-1这个子串的结尾,now到i-1这个区间肯定满足要求。所以有ans = max(ans,i-1-now+1)。now初始值为-1,因为有可能最大长度为n。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #d 阅读全文
posted @ 2012-08-27 22:13 Dev-T 阅读(640) 评论(0) 推荐(0) 编辑
摘要: 最近遇到不少DP优化的题,感觉这方面还有些欠缺,现在就多做点这方面的题,练练手。这题是道较为经典的单调队列优化的题,总共有三种状态,买,卖及其他。对于买:dp[i][j] = max(dp[i][j],dp[x][y] - (j-y)*sell) (y<=j && y+买的限制>=j && 0 <= x <= i-w-1)对于卖:dp[i][j] = max(dp[i][j],dp[x][y] + (y-j)*buy) (y >= j && j + 卖的限制 >= y && 0 <= x 阅读全文
posted @ 2012-08-27 16:35 Dev-T 阅读(393) 评论(0) 推荐(0) 编辑
  2012年8月22日
摘要: 这个是约瑟夫环的变形,它要求先除去的必须是K个以后的人。因为k<14,可以直接暴力。View Code 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int f[20]; 5 int res[20]; 6 7 int get_f(int y, int x, int m) 8 { 9 if (x == y)return (m-1)%x;10 return (get_f(y-1,x,m) + m)%y;11 }12 13 void prepare()14 {15 int ind(0); 阅读全文
posted @ 2012-08-22 21:55 Dev-T 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 状态DP#include<iostream>#include<cstdio>#define MAXN 23#define MAXM 1500000using namespace std;int x,y;int bx[MAXN],by[MAXN];int dis[MAXN][MAXN];int dp[MAXM];int way[MAXM];int n;int num;void get_dp(int x){ if (dp[x] != 0)return ; for (int i(0); i<n; ++i) { int k = 1<<i; if (k > 阅读全文
posted @ 2012-08-22 19:13 Dev-T 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 约瑟夫环的二进制解法。当n=2*k,序列1:1,2,3...2*k序列2:1,3,5..2*k-1(k个)序列3:1,2,3...k所以有f(2*k) = 2*f(k) - 1。当n=2*k-1,序列1:1,2,3...2*k-1序列2:3,5,7...2*k-1(k个)序列3:1,2,3...k所以有f(2*k+1) = 2*f(k) + 1。View Code 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long int ll; 5 6 ll get_nu 阅读全文
posted @ 2012-08-22 00:56 Dev-T 阅读(210) 评论(0) 推荐(0) 编辑
  2012年8月21日
摘要: 约瑟夫环问题序列1:0,1,2...m-2,m...n-2,n-1(n-1个)序列2:m,m+1,m+2...n-1,0,1..m-2(n-1个)序列3:0,1,2...n-2,n-1(n-1个)序列4:k,k+1,k+2...k-2(n-2个)先由f[1] = 0;f[i] = (f[i-1]+k)%i递推到n-1,然后f[n] = (f[n-1] + m)%n+1即可View Code 1 #include<iostream> 2 #include<cstdio> 3 #define MAXN 10004 4 using namespace std; 5 int f 阅读全文
posted @ 2012-08-21 22:34 Dev-T 阅读(206) 评论(0) 推荐(0) 编辑
  2012年8月20日
摘要: 中国剩余定理的扩展View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 using namespace std; 5 typedef long long int ll; 6 ll exgcd(ll a, ll b, ll &x, ll &y) 7 { 8 if (b == 0) { 9 x = 1;10 y = 1;11 return a;12 }13 ll d = exgcd(b,a%b,x,y);14 ll t = x;1... 阅读全文
posted @ 2012-08-20 20:30 Dev-T 阅读(192) 评论(0) 推荐(0) 编辑
  2012年8月18日
摘要: 居然在初始化上出错了,害我WA了好多次。。。。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<deque> 4 #include<algorithm> 5 #define MAXN 104 6 #define MAXM 10004 7 #define MIN (1<<31) 8 using namespace std; 9 struct part {10 int prev;11 int p,id;12 void ini(int a, int b, int c)1 阅读全文
posted @ 2012-08-18 15:54 Dev-T 阅读(223) 评论(0) 推荐(0) 编辑
  2012年8月16日
摘要: 读题很重要啊,题目读错了,害我想了一晚上。题目大意:给你n种物品,每种物品有个坐标和价值,你得到某个物品的消耗为|x-y|+v。而且要求你只能从第一种依次往后取,(我开始以为是随机的。。)。所以很容易想到DP转移方程,不过需要优化下,因为dp[i][j] = min{dp[i-1][k] + |pos[i-1][k] - pos[i][k]|} + v[i][j];主要是绝对值很碍事,所以要想办法把绝对值去掉,这里我们就可用到单调队列,一个L和R队列分别存储着从左边(从坐标来说)到这个位置的“值”,已经从右边到这个位置的“值”。View Code 1 #include<iostream& 阅读全文
posted @ 2012-08-16 15:46 Dev-T 阅读(292) 评论(0) 推荐(0) 编辑