8.14
学习任务
并查集- 堆
- 线段树树状数组基础
- 差分约束
P1631 序列合并
假设此时要把 a[i]+b[j]插入堆,且(i-1)*(j-1)>N,那么这个数一定不会是最后的答案,因为对于1<=s<i,1<=t<j,可组成的和已经超过N个,且都要比a[i]+b[j]小。
每日进阶
//每日一题搜索和动态规划
8.11
8.12
8.13
8.14
并查集堆- 线段树树状数组基础
https://www.cnblogs.com/cjyyb/p/8567674.html - 差分约束
8.15
- 主席树
https://www.luogu.org/blog/chengni5673/tu-lun-di-xiao-ji-qiao-yi-ji-kuo-zhan
- 分层图最短路-学习
http://47.92.113.238/qxiangya/?p=316 神奇的解法- 强连通分量
- 倍增
8.16
- boss1
- 数论
8.17
- boss2
- 博弈论
https://www.luogu.org/blog/wym483739/bo-yi-lun
https://www.luogu.org/blog/wym483739/bo-yi-lun-di-er-pa
8.18
- boss3
- 其他数学问题
https://www.luogu.org/blog/Imakf/solution-p1196
LCT 之银河英雄传说
https://www.cnblogs.com/flashhu/p/9480669.html#4314782
DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
https://www.cnblogs.com/zwfymqz/p/7801080.html
各种算法时空复杂度
https://www.cnblogs.com/zwfymqz/p/8696631.html
bitset
https://www.cnblogs.com/zwfymqz/p/8869956.html#_labelTop
prufer序列笔记
https://www.cnblogs.com/flashhu/p/9568368.html
组合数
https://www.cnblogs.com/flashhu/p/10190408.html
数论
https://www.cnblogs.com/flashhu/p/8437062.html
http://hzwer.com/8053.html#comment-8306
分块
https://www.cnblogs.com/flashhu/p/9743679.html
k短路
https://www.cnblogs.com/flashhu/p/9707295.html
0/1分数规划
https://blog.hookan.top/2018/10/16/kruskal_tree/
kruskal重构树
https://www.cnblogs.com/flashhu/p/9651161.html
有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)
黑匣子
/*#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))
#define N 200010
int m,n;
int a[N];
vector<int>v;
int main(){
freopen("fhq.txt","r",stdin);
rd(m),rd(n);
rep(i,1,m)rd(a[i]);
int l=1,r;
rep(i,1,n){
rd(r);
rep(j,l,r)
v.insert(lower_bound(v.begin(),v.end(),a[j]),a[j]);
l=r+1;
printf("%d\n",v[i-1]);
}
return 0;
}*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))
#define N 200010
int m,n,size,k=1;
int a[N],t[N];
priority_queue<int>dgd;
priority_queue<int,vector<int>,greater<int> >xgd;
int main(){
freopen("fhq.txt","r",stdin);
rd(m),rd(n);
rep(i,1,m)rd(a[i]);
int l=1,r;
rep(i,1,n){
rd(r);
rep(j,l,r){
dgd.push(a[j]);
if(dgd.size()==i)xgd.push(dgd.top()),dgd.pop();//保持dgd只有i-1个数
}
l=r+1;
printf("%d\n",xgd.top());
dgd.push(xgd.top()),xgd.pop();
}
return 0;
}
最小函数值
/*
reference:
translation:
solution:
trigger:
note:
*int 数组最多开3*10^7
record:
交了n发20pts,看了看题解,只要暴力的枚举x:1~100即可ac……
date:
2019.08.14
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dwn(i,a,b) for(int i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))
#define N 10010
int n,m,cnt;
struct data{
int a,b,c;
}e[N];
priority_queue<int,vector<int>,greater<int> >q;
int main(){
freopen("fx.txt","r",stdin);
rd(n),rd(m);
rep(i,1,n){
rd(e[i].a),rd(e[i].b),rd(e[i].c);
}
rep(i,1,n)
rep(j,1,100){
q.push(e[i].a*j*j+e[i].b*j+e[i].c);
}
rep(i,1,m){
printf("%d ",q.top());
q.pop();
}
return 0;
}
鬼谷子的钱袋
/*
reference:
https://www.luogu.org/blog/zyb2624936151/solution-p2320
translation:
solution:
分治思想
如我们要算的是10,必须有1。如果要组成的一个数能由一部分加上另一部分组成就会很好了,10可以分成1~5和6~10,6~10可以由1~5加5组成,所以要选5,接下来只要组成1~5就可以了。就把5除2,一直这样。这很像倍增。所以只要一直这样就可以了。
trigger:
note:
* 除以2的时候(被除数+1)/2
record:
date:
2019.08.14
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))
int n,tot;
int a[40];//1000000000
int main(){
rd(n);
while(n){
a[++tot]=n+1>>1;
n>>=1;
}
printf("%d\n",tot);
dwn(i,tot,1)
printf("%d ",a[i]);
return 0;
}