A
题意:给定一个数组,问有多少 (iin [2,n-1],a[i-1]>a[i]。
做法:模拟。
B
题意:按顺序将 (n) 个数加入集合,维护前 (6) 大的数。对于每个数求出它会将第几个数踢出前 (6) 或者不踢出任何其他数。
做法:模拟。可以使用priority_queue
实现。但是要注意priority_queue
默认大根堆,取相反数即可。
#include
#define int long long
using namespace std;
signed main()
{
int n;cin>>n;
int ans=n服务器托管网;
vector A(n);
vector Ans;
for(int i=0;i>A[i],A[i]*=1e8;
priority_queue > q;
for(int i=0;i6)
{
if(q.top().second==i) ans--,Ans.push_back(0);
else Ans.push_back(q.top().second+1);
q.pop();
}
else Ans.push_back(0);
}
cout
C
题意:给定一棵树,带点权。建立一个无向完全图,边 ((u,v)) 的权值为 (lca(u,v)) 的权值。求一条哈密顿路径,使边权和最大。输出这个边权和。(nleq 300)。
做法:
假设哈密顿路径是有向的,则可以看作每个点对应着一条入边一条出边(除了起点终点)。
维护 (f[x][i]) 表示以 (x) 为根的子树中有 (i) 个点的出边经过根 (x) 时子树的答案。
可以发现如果一条出边向上经过 (x) ,那么它发源于哪个点其实是无关紧要的,这条出边的贡献可能是点 (x) 到点 (1) (根节点)的路径上的某一个点的点权。
同时,(i) 条出边经过根 (x) 也意味着子树 (x) 中包含了 (i) 条路径,也就是有 (i) 个终点, (i) 个起点 。
考虑转移,将 (x) 的一个儿子 (y) 的答案合并到 (x) 的答案:
]
其中枚举 (k) 表示将来自于 (y) 的出边塞到了 (x) 的其他子树中,或者是将来自于其他子树的出边塞到了 (y) 中,这二者都会对答案产生 (val[x]) 的贡献。
关于 (k) 还有一些小细节:
1、(kin [0,2min{i,j}]),假如 (i ,则 (j) 超出的部分在 (i) 中找不到可以链接的位置。
2、(i+j-k>0) ,这是为了防止回路的出现。
另外,由于更新前后的 (f) 不同,所以用 (f’) 表示用子树 (y) 更新后的 (f服务器托管网) 。
最后用 (f[1][1]) 表示答案。
#include
using namespace std;
#define int long long
#define inf 1e18
const int N=305;
vector son[N];
int n,a[N],f[N][N],s[N],siz[N];
void dfs(int x)
{
siz[x]=1;
for(int i=0;i>n;
for(int i=1;i>a[i];
for(int i=2;i>x;
son[x].push_back(i);
}
dfs(1);
cout
D
题意:给定一个 (0sim n-1) 的排列,(m) 次询问 (l,r,k) ,问区间 ([l,r]) 中第 (k) 小的未出现过的数。
做法:
如果不询问区间,那么可以用权值线段树解决。
如果询问的区间都是前缀,那么可以用离线后用权值线段树解决。
如果询问任意区间,那么可以用可持久化权值线段树解决,也就是主席树。
权值线段树可以求第 (k) 小,反一下就可以求未出现自然数第 (k) 小,所以只要把每次加入的数在主席树中新加一列就可以实现区间第 (k) 小。
#include
using namespace std;
templateinline void read(T &x)
{
x=0;int f=0;char ch=getchar();
while(!isdigit(ch)) f=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x>1)
void upd(int l,int r,int pre,int &k,int x,int val)
{
if(!k) k=++tot;
if(l==r) return tree[k]=val,void();
if(mid>=x) rs[k]=rs[pre],upd(l,mid,ls[pre],ls[k],x,val);
else ls[k]=ls[pre],upd(mid+1,r,rs[pre],rs[k],x,val);
tree[k]=tree[ls[k]]+tree[rs[k]];
}
int query(int l,int r,int pre,int k,int rk)
{
if(l==r) return l;
if(mid-l+1-(tree[ls[k]]-tree[ls[pre]])>=rk) return query(l,mid,ls[pre],ls[k],rk);
return query(mid+1,r,rs[pre],rs[k],rk-(mid-l+1-(tree[ls[k]]-tree[ls[pre]])));
}
int main()
{
read(n),read(m);
for(int i=1;in-(r-l+1)) printf("%lldn",rk+(r-l+1)-1);
else printf("%dn",query(1,n,rt[l-1],rt[r],rk)-1);
}
return 0;
}
剩下两题有时间再补(
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: Flink的部署模式:Local模式、Standalone模式、Flink On Yarn模式
Flink常见的部署模式 Flink部署、执行模式 Flink的部署模式 Flink的执行模式 Local本地模式 下载安装 启动、停止Flink 提交测试任务 停止作业 Standalone独立模式 会话模式 单作业模式 应用模式 YARN运行模式 会话模式…