A题 牛牛浇树
使用差分即可。
因为不带操作过程中的查询,而只需要最后的序列,直接用差分即可,记住最后的序列都要加上m,然后局部变量一定要清零。
比赛AC代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回m天后高度为奇数的树的数量
* @param n int整型
* @param m int整型
* @param l int整型vector
* @param r int整型vector
* @return int整型
*/int c[1000005],a[1000005];
int oddnumber(int n, int m, vector<int>& l, vector<int>& r) {
for(int i = 0 ; i < m ; i ++)
c[l[i]] ++ , c[r[i] + 1] --;
for(int i = 1 ; i <= n ; i ++)
a[i] = a[i - 1] + c[i];
int Ans = 0;
for(int i = 1 ; i <= n ; i ++)
if((a[i] + m) % 2 == 1) Ans ++;
return Ans;
}
}; B题 挑选方案问题
不难发现这是一个生成函数裸题。
跟提高组IOI周赛20还是21完全是一模一样的套路。
但是其实如果你追求更快的解题,实际上我们不难发现这是一个规律题:
输入1,输出3。 输入2,输出6。 输入3,输出10 输入4,输出15 输入5,输出21
大胆猜测,得到答案表达式为
记得要强制把 转化为 long long!太坑了。
比赛AC代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @return long长整型
*/
long long wwork(int n) {
return (long long)((n - 1)) * (long long)(n + 4) / 2ll + 3ll;
}
}; C题 大逃离
简单组合数 + 细节屑题。
不难发现,实际上我们可以把问题转化为:
求一个序列中,对于 来说有多少个长度为
的包含
的子序列的最大值为
不难发现做法其实就是把给定的 排序,然后假设从小到大排序后这个数的排名为
,那么满足条件的长度为
的包含
的子序列的个数就是
, 然后除以总的方案数
就是这个数
的“概率”(意义如题目描述)。
对于求 显然不能在线求,于是预处理出阶乘数组然后O(1) 即可求出
还要注意如果比这个数小的数不足 个,那么这个点的概率就是
对于为什么求 也就是说,你必定要选当前这个数
, 同时你要在比
小的数中 (也就是
) 个数里面选择
个数,所以满足条件的长度为
的包含
的子序列的个数就是
.
模意义下的除法需要求乘法逆元。
于是这题就做完了。
比赛AC代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @param k int整型
* @param Point int整型vector
* @return int整型vector
*/
long long Mod = 1000000007;
long long T[300005];
struct Y {
long long data,id,d;
} a[500000];
long long quickpow(long long x,long long y)
{
long long ans = 1 , op = x;
while(y)
{
if(y & 1) ans *= op,ans %= Mod;
op *= op , op %= Mod;
y >>= 1;
}
return ans;
}
map <long long,int > mp;
static bool cmp(Y A,Y B)
{
return A.data < B.data;
}
int C(long long n,long long k)
{
long long A = T[n],Q1 = T[n - k] ,Q2 = T[k];
return (A * quickpow((Q1 * Q2)% Mod,Mod - 2)) % Mod ;
}
int Ans[200005];
vector <int> ans;
vector<int> city(int n, int k, vector<int>& Point) {
long long All = C(n,k);
T[0] = 1ll;
for(int i = 1 ; i <= 2e5 ; i ++) T[i] = T[i - 1] * i , T[i] %= Mod;
for(int i = 0 ; i < n ; i ++) a[i + 1].data = Point[i],a[i + 1].id = i;
sort(a + 1 , a + 1 + n , cmp);
for(int i = 1 ; i <= n ; i ++)
{
if(i < k)
Ans[a[i].id] = 0;
else Ans[a[i].id] = (C(i - 1,k - 1) * quickpow(C(n,k),Mod - 2)) % Mod;
}
for(int i = 1 ; i <= n ; i ++)
ans.push_back(Ans[i - 1]);
return ans;
}
}; 
京公网安备 11010502036488号