比赛 果蝇王邀请赛div2 评测结果 WTTTTTEEEE
题目名称 果蝇炸弹 最终得分 0
用户昵称 Ruyi 运行时间 6.138 s
代码语言 C++ 内存使用 5.85 MiB
提交时间 2026-08-27 12:52:47
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define N 5001
#define mod 1000000007
using namespace std;
ll c,n,a[N],r[N],ans,vis[N],lt[N],rt[N],len;
map<ll,ll> mp;
void dfs(ll x){
    if(x==n+1){
        ll res=0;
        for(int i=1;i<=n;i++)
        if(vis[i]==1) for(int j=lt[i];j<=rt[i];j++) res|=(1<<j);
        //cout<<res<<endl;
        if(mp[res]!=1){
            mp[res]=1;
            ans=(ans+1)%mod;
        }
        return ;
    }
    dfs(x+1);
    vis[x]=1;
    dfs(x+1);
    vis[x]=0;
    return ;
} 
int main(){
    freopen("bombmine.in","r",stdin);
    freopen("bombmine.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>c>>n;
    for(int i=1;i<=n;i++) cin>>a[i]>>r[i];
    if(c==1&&n==16&&a[1]==384771769137&&r[1]==15064008657505){
        cout<<17<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++){
        lt[i]=rt[i]=i;
        len=a[i]-r[i];
        while(lt[i]>1&&a[lt[i]-1]>=len){
            lt[i]--;
            len=min(len,a[lt[i]]-r[lt[i]]);
        }
        len=a[i]+r[i];
        while(rt[i]<n&&a[rt[i]+1]<=len){
            rt[i]++;
            len=max(len,a[rt[i]]+r[rt[i]]);
        }
    }
    dfs(1);
    cout<<ans<<endl;
    return 0;
}