20180629考试总结

一.区间

题目大意:给定一个数列,长度为n<=8000,有q组询问,q<500000,每次询问数x,y在数列的所有子序列中出现次数相同的子序列有多少个。

分析:把x和y的出现地点的下标拿出来然后排序,对每次询问只需要从前往后扫一遍就行了

当时没想到,就直接写了个30分的暴力DP


二.排列

题目大意:有一个1-n的排列,a[i]表示第i个位置前面比第i个数大的数的个数,p[i]表示位置i及i前面的所有a值之和,现给定数组p和排列的长度n,还原此排列。n<100000。

分析:a[i]=p[i]-p[i-1] a[1]=0; 然后从后往前扫,a[i]表示有a[i]个数比它小,因为排列中的元素是给定的,所以有n-a[i]-1个数比它大,则这个数为n-a[i],用树状数组和二分维护。

没有维护所以少了一半的分


三.边的处理

题目大意:无向图有n个点m条边,m条边从1到m编号,一条边有a,b两个费用,走这条边需要a的费用,如果可以走这条边但是不走或是不能走这条边需要b的费用,多组询问,询问从u开始,走到v,且只按顺序处理编号为给定的l到r的边,即上述费用只按顺序在编号l到r的边上产生。

分析:离线,考虑分治。 

假设当前在处理分治区间[L,R],设 mid=(L+R)/2,处理询问区间跨过了 mid 的询问,

可以用DP得到lef[i][x][y]表示从x出发,处理了从i到mid的边之后到达y的最小代价,

以及 rig[i][x][y]表示从 x 出发,处理了从 mid+1 到 i 的边之后到达 y 的最小代价,那么

查询的时候只要枚举一下中间经过的点就好了。

时间不够所以没做

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值