02 2020 档案
摘要:主席树,大家这么叫的,也不知道为什么? 算法思路: 1.先排序,离散化 2.按排名插入n个版本的线段树 3.没有修改,查询即可 由于维护的是权值的区间和, 因此只要查询版本r和l-1,做差比较即可 1 #include <cstdio> 2 #include <algorithm> 3 using
阅读全文
摘要:1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int vis[305][305]; 6 int trun[8][2]={{1,2},{2,1},{1,-2},{-2,1},{-
阅读全文
摘要:1 #include <cstdio> 2 #include <string> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 typedef long long ll; 7 ll num,k=10,ans;in
阅读全文
摘要:忘了改矩阵的大小居然还有33分,我醉了 1 #include <cstdio> 2 const int N=35; 3 struct Matrix{int a[N][N];}; 4 int n,m; 5 Matrix A,O,I; 6 Matrix Mul(Matrix A,Matrix B){ 7
阅读全文
摘要:Fibonacci数列,快速幂 1 #include <cstdio> 2 struct Matrix{int a[5][5];}; 3 const int N=2,MOD=10007; 4 Matrix A,B,O,I; 5 Matrix Mul(Matrix A,Matrix B){ 6 Mat
阅读全文
摘要:我不理解为什么写dijkska就WA呢? atoi()是个好东西,给你个颜色,自己体会 疑惑!疑惑!疑惑! 1 #include <queue> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int
阅读全文
摘要:1 #include <cstdio> 2 struct Matrix{int a[5][5];}; 3 const int N=2,MOD=1e4; 4 Matrix A,B,O,I; 5 Matrix Mul(Matrix A,Matrix B){ 6 Matrix C=O; 7 for(int
阅读全文
摘要:已知矩阵乘法是n^3的,必然超时 故可以在需要验证的等式AB=C两边同时左乘D 一个1xN的任意的不含0矩阵 设E=DA,F=EB,G=DC,则此时只需验证F=G 当匹配到非法列J时,跳出n^2寻找行I即可 记录一下Ans,C[I,J]的正确值,然后就愉快地AC了 为了偷懒,我使用的矩阵是A~G连续
阅读全文
摘要:构造矩阵 1 #include <cstdio> 2 const int MAXN=100; 3 struct Matrix{int a[MAXN][MAXN];}O,I;int N; 4 void OI(int n){N=n;for(int i=0;i<MAXN;i++)for(int j=0;j
阅读全文
摘要:矩阵快速幂,主要是考构造。另外,swap总是写龊? 为什么?干脆放弃了。唉,我太难了。 思路:操作e和s都很好想,主要是g操作 我们可以额外空出一位,记为1,每次要加1,就对这个额外的1进行计算即可 不妨定义A=[1 0 0 ... 0],此时只要构造一组操作的等效矩阵T就好了 就是添一位使初始矩阵
阅读全文
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef double db; 4 const db eps=1e-9; 5 db a,b,c,x,y; 6 db dis2(db X){ 7 db Y=a*X*X+b*X+c; 8 ret
阅读全文
摘要:将军饮马问题的升级版 二维平面中要从A到D,给出两条线段AB,CD,分别在线段AB,CD,以及空白处的速度为P,Q,R 求最少用时 由于最优位置满足“凸性”,且两条线段可以等价,所以可以采取三分答案迭代的写法 值得注意的一点:求两点距离时开方运算会损失一部分精度,一种玄学的方法是在开方前用一个eps
阅读全文
摘要:真的打起比赛来,连个贪心都写不好,呜呜呜。 1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[5],t,ans; 4 void IF(int&a){if(a)ans++,a--;} 5 void IF(int&a,int&b){if(
阅读全文
摘要:1 #include <cstdio> 2 typedef long long ll; 3 int quick_pow(ll a,ll b,ll mod){ 4 ll ans=1; 5 for(;b;a=(a*a)%mod,b>>=1)if(b&1)ans=(ans*a)%mod; 6 return
阅读全文
摘要:1 #include <cstdio> 2 const int M=150010,N=30010; 3 struct edge{int v,w,next;}e[M];int head[N],cnt; 4 void add(int u,int v,int w){e[++cnt].v=v,e[cnt].
阅读全文
摘要:枚举子集,要求子集的min+max<=k,求子集个数,答案对1000000007取模 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=100010,MOD=1000000007; 4 typedef long lo
阅读全文
摘要:分析:https://www.bilibili.com/read/cv4777102 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int MAXN=1e5+10; 5 struct node{in
阅读全文
摘要:题意就是,找出最长合法子括号序列 容易想到设f[l][r]为l~r的最长合法子括号序列的长度 然后从短的状态往长的状态枚举,不断更新答案就可以了 1 //#include<bits/stdc++.h> 2 #include <cstdio> 3 #include <cstring> 4 #inclu
阅读全文
摘要:每次只能从取集合S中个数的物品,其他和普通Nim游戏相同 预处理出每种物品堆的sg值,然后直接xor一下,xor-sum>0即必胜 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <
阅读全文
摘要:题目把Nim游戏为什么可以取异或和讲解得十分清楚,建议多读几次,理解一下 再一个,可以把每次异或视为一次取数,因此(k[i]^sg)<k[i]即为一种可行操作 /* Nim is a 2-player game featuring several piles of stones. Players a
阅读全文
摘要:1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstri
阅读全文
摘要:1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstri
阅读全文
摘要://(ak,bk)=([k*(1+sqrt(5))/2],[k*(1+sqrt(5))/2]+k)=(ak,ak+k) 1 #include <cstdio> 2 double sqrt5=2.2360679774997896964091736687313; 3 int main(){ 4 for(
阅读全文
摘要:1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstri
阅读全文
摘要:假装自己打比赛嘿嘿嘿 1 #include <bits/stdc++.h> 2 using namespace std; 3 int t,n,d,a[100010]; 4 int main(){ 5 for(cin>>t;t--;){ 6 cin>>n>>d; 7 for(int i=1;i<=n;
阅读全文
摘要:POJ 2234 Matches Game HOJ 4388 Stone Game II POJ 2975 Nim HOJ 1367 A Stone Game POJ 2505 A multiplication game ZJU 3057 beans game POJ 1067 取石子游戏 POJ
阅读全文
摘要:开O2,开O2,开O2 重要的事情说三遍 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdl
阅读全文
摘要:直径定义:树上的最长路径,不妨设端点分别为s,t 可以证明(感觉):每个点到其最远点必定为s or t,反之亦然 首先,第一次dfs找到s 然后,第二次dfs以s为根找到t 最后,第三次dfs以t为根 比较二三两次的当前点深度可得到答案 1 #include <set> 2 #include <ma
阅读全文
摘要:1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstri
阅读全文
摘要:int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} #include <set> #include <map> #include <cmath> #include <queue> #include <vector> #include <cstd
阅读全文
摘要:https://github.com/twilightgod/twilight-poj-solution
阅读全文
摘要:错误AC解法,sort+set判重,为考虑异构! 比较坑的一点是读入时scanf一定要一次读6个数,不然会TLE #include <set> #include <map> #include <cmath> #include <queue> #include <vector> #include <c
阅读全文
摘要:不是很懂? 胡乱hash 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #i
阅读全文
摘要:哈个希加挂个链表 一个要背的字符串hash函数ELFhash() mod数取数据最大容量的1.5倍最佳?! 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #i
阅读全文
摘要:由于已经给出字符只有NC种,故可以把子串视为一个NC进制的数,以此构造hash函数就可以了 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <
阅读全文
摘要:哈希,对于每个点哈希一次 哈希的方式:该点到联通分量边界(上下左右)的距离和 然后分别对两个图的n个点按hash值排序,判断是否相等即可 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #includ
阅读全文
摘要:/* 虽然题目没说,但是读入有以下特点 由于,输入是按照按照y递增,如果y相同则x递增的顺序给出的 所以,可以利用入读的时间进行降为处理 */ 于是我们就得到了一个一维的树状数组解法啦 值得一提:坐标从0~32000,而树状数组是从1开始的 于是,我们对所有下标+1,数组开到32002就可以啦! 1
阅读全文
摘要:二维树状数组+叉分 区间修改转化为单点修改 单点查询本来就可视为区间查询 于是本题可解 PS:不知道为什么函数传参数,传的是变量就会出现奇奇怪怪的问题? 所以读入单独写了,还有就是循环的初始化硬是多定义了一组变量,头大啊! 暂且把这种写法视为标准写法吧! #include <set> #includ
阅读全文
摘要:给出0~n-1的一个排列,可以整体移动,求逆序对最小值 把数字num[i]的加入,等价于树状数组的第n-num[i]位加1 因为num[i]是第 (n-1)-num[i]+1=n-num[i]大的数字,产生逆序对,只可能在其之前已经插入了数字,此时直接区间查询即可 #include <set> #i
阅读全文
摘要:树上的单点修改+子树查询 用dfn[u]和num[u]可以把任意子树表示成一段连续区间,此时结合树状数组就好了 #include <set> #include <map> #include <cmath> #include <queue> #include <vector> #include <cs
阅读全文
摘要:单点修改+区间查询=树状数组 空间复杂度O(n) 时间复杂度O(mlogn) 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio>
阅读全文
摘要:时间复杂度O(n) 空间复杂度O(1) 1 #include <cstdio> 2 int main() { 3 int T;scanf("%d",&T); 4 for(int t=1,n,a,l,r,s,L,R,S;t<=T;t++) { 5 scanf("%d",&n),l=L=R=1; 6 f
阅读全文
摘要:1 #include <cstdio> 2 int main(){ 3 for(int a,b;~scanf("%d%d",&a,&b);printf("%d\n",a+b)); 4 return 0; 5 } hdu1000 1 #include <cstdio> 2 int main(){ 3
阅读全文
摘要:题意: 求数字11212312341234512345612345671234567812345678912345678910123456789101112345678910111212345678910111213...的第i位是几? 数位dp打表+二分+暴力模拟 0msAC哦!暴力美学! 1 #
阅读全文
摘要:贪心算法:先排序,再枚举最小带宽(B),每次更新当前最小花费(P)和以及答案(ans) #include <cstdio> #include <algorithm> using namespace std; struct data {int b,p;} a[101][101]; int m[101]
阅读全文
摘要:贪心算法,思路见代码 本来想搜索,结果有O(1)的算法,我佛了 其实每一种6x6的方案可以打表预处理,然后dp or search 但是既然可以贪心何乐而不为呢? 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <que
阅读全文
摘要:无语,15步产生16个数,植树原理啊! 大水题,居然wa了好几次,唉,自己的问题。 略略略,就要封装成结构体,略略略。 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector
阅读全文
摘要:以后刷OJ还是写C++,昂啊! 除非我觉得JAVA更好用
阅读全文
摘要:Java实现会MLE那我也没办法了 1 //辩方总分和控方总分之差简称为“辩控差” 2 //辩方总分和控方总分之和简称为“辩控和” 3 //现用f(j, k)表示,取j 个候选人,使其辩控差为k 的所有方案中,辩控和最大的那个方案 4 //规定,如果没法选j 个人,使其辩控差为k,那么f(j, k)
阅读全文
摘要:多重背包问题的特点是物品数量可以大于1但是有限制。状态定义与01背包一致。 多重背包的解法有多种,复杂度也各不相同。 对于物品数Ci较大的数据,可以采取二进制数进行优化(就是这样,别问就是baidu!) 如何理解多重背包的二进制优化? 使得每种物品的转移次数由O(MxCi)变为O(Mxlog(Ci)
阅读全文