02 2020 档案
摘要:这里有个小技巧 对于任意一个数n 与他 gcd 为k 的数 的和为 欧拉函数(n/k)*n*k/2 然后这题就可以在0(nlog)解决 不然你也可以用反演直接搞.... #include<bits/stdc++.h> #define MAXN 3000000 using namespace std;
阅读全文
摘要:题意很好解... 直接exgcd 求最小值,然后对于xa xb区间......求一波x多少可以满足 然后y同理,然后取一波最小值... 就搞定了... 不知道为什么莫名RE #include<bits/stdc++.h> using namespace std; int T,cishu; long
阅读全文
摘要:嘛,输入有点恶心.... 考虑输入完后.... 直接就是割点裸题了.... #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define MAXN 10005 using namespace std
阅读全文
摘要:嘛,首先把图缩点一下之后就很好搞了 考虑一下,什么情况下可以使得加边最少,并且s可以把所有点遍历到? 很显然,对于一个入度不为0的点,一定有前继节点.... 于是乎,我们只要找到不满足有前继节点的节点就好了 详细的过程看代码... #include<bits/stdc++.h> #define MA
阅读全文
摘要:嘛,考虑,图的大小以及强连通分量的性质, 可以轻易推出本题做法 #include<bits/stdc++.h> #define MAXN 500005 using namespace std; int n,m,tot,tot2,dx,tx,maxl; int s,p,ed; int h[MAXN],
阅读全文
摘要:....... 考虑树的直径有两个点,,,,,不用每次都O(n)的去遍历..... 直接求出当前加入的点与直径两点的距离,然后判断一下就好了 ....不知道这个小技巧的话,还挺难想的 #include<bits/stdc++.h> #define MAXN 1000005 using namespa
阅读全文
摘要:嘛,比较恶心.... 关键在于一个贪心思想.... 对 没错 是贪心思想... 直接根据lca的深度排序 然后发现lca深度大的对深度小的影响... 然后就没有了 #include<bits/stdc++.h> #define MAXN 100015 using namespace std; //希
阅读全文
摘要:直接缩点,然后跑一次树的直径就好了....至于跑树的直径简易推导可得,原图的答案其实等价与两个最原点....因为(得到答案)就像水流一样,...一层一层的...然后就结束了 #include<bits/stdc++.h> #define MAXN 200005 using namespace std
阅读全文
摘要:大毒瘤实现题...... #include<bits/stdc++.h> using namespace std; long long n,m,k,all; vector< pair< int , string > >v1,v2; void cal(){ for(int i=0;i<v2.size(
阅读全文
摘要:比较好的题... 考虑一下正着来....十分复杂 不如考虑一下补集转换 有1 全部-全0 考虑怎么可以把全0最小 发现全0最小时,0都是很小...(出现大的化一次增加很多) 于是保险一点,全0区间要尽可能的平均 于是就有了...答案 #include<bits/stdc++.h> using nam
阅读全文
摘要:点分治裸题......好像也可以用树形dp做...... 待更
阅读全文
摘要:嘛,可以发现,,,,,如果要全部走回来 单独一个走一定比多个一起走更优 于是只用考虑一个单独走回来和多个一起走不回来的情况就好了 #include<bits/stdc++.h> #define MAXN 10005 using namespace std; int n,s,k,tot,f[MAXN]
阅读全文
摘要:树形dp经典题 考虑只维护一个最长路会使得所选路径重复 因此可以再维护一个次长路来消除路径重复... 然后这题就结束了 #include<bits/stdc++.h> #define MAXN 10005 using namespace std; int n,tot; int h[MAXN],f[M
阅读全文
摘要:#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define MAXN 105 using namespace std; int n,k,tot; int a[MAXN],h[MAXN]; int
阅读全文
摘要:没有上司的舞会....初一就做过了..... #include<bits/stdc++.h> #define MAXN 6005 using namespace std; int n,tot,ans; int a[MAXN],h[MAXN],in[MAXN],f[MAXN][3]; struct n
阅读全文
摘要:题意让你求每个子树的重心 直接求肯定不行对吧......然后又是在树上 考虑树的重心的性质 1.任意一个子树小于当前树的二分之一 (换句话 一棵树的重心一定是自己或者是重儿子子树上) 2.当两个子树连接的时候新接成的树的重心一定在 两个子树重心的路径上 然后发现.....这个题 可以直接分治 跑 然
阅读全文
摘要:#include<bits/stdc++.h> #define MAXN 200005 using namespace std; int n,m,k,tot,beg,end; int h[MAXN*15],dis[MAXN*15]; bool vis[MAXN*15]; struct node{ i
阅读全文
摘要:#include<bits/stdc++.h> #define MAXN 200005 using namespace std; long long n,tot; long long f[MAXN],cnt[MAXN],ans[MAXN]; struct node{ long long from,t
阅读全文
摘要:#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define INF 9999999999 #define MAXN 305 using namespace std
阅读全文
摘要:第一课: 枚举 A.给你一个棋盘..每次操作可以使一个点自身以及上下左右改变颜色...,(只有两种颜色类似二进制),最少几次操作可以使棋盘同色[编辑] 裸的暴搜枚举, #include<iostream> #include<cstdio> #include<algorithm> using name
阅读全文
摘要:http://codeforces.com/problemset/problem/11/D 题意很明确了 找多少个简单环 首先考虑环怎么找 简单的会想到 用状态压缩dp的方法 F[S][I]已经走过了S集合,且结束在I点的方案树 当出现一个环时,头尾一定相连,此时结束点以及可以表示出来了 考虑如何判
阅读全文
摘要:A.求区间最大子段和 嘛,直接套用平衡树老方法,维护从左往右,从右往左,中间一段的和,然后取个max B.线段树区间开方.... 做法有点巧妙,考虑1开方还是1为1,直接记录一下当前所维护区间是否全为1 还有想搞的话可以懒标记下传 C.线段树维护一个动态数列 支持插入删除 和求中位数.... 嘛,看
阅读全文