摘要:
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1356【题意】: 给一张无向图 一个人从某一点开始走 判断是否 有一时刻他可以在图里的任意一点上【思路】:只要看图中是否有奇圈 有的话就可以 没有就不行 ()#include#include#include#include#include#includeusing namespace std;vector g[100002];int vis[100002],ans;void find1(int u,int x,int f){ if(vis[u]!=-1) { if(vi... 阅读全文
摘要:
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1364【题意】:把n分为 均分为m 段 每段n/m个数字 每段可以选一个最大的数 求这些数相加起来>k 的最小的m一开始的 rmq+二分的想法是错误的 因为并不是分的越多的段数 得到的 结果就会越大例如 1 2 9 9 2 2 分成两份得到的结果比分成三段的更大 所以分成的段数与结果之间不存在单调性 不能用二分不能用二分只能 将段数由小到大枚举 但是这里有一个 技巧 可以很大的缩短时间:当分成i段得到的段长L1 与 之前分成 i-1段得到的段长相同 那就只要把前一次的结果再加上这一次 第i 阅读全文
摘要:
(a - b) mod p = ((a mod p - b mod p) + p) mod p(a / b) mod p = ((a mod p) * (b^(-1) mod p)) mod p相对比较简易的小数取余方法:用被除数减去除数,然后用这个结果再减去除数,一直减,直到获得的结果小于除数,此时的结果即为取余后的结果public static void main(String args[]){double x = 64.5;double y = 6.0; System.out.println(x/y + " " + x%y);}显示:10.75,4.5分解下取余部分: 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4570【题意】: 给出一个长度为n的数列,将其分成若干段,要求最小,其中ai是每一段数列的第一项,bi是每一段的长度,l为将数列分成l段。 题意是百度的 为什么没有人 说 分为同一段的数 要 2 #include 3 #include 4 5 #include 6 #define INF 0x1f1f1f1f 7 using namespace std; 8 9 __int64 d[102],a[102],b[102];10 11 __int64 min(__int64 a,__int64 b... 阅读全文
摘要:
【题意】:给出一棵树, 每条边有一个权值 求离每个节点最远的点的权值和看这篇题解学会的 http://tech.ddvip.com/2013-09/1379006959202653.html树形dp也蛮有趣的 ^ ^ 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 struct node{int v;int w;}; 9 10 vectorno[10002]; 11 __int64 ff[10002][2]; 12 bool vis[10002]; 1... 阅读全文
摘要:
1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 vector g[6002]; 9 int w[6002],d[6002][2];10 11 __int64 dfs(int i,int j,int f)12 {13 if(d[i][j]!=-1) // 注意要记录 不然会超时14 {15 return d[i][j];16 }17 __int64 ans=0; //点i 不在 一定合法18 19 ... 阅读全文
摘要:
#include #include#include #includeusing namespace std;int sg[10002],a[10002];bool vis[10002];void getsg(int k){ sg[0]=0; for(int i=1;i<=10000;i++) { memset(vis,false,sizeof(vis)); for(int j=0;a[j]<=i&&j<k;j++) vis[sg[i-a[j]]]=true; for(int j=0;j<=10000;j++) ... 阅读全文
摘要:
1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[1002][26]; 6 int n,k; 7 int main() 8 { 9 while(scanf("%d%d",&n,&k)>0)10 {11 memset(dp,0,sizeof(dp));12 //dp[1][25]=1;13 dp[0][25]=1;14 for(int i=1; i=0; m--)18 {19 20 ... 阅读全文
摘要:
问题描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费 阅读全文
摘要:
问题描述小明这些天一直在思考这样一个奇怪而有趣的问题:在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。输入格式第一行是一个正整数N (1 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 int a[50005]; 9 10 int ma.. 阅读全文