2019.10.08考试报告

T1

用一个堆维护最小的是谁,每次加入一个值x时查询堆顶是否小于x,有则买top卖x,之后分为是不是反悔操作判断要不要把pop。

然而好像其他人都push两个来进行反悔操作。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<queue>
 6 #define int long long
 7 using namespace std;
 8 int ans,n;
 9 struct point
10 {
11         int x,y;
12         friend bool operator <(point l,point r)
13         {
14                 return l.x>r.x;
15         }
16 };
17 priority_queue<point>q;
18 signed main()
19 {
20         //freopen("1.in","r",stdin);
21         //freopen("1.out","w",stdout);
22         scanf("%lld",&n);
23         for(int i=1,x;i<=n;i++)
24         {
25                 scanf("%lld",&x);
26                 point tmp={x,0};
27                 if(q.size()&&q.top().x<x)
28                 {
29                         ans+=x-q.top().x;
30                         if(!q.top().y) q.pop();
31                         else
32                         {
33                                 point res=q.top();
34                                 q.pop();
35                                 res.y=0;
36                                 q.push(res);
37                         }
38                         tmp.y=1;
39                 }
40                 q.push(tmp);
41         }
42         printf("%lld",ans);
43         return 0;
44 }

T1

T2

1>

$ S(n,m)=\sum_{i=0}^{m}C_{n}^{i} $

$ S(n,m)=\sum_{i=0}^{m-1}C_{n-1}^{i}+\sum_{i=0}^{m}C_{n-1}^{i} $

$ S(n,m)=S(n-1,m-1)+S(n-1,m) $

$ S(n,m)=2*S(n-1,m)-C_{n-1}^{m} $

2>

$ S(n,m)=S(n,m-1)+C_{n}^{m} $

有了这两个递推式子便可以用莫队O(nsqrt(n))解决啦。

ps:这里的莫队是一维的,可以把n,m看成一条线段。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define int long long
 7 using namespace std;
 8 const int k=490,N=1e5+10,mod=1e9+7;
 9 int ans,n,m,id,q,S,fac[N],inv[N],f[N];
10 struct question{int x,y,id;}a[N];
11 bool comp(question l,question r)
12 {
13         if(l.x/k==r.x/k) return (l.x/k)&1?l.y>r.y:l.y<r.y;
14         return l.x/k<r.x/k;
15 }
16 int read()
17 {
18         int sum,k=1;char s;
19         while(s=getchar(),s<‘0‘||s>‘9‘) if(s==‘-‘) k=-1;sum=s-‘0‘;
20         while(s=getchar(),s>=‘0‘&&s<=‘9‘) sum=sum*10+s-‘0‘;
21         return k*sum;
22 }
23 int qpow(int x,int y,int z)
24 {
25         int sum=1;
26         while(y)
27         {
28                 if(y&1) sum=sum*x%z;
29                 y>>=1;
30                 x=x*x%z;
31         }
32         return sum;
33 }
34 int C(int x,int y)
35 {
36         if(x<y) return 0;
37         return fac[x]*inv[y]%mod*inv[x-y]%mod;
38 }
39 signed main()
40 {
41         //freopen("1.in","r",stdin);
42         //freopen("2.out","w",stdout);
43         id=read(),q=read();
44         for(int i=1;i<=q;i++)
45         {
46                 a[i].x=read(),a[i].y=read(),a[i].id=i;
47                 S=max(S,max(a[i].x,a[i].y));
48         }
49         fac[0]=1;
50         for(int i=1;i<=S;i++) fac[i]=fac[i-1]*i%mod;
51         inv[S]=qpow(fac[S],mod-2,mod);
52         for(int i=S-1;i>-1;i--) inv[i]=inv[i+1]*(i+1)%mod;
53         sort(a+1,a+q+1,comp);
54         n=m=0;ans=1;
55         for(int i=1;i<=q;i++)
56         {
57                 while(n<a[i].x) n++,ans=(ans*2-C(n-1,m)+mod)%mod;
58                 while(n>a[i].x) n--,ans=(ans+C(n,m))%mod*inv[2]%mod;
59                 while(m<a[i].y) m++,ans=(ans+C(n,m))%mod;
60                 while(m>a[i].y) m--,ans=(ans-C(n,m+1)+mod)%mod;
61                 f[a[i].id]=ans;
62         }
63         for(int i=1;i<=q;i++) printf("%lld\n",f[i]);
64         return 0;
65 }

T3

首先有一个重要性质:本题的边点同阶

疯狂模拟即可

原文地址:https://www.cnblogs.com/AthosD/p/11636562.html

时间: 2024-10-08 11:29:57

2019.10.08考试报告的相关文章

2019.10.02考试报告

T1 一般都能想到二分+取前m大正值,但是复杂度无法承受,我们发现要的是sum值,并不需要每个位置的准确值, 所以用可以nth_element把大于第m大的放右边即可.(原来nth还可以这么用). nth_element实现: 每次找一个base,小于base的放右边,大于的放右边 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e8+10; 4 int n,k,a[N]; 5 inline int read()

2019.10.03考试报告

10min:打完T1,为了不滑天下之大稽,打了一个对拍 50min:打完了T2T3的暴力,准备推一推T2. 2h:打完T3的正解和对拍. 3h:T3写了一个O(n*log2(n)*log2(n))的40分算法. 最后调T3的60分线段树调到考试结束也没过对拍. 期望分数:240 实际得分:200 就是因为这一个智障级的错误! 题解: T1 对于每个a[i],O(sqrt(a[i]))预处理出ta的所有约数,用map或hashmap存起来即可. T2 把商品和询问离线并按时间排序,枚举时间,是商品

2019.10.18考试解题报告

总结 期望得分:\(100 + 100 + 10\) 实际得分:\(0 + 20 + 10\) 完美. 今天的考试格外完美,\(T1\)做了*\(2.5h\),最后换来了\(0\)分的好成绩,史无前例,美妙绝伦,我竟然不删调试,做得?好. \(T2\)是个好题,是个好阅读题,\(n\)和\(m\)写反了,样例给的是\(n\)和\(m\)相等的情况,最终完美\(100->20\),我竟然这么粗心,题目竟然没读好,做得?好. \(T3\)没时间了,都耗在\(T1\)上了,可惜\(T1\)还没有分,做

2019.07.12考试报告

这次被山大附中的大佬暴踩了. 0-1.5h 考试期间心态依旧很好,T1打了一个暴力,期望得分60分,T2打了dfs拿35分左右,T3直接输出样例,期望得分0分 1.5~2h 突然发现T1好像能O(q*n*log2(n))搞出来(类似退化版山海经),打了出来过了样例,还是不放心便对拍了一下,但是数据真的好难造啊T_T. 2~3.5h 有点不在状态,有可能是利哥中午的鼾声太魔性了,想了想T2的dp,成功把T2搞到了10分(hx输出样例15分) 考试结束 最终得分50+10+0=60分,拿了rank7

2019.10.28~2019.10.31考试总结

连续几天的考试都没有总结,今天有些时间,总结一下这几场考试的情况. 10.28场 开场先读题,然后推了推T2,发现是水题.出于对期望的恐惧,没有选择研究T3,而是回头肝T1,想了很久,没有思路.打完T2,自己搓了一些数据,过了,回头打了T1的暴搜,再打了一个表,似乎部分分挺多的.再做T3,有点思路,但思路并不清晰,于是打了特殊数据就完了. 期望得分:70+100+20=190 最终得分:30+100+20=150 结果T1是DP,没看出来.唔...原题,地精部落,题果然还是做的太少了,有些人做过

2019.10.03解题报告

总体来说能打的暴力都打了 期望\(100 + 40 + 30 = 170\) 实际\(100 + 40 + 10 = 180\) 数据良心(其实是数据太水惹) T1 第一眼觉得就是要找规律,然后直接找找不出来,所以用暴力搜一下 #include <queue> #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 2011; in

2019.09.21考试报告

T1 可以发现值域的区间最多有klnk个,对于位置分块,每个块都处理出每个k的ans, 复杂度$ O(S*(n/S+klnk)+m*(n/S+S)) $ 当S=sqrt(klnk+n)时复杂度最优 T2 先把x排序 $ f[i][0/1] $代表以i为第一个端点向左/右的方案数,枚举j: 1> $ y[j]<y[i] f[i][0]+=f[j][1]; $ 2> $ y[j]>y[i] $ 枚举$ j<k<i $ && $ y[k]<y[i]  f

2019.11.11 题解报告

目录 2019.11.11 题解报告 答题情况: 各题目分析: 题目解析: 代码实现: 2019.11.11 题解报告 \[N^2\text{狂草1e5它不香嘛?}\] \[\text{By:Unluckierblock}\] 答题情况: 总成绩 : 169, 排名: 11 / 32 T1 : 0 T2 : 99 T3 : 70 各题目分析: 题目 1 : 预估成绩 : 60 实际成绩 : 0 考试用时 : 8 : 00 ~ 8 : 50 , 9 : 50 ~ 10 : 10 没有什么感觉 ,

7月10日实验报告

7月10日实验报告