社区讨论
60 分求助
P14507缺零分治 mexdnc参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi0vdun2
- 此快照首次捕获于
- 2025/11/16 06:40 4 个月前
- 此快照最后确认于
- 2025/11/17 09:13 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define mp(a,b) make_pair(a,b)
using namespace std;
/*
刚刚我错过的大雨 握不住的盛夏
飘过的云是你吗 一圈又一圈
我多想是路过 你的风
忍不住 落回你眼中
凭什么绕不开 翻不过的盛夏
有些远方 让风代替我们抵达
没勇气说完的那句话
希望有人听过它
*/
inline int read(){
int a=0,b=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') b=-1;
c=getchar();
}
while(isdigit(c)){
a=(a<<1)+(a<<3)+(c-'0');
c=getchar();
}
return a*b;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
putchar(x%10+48);
}
inline void write1(int x){
write(x),putchar(' ');
}
inline void write2(int x){
write(x),putchar('\n');
}
const int N=114514;
struct node{
int id;
int sum;
friend bool operator <(node a,node b){
return a.sum<b.sum;
}
}query[N];
int include13[N];
int a[N],b[N],b1[N],b2[N],b3[N],b4[N];
int n,q;
int cnt=0;
int T;
void solve(){
// cout<<'!'<<T<<endl;
n=read(),q=read();
a[0]=-1; //又一强大做法!
b[0]=1e18;
for(int i=1;i<=n;i++){
a[i]=read(),b[i]=read();
if(a[i]==a[i-1]+1){
b[i]=min(b[i],b[i-1]);
}
else b[i]=0; //因为有很多都是无效的
}
// if(T==3){
// for(int i=1;i<=n;i++){
// cout<<'*'<<a[i]<<' '<<b[i]<<endl;
// }
// cout<<endl;
// }
// cout<<"谭总的世界-031"<<endl;
// for(int i=1;i<=n;i++){
// cout<<b[i]<<' ';
// }
// cout<<endl;
int min_=0;
for(int i=n;i>=1;i--){
b1[i]=b[i]-b[i+1]; //代表目前的情况!!!!!
b2[i]=b1[i]*(a[i]+1); //代表现在的这里的值
b3[i]=b3[i+1]+b2[i]; //后缀和
b4[i]=b4[i+1]+b1[i];
if(b[i]!=0){
min_=a[i]+1; //有解的最小值
}
}
int max_=0;
for(int i=1;i<=n;i++){
if(b1[i]!=0){
max_=a[i]+1;
}
}
// cout<<'$'<<min_<<endl;
// cout<<'^'<<b3[1]<<endl;
// cout<<"谭总的世界-042"<<endl;
// for(int i=1;i<=n;i++){
// cout<<b1[i]<<' ';
// }
// cout<<endl;
for(int i=1;i<=q;i++){
query[i].sum=read(),query[i].id=i;
cnt++;
// if(cnt==253865){
// cout<<'$'<<query[i].sum<<endl;
// for(int j=1;j<=n;j++){
// cout<<'!'<<a[j]<<' '<<b[j]<<endl;
// }
//// cout<<'#'<<T<<endl;
// }
}
stable_sort(query+1,query+q+1);
// cout<<'&'<<min_<<endl;
// cout<<"谭总的世界-009"<<endl;
int idx=n+1;
for(int i=1;i<=q;i++){
// cout<<"谭总的世界-053"<<endl;
if(query[i].sum<min_){
include13[query[i].id]=-1;
// cout<<"谭总的世界-033"<<endl;
continue;
}
// cout<<'&'<<query[i].sum<<' '<<b3[1]<<endl;
if(query[i].sum>b3[1]){
include13[query[i].id]=-1;
// cout<<"谭总的世界-037"<<endl;
continue;
}
// cout<<"谭总的世界-002"<<endl;
while(1){
if(idx==1) break;
if(b3[idx-1]<=query[i].sum) idx--;
else break;
}
// cout<<'#'<<query[i].id<<' '<<query[i].sum<<' '<<idx<<endl;
int x=query[i].sum-b3[idx]; //x 代表剩余未被分的部分
int y=0;
if(idx!=1) y=(x/(a[idx-1]+1))+(x%(a[idx-1]+1)!=0);
include13[query[i].id]=max(y+b4[idx],1ll);
// cout<<'#'<<idx<<endl;
if(include13[query[i].id]==1){
if(query[i].sum!=max_) include13[query[i].id]=2;
}
}
// cout<<"谭总的世界-046"<<endl;
for(int i=1;i<=q;i++){
write2(include13[i]);
}
return;
}
#undef int
int main(){
// freopen("mexdnc.in","r",stdin);
// freopen("mexdnc.out","w",stdout);
T=read();
while(T--) solve();
// putchar('\n');
return 0;
} //一定要挽回罗琪钧的遗憾啊,一定会挽回罗琪钧的遗憾的!
回复
共 0 条回复,欢迎继续交流。
正在加载回复...