标签:www. math 用两个 tps scanf namespace 答案 images ges
一行8个参数,n,A,B,C,x0,a,b,MOD
一行表示答案总和对1e9+7取模后的结果
5 1 1 1 2 2 2 5
17
题解:
这个题目,我是水过去的,发现multiset,map+priority都因为常数太大所以TLE了,所以我们考虑只用两个priority,一个维护当前的最大值,一个维护当前要删除数的集合,所以,对于当前我们要删除的数,考虑把他加入第二个优先队列之中去而不正真删除,只有每次要取优先级最高的元素时,我们比较两个队列的最大元素,如果相同就删除,复杂度nlogn.
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #include <queue> #include <map> #define RG register #define ll long long #define MAXN 10000100 using namespace std; int q[MAXN*2],l=10000010,r=10000010-1,num=0; priority_queue<int> qq,qq2; ll n,A,B,C,xi,a,b,MOD,ans=0; int main() { scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&n,&A,&B,&C,&xi,&a,&b,&MOD); for(RG ll i=1;i<=n;i++){ xi=(xi*a+b)%MOD; if(xi%(A+B+C)<A||r-l+1<=1) q[--l]=xi,qq.push(xi); else if(xi%(A+B+C)>=A&&xi%(A+B+C)<A+B) q[++r]=xi,qq.push(xi); else{ qq2.push(q[l++]); } while(!qq2.empty()&&qq2.top()==qq.top()) qq2.pop(),qq.pop(); ans=(ans+qq.top())%1000000007; } printf("%lld",ans); return 0; }
标签:www. math 用两个 tps scanf namespace 答案 images ges
原文地址:http://www.cnblogs.com/renjianshige/p/7794817.html