ZOJ 3940 Modulo Query
2024-10-19 04:20:23
0--M对某个数字取模,相当于把0--M区间进行切割,每次暴力切割一下。结果的算的时候二分一下即可。。。
看了官方题解才会。。。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; const int maxn=+;
long long mod=1e9+;
int T,m,sz;
struct X
{
int x;
long long y;
bool operator<(const X&a)const
{
return x < a.x;
}
X(int a,long long b) {x=a,y=b;}
};
long long sum[maxn],cnt[maxn];
int v[maxn]; long long get(int now)
{
long long res=;
int l=,r=sz-;
while(l<=r)
{
int mid=(l+r)/;
if(v[mid]>=now)
{
l=mid+;
res=sum[mid];
}
else r=mid-;
}
return res;
} int main()
{
scanf("%d",&T);
while(T--)
{
int n; scanf("%d%d",&n,&m);
priority_queue<X>q;
q.push(X(m,));
for(int i=;i<=n;i++)
{
int x; scanf("%d",&x);
while()
{
if(q.top().x<x) break;
X head=q.top(); q.pop();
q.push(X(x-, (head.x + ) / x*head.y));
if ((head.x+)%x>=) q.push(X(head.x%x, head.y));
}
} sz=;
v[sz]=q.top().x; cnt[sz]=q.top().y;
q.pop(); sz++; while(!q.empty())
{
X head=q.top(); q.pop();
if(head.x==v[sz-]) cnt[sz-]+=head.y;
else
{
v[sz]=head.x;
cnt[sz]=head.y;
sz++;
}
} sum[]=cnt[];
for(int i=;i<sz;i++) sum[i]=sum[i-]+cnt[i]; int Q; scanf("%d",&Q);
long long ans=;
for(long long i=;i<=Q;i++)
{
int g; scanf("%d",&g);
ans=(ans+i*get(g)%mod)%mod;
} printf("%lld\n",ans%mod);
}
return ;
}
最新文章
- C和指针 第十章 结构和联合 (二)
- AngularJS笔记---数据绑定
- ScriptManager与UpdatePanel总结
- sql语句执行插入后返回ID
- Scala:条件表达式的好处
- 二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)
- 基于CSS3和HTML5图片加工前后对比代码
- ios 开发,通讯录信息调用常用方法,这个比较全,不用再整理了
- Apache HttpClient组件封装工具类
- php cli模式没有加载php.ini
- JDBC 的编程步骤
- Python全栈之路-Day31
- 用01随机函数构造[a,b]整数范围随机数
- apache日志记录格式LogFormat参数说明
- Docker深入浅出3-容器管理
- 洛谷P4197 Peaks&;&;克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)
- Messenger与AIDL的异同
- easyx图形库做贪吃蛇游戏
- HTTP从入门到入土(2)——HTTP协议发展历史
- 单引號转义符q’的使用