这题数据有些水,有什么好的办法求前缀0吗?
查看原帖
这题数据有些水,有什么好的办法求前缀0吗?
1019606
KouMoSir楼主2024/4/4 21:43

我的ac代码,应该是一个暴力求前缀0

应该可以被这类数据卡掉

n =3e5

q =3e5

a = 1 0 0 0 0 ......0 0 1

xi = 1 ,pi = 0

xi+1 = 1 ,pi+1 = 1

如此反复xi,pi和xi+1,pi+1

...

#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<utility>
#include<string>
#include<queue>
#include<cmath>
#include<stack>
#include<array>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pa;
const ll N = 1ll << 19, MOD = 1e9 + 7, INF = 0x7fffffffffffff;
const ll M = 1e9 + 7, MM = 1e9 + 9, B = 233;
class cmp {
public:
    bool operator() (const pa& x, const pa& y)const {
        if (x.second != y.second)return x.second > y.second;
        else return x.first < y.first;
    }
};
ll t, n, q;
vector<ll> c;
vector<vector<ll>> nxt;
ll ans;
void solve() {
    cin >> n >> q;
    deque<ll>a(n + 1, 0), pre(n + 1, 0);
    vector<ll> tmpx(q + 1, 0), tmpp(q + 1, 0);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        //a[i] = rand() % (3000);
        pre[i] = a[i];
    }
    ll cnt = 0;
    //cout<<cnt<<'\n';
    ll x, p;
    ll cnt0 = 0, ind = 1;
    while (q--) {
        cin >> x >> p;
        a[x] = p;
        if (x == ind && p == 0) {
            ind = x + 1;
        }
        if (x <= ind && p != 0) {
            ind = x;
        }
        while (ind <= n && a[ind] == 0)ind++;
        cnt0 = ind - 1;

        ll l = 0, r = 50;
        while (l < r) {
            ll mid = (l + r) / 2;
            if ((1ll << mid) >= (n - cnt0))r = mid;
            else l = mid + 1;
        }
        cout << (1ll << l) % MOD << '\n';
    }
}
int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
/*

*/
2024/4/4 21:43
加载中...