摘要:/* 用一个递增单调栈维护b[1..i-1] 将bi更新进单调栈,栈顶第二个元素+1 到bi区间的最小值都改成bi,然后求个和就行 */ #include<bits/stdc++.h> using namespace std; #define ll long long #define mod 998
阅读全文
摘要:首先转化为二分答案,在时间t内有两车相撞,等价于有两辆车在t时间内运动的轨迹相交 所以问题变成判断一个平面内是否存在两条相交线段,经典问题 bool operator<(const line &a,const line &b){//set内部的排列方式是左端点+斜率 db x=max(min(a.p
阅读全文
摘要:/* dp[i][j]表示以i结尾,前段最大值j */ #include<bits/stdc++.h> using namespace std; #define N 200005 #define B 30 int n,a[N],dp[N][100]; int main(){ cin>>n; for(
阅读全文
摘要:/* 求sum{C(n/i,k)} */ #include<bits/stdc++.h> using namespace std; #define N 500005 #define mod 998244353 #define ll long long ll n,k,ans; int F[N], Fi
阅读全文
摘要:写吐了。。 /* n=1:直接判定是否相等 n=2:判定能否从(b1,b2)变成(a1,a2) 由于暴力会t,所以改为取模(由取模向前回退操作是可以证明正确性的) 因为b2=a1+a2,所以对于b2来说一定经历了一连串的P操作,这一连串P操作的回退可以直接用b2%b1来代替 n>=3: 暴力模拟从b
阅读全文
摘要:为啥我自己用后缀和来做就有问题。。 感觉没道理错啊 用前缀一次就过了 /* a1,a2,a3...x,x,x,x,... */ #include<bits/stdc++.h> using namespace std; #define ll long long #define N 600005 ll
阅读全文
摘要:RecyclerView内部控件的监听器要写在对应的Adapter中 1.在Adapter里写好要用的回调接口 public interface OnItemClickListener1{ // 进入商品详情监听 public void onItemClick(int pos); } public
阅读全文
摘要:这题思路上不是很难,但是写起来贼复杂(知道为什么没啥人过了) 其实这题难的不是A的面积有多大,而是确定A后怎么填充剩下的矩形 自己写的代码复制粘贴三百多行,贴上题解的得了 题解用拉伸的填充法把代码化简了好多。。 如果不需要最大化矩形A的面积,则可以用如下算法解决该问题。垂直拉伸每个字母,直到碰到另一
阅读全文
摘要:要求构造一棵treap,其结点的(key,priority)要求为(x,sinx),且这棵treap的高度是n,所有x都为整数 根据treap的特性,将问题转化为构造一个pair<x,sinx>序列,要求x递增,sinx也递增 当sinx很小时,sinx=x,即接近线性,那么我们找到一个能满足sin
阅读全文
摘要:建模型的思路值得学习 最原始的思路:直接把单词看成一个点,然后和前后可相连的进行连边,但是本题这样做复杂度太大了 不如将单词抽象成一条边,a-z总共26个字符抽象成点,由单词首字母连向单词尾字母 本题就变成了在图上跑欧拉通路 建完图后只要判一判这个图是不是欧拉图就行,1.考虑是否至多有两个点的度数为
阅读全文
摘要:参考博客 https://blog.csdn.net/zhouzi2018/article/details/81278942?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.none
阅读全文
摘要:对于一个连通图而言,有这样的一个性质:其需要画的笔数=度数为奇数的点数除以2 有了这个结论,用并查集求联通块就行 #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace s
阅读全文
摘要:hdu2894 csdn上的题解感觉一模一样。。都没讲明白结点用几位数来构造。。然后自己瞎画了半天 题目给定的k,要求数字是k位数,那么我们就要用k-1位数来构造结点,剩下一位数用来在边上进行转移(这一步很重要,博客上几乎没讲到) 当k=3 时,我们构造出四个点 00,01,10,11,每个点有两条
阅读全文
摘要:老套路了。 用二分求答案,judge时把每个点转换成矩形,最后看n个矩形是否有交点 #include<bits/stdc++.h> using namespace std; #define N 3005 #define ll long long struct Point{ll x,y;}c; str
阅读全文
摘要:/* 从后往前依次确定,i->j直接连边只会增加一种路线 */ #include<bits/stdc++.h> using namespace std; #define N 505 char s[N][N]; int n,w[N][N],mp[N][N],t[N][N]; int main(){ c
阅读全文
摘要:可以确定分组的方式是贪心的放 先算出前缀和,然后用一个自动机pre[i]表示当和是i个任务时,事实上只能取pre[i]个,因为事物不能断开 直接把1-1e6的答案全算出来,由于调和级数,总复杂度nlogn #include<bits/stdc++.h> using namespace std; #d
阅读全文
摘要:只有三种情况:全是1,有一个2的,只有一个点的 树形dp求最长的1链,或者带一个2的最长1链即可 #include<bits/stdc++.h> #define rep(i,x,y) for(auto i=(x);i<=(y);++i) #define dep(i,x,y) for(auto i=(
阅读全文
摘要:三维偏序:对于每个点P(x,y,z), 统计所有P'(x'<=x,y'<=y,z'<=z)的某些信息 动态开点树套树确实比较强大,既能做三维偏序的求最值,又能做三维偏序求和 求最值 题目链接 https://acm.ecnu.edu.cn/contest/273/problem/C/ #includ
阅读全文
摘要:/* 先把点分联通块,做出二分图 二分图一侧染1,3,另一侧染2 分组背包求n2的可行方案 */ #include<bits/stdc++.h> using namespace std; #define N 5005 #define M 100005 int n,m,n1,n2,n3; vector
阅读全文
摘要:用树状数组防止mle 求前k大用二分弄一下前缀和就行 ps:为什么我没打这场cf。。 /* 28*1000*1000b */ #include<bits/stdc++.h> using namespace std; #define N 1000006 int n; int c[N]; void ad
阅读全文
摘要:这么清新脱俗的几何爱了 由于n必定是奇数,所以2*n正多边形一定是可以上下对半分,且上下有一个最高/低的三角形 限制正方形长度的必定是多边形左右宽度和上下高度,当这两个宽度相同时,正方形边长最小 所以二分多边形转过的角度来算即可 纯手算,推下公式就行 #include<bits/stdc++.h>
阅读全文
摘要:发现自己以前的三分模板有问题。。换个标准的! //整数三分 int l = 1,r = 100; while(l < r) { int lmid = l + (r - l) / 3; int rmid = r - (r - l) / 3; lans = f(lmid),rans = f(rmid);
阅读全文
摘要:显然,三元组前两位确定后,第三位最多只有两种情况 答案只有111,112,121,211,122,212,221,123,132,213,231,312,321 分别讨论下存不存在就行 感觉题解的讨论方法不错,自己的写了(复制了)两百多行。。 #include <bits/stdc++.h> #de
阅读全文
摘要:/* 复杂度均摊: 如果M>sqrt(N),这种询问最多sqrt(N)组,直接把所有边扫一遍求联通块即可 如果M<sqrt(N),直接两两枚举点判边,复杂度M^2,总复杂度N/M*M^2=NM */ #include<bits/stdc++.h> using namespace std; #defi
阅读全文
摘要:经典题经典折磨。。 #include<bits/stdc++.h> using namespace std; #define N 200005 #define mod 1000000007 #define ll long long ll n,a[N]; int L[N],R[N]; void pre
阅读全文
摘要:题目明明写的是线段和圆。。实际上是直线和圆,白白讨论了很多情况。。 这种转化老套路了 #include<bits/stdc++.h> using namespace std; typedef double db; const db eps=1e-8; const db pi=acos(-1); in
阅读全文
摘要:老经典题了 #include<bits/stdc++.h> using namespace std; #define N 105 #define ll long long #define mod 1000000007 ll n,m; char buf[N],s[N]; struct Matrix{
阅读全文
摘要:没啥思维难度。。就是找到一个格子第一次开始变色的时间点f[i][j],再往后这个格子必定会每个时间改变一次颜色 处理出第一次就变颜色的格子,然后用bfs进行扩展,找周围没被扩展过的,且初始颜色不同的格子 #include<bits/stdc++.h> using namespace std; #de
阅读全文
摘要:很有意思的题目,感觉看智商。。 /* 结论:显然只要成功操作一次,就可以把整个数组变成k 如何找到这一次操作? 把<k,=k,>k的数变成0 1 2 显然只要存在11,12,101,102,这种类型,就必定可以操作成功一次 结论:只要存在1,且存在|i-j|<=2 && ai>=1 && aj>=1
阅读全文
摘要:这题dp的状态设计值得学习,由于多状态复杂度会爆炸,所以考虑降维 如果可以用一个维度求出另一个维度的状态(即两个维度的值可以看做是绑定在一起的),那么就可以降下一维了 这题还有点卡常。。评测机快就能跑过去。。 /* 很容易想到用dp[i][j][k]来表示前i棵树,留下j个红果子,k个蓝果子状态下可
阅读全文
摘要:位置的嵌套把我弄晕了。。。总感觉多写了一层 /* 首先要找到一种满足条件的排列方式 给所有段按(左端点,右端点)升序排序,然后分配位置 从左到右扫描位置i,把左端点<i的所有Seg放入优先队列 优先队列每次取出右端点最小的 然后考虑两个段是否可以交换顺序:设段[l,r]被分配的位置是x 那么和他交换
阅读全文
摘要:给定一个数组a,将其变成正负相间 操作1:任选一个子集,里面的数-1或+1,代价c操作2:删掉一个数,代价r 重要结论:如果ab符号冲突,bc符号冲突,那么肯定要删两个(删一个不够,自己模拟一下情况)从小到大枚举a[i],表示abs(a[i])小于a[i]的都可以变成自由点 同时非自由点需要删掉的个
阅读全文
摘要:找了老半天错误。。 高度为i的平衡树至少要有f(i)=f(i-1)+f(i-2)+1个结点从小到达枚举i,如果i被选中,那么其所有祖先p也必被选中考虑i能否加入:如果i在祖先p的左子树里,p的左子树高度更新,连带更新右子树必须要有的高度 如果i在组先p的右子树里,更新右子树高度,只要右子树高度<=左
阅读全文
摘要:可以很简单地发现,如果可以找到这样的两点,那么最优的情况一定是,两个点中至少有一个点在端点上。 对于每一个斜率k,将第i个节点减去k*i,形成新的图。在新的图上斜率大于等于0就是符合条件的。 我们可以枚举右端点。对于同一个右端点,如果点a比点b更靠近右端点并且点a不小于点b,那么点a就不需要考虑了,
阅读全文
摘要:C #include<bits/stdc++.h> using namespace std; const int MAX_N=4010; int n; long long d[MAX_N],p[MAX_N],v[MAX_N]; int cure[MAX_N]; int main() { freope
阅读全文
摘要:ps:因为codeforces新的题都刷的差不多了,比赛也不是天天有,所以打算上leetcode补点知识,题单里会贴一些比较有意思(比较有技巧性)的题 难度大概在mid-hard(其实大部分是hard..) 缺失的第一个正数(类似于求数组的mex):将数组本身看成哈希表 class Solution
阅读全文
摘要:/* 对于每个bi,当bi从x-1提升到x时,对答案的贡献是 ai-3x^2+3x-1, x>=1,函数递减 即bi越大时,bi+1所获得的增量收益就越低 所以有暴力的解法就是每次找到当前+1后增量最大的那个bi,给其+1 考虑二分这个增量delta,对每个bi,二分找到x,当bi从x-1增加到x时
阅读全文
摘要:/* u<v,那么u->v连边,形成一个DAG 如果u选择的是全称量词,那么所有u出发可达的点v,显然有u<v,所以v必须是存在量词 所有可以到达u的点v,显然有u>v,所以v必须是存在量词 由于必须从左到右进行,所以如果a[i]是存在量词,那么a[i]可达的a[i+k],可达a[i]的a[i+k]
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; #define N 2005 char s[N][N]; int n,m,vis[N][N],ans,f1[N],f2[N]; void dfs(int i,int j){ vis[i][j]=1; if(i+
阅读全文
摘要:做的我要吐了。。留着吧以后再看看 /* 两两枚举起始的点,然后按题意模拟寻找下去,为了加速,预处理nxt[i][j]表示直线p[i]->p[j]旋转时,下一个碰到点的下标 */ #include <iostream> #include <algorithm> #include <vector> #i
阅读全文
摘要:这题的投影求交解法很新奇 /* 把脉冲i往后推ti个单位,然后将其投影在y=x上 把所有投影点按x坐标排序,遇到垂直脉冲投影的起点,cntv++,遇到垂直脉冲投影的终点,cntv-- 遇到水平脉冲投影的起点,ans+=cntv 垂直脉冲的贡献同理 */ #include<bits/stdc++.h>
阅读全文
摘要:两篇讲的比较清楚的博客(感觉比官方题解讲的清楚些) https://blog.csdn.net/The___Flash/article/details/105931836 https://blog.csdn.net/monochrome00/article/details/105921913/ 思路
阅读全文
摘要:这题的思路很好 首先不难发现,在特定的角度范围内,所求值的函数是线性的,这暗示了最大值必定在 等于某个给定 的角度 时取得。直接暴力地计算每一个值是显然不可取的,但我们可以换一种思路,预先计算每个给 定角度所能对答案贡献的值的函数的导数变化的角度,然后将这些角度排序,开始遍历,维护到达每个 角度时答
阅读全文
摘要:求最大独立集,一般图的最大独立集复杂度是指数的,要想到怎么构造二分图 由于每个字符串每个字符只出现一次(一开始没看到这个条件。。),所以可以按逆序对奇偶性来给点分组,构造二分图 构造出二分图后,最大独立集=n-最大匹配数 二分图匹配模板(O(nm)复杂度) #include <bits/stdc++
阅读全文
摘要:/* 这个构造思路为啥想不到呢。。显然对于一组来说,k+x和x的结果对答案是一样的 枚举完整的k的个数 n/k-m<=i<=n/k 剩下的平均分 */ #include<bits/stdc++.h> using namespace std; #define ll long long ll n,m,k
阅读全文
摘要:理解成图上对应关系就好想得多 如果s[i][j]=‘0’,那么从i向j连一条边,最后形成的图必定是完全图 当右边有t人时,右边输给左边的总场数为sum(out(i))-t*(t-1)/2, 即右边到左边的边总数=右边的点出度和-右边点自己和自己连的边 所以要让k最小,只要给出度排个序即可 #incl
阅读全文
摘要:/* 离线读入所有值后离散化 题意要求的是,sum{ ai*2^(i-1)*aj*2^(n-j) } 分析这个式子,考虑进行分治 区间[l,r]的 sum{ ai*2^(i-l)*aj*2^(r-j) } 可以将式子分成 ai*2^(i-l) 和 aj*2^(r-j)两部分看, 线段树维护四个值,s
阅读全文
摘要:/* n,m,s,d 有n瓶新水放入s个柜子,每个柜子容量是d,每个柜子一开始有si瓶旧水 现在随机在柜子里取m瓶水,使每个人都拿到旧水的概率最大化的放新水策略 */ #include<bits/stdc++.h> using namespace std; int n,m,s,d; struct N
阅读全文
摘要:把结论推出来就完事了 #include <bits/stdc++.h> #define maxn 100000005 using namespace std; int dp[maxn]; struct Node{ int l,w,h; bool operator <(const Node &b)co
阅读全文
摘要:这种构造题实在是太耗脑细胞了,看题解又不太甘心。。策略改来改去弄了半天 /* 首先有个结论:每个点至少要用掉的时间=这个点的度数 然后进行构造;设tv为u->v时到v的时间,让v回到u时的时间也是tv,设u有k个子树,那么u只要分配给这k个子树[1,k+1]这些数值即可 再设tu为fa[u]->u的
阅读全文
摘要:昨天刚刚做过类似的题,就是用最短路的松弛方式来维护dp数组 /* 考虑一个二元组(t,i) 表示花费t时间,当前处在绿灯的now=t%g秒,处于结点i now!=0,可以扩展点(t+x,j),且now+x<=g now==0,可以扩展点(t+x,j),且x<=g y用一个优先队列维护这个二元组 */
阅读全文
摘要:把情况考虑清楚,分类讨论不太复杂 第一种情况:1+1+1形式 第二种情况:1+2形式 然后枚举每个矩形边长a作为底还是边长b作为底就行 #include<bits/stdc++.h> using namespace std; #define ll long long ll p[4][2]; int
阅读全文
摘要:首先建立好trie,由于问题询问的结点和不超过2e5,可以用虚树解决 bug百出。。调试了一上午 /* 对给定串建立trie,标记上终止结点,d[u]表示结点u的深度 对于每个询问,标记k个串对应的终止结点,然后建立虚树 虚树里维护size[u],fa[u],所有size[u]=L的点都是符合要求的
阅读全文