Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
98633 CSYZLiuJ Karry5307 C++ 运行超时 10 1000 MS 5960 KB 3793 2023-08-16 12:09:30

Tests(2/6):


#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, m; int a[N]; int p, pos[N]; int t, k; struct edge{ int l, r; int x; }f[N]; struct node{ int l, r; int num; int tim; }q[N]; int B; int b[N << 1]; inline bool cmp(node x, node y){ return (pos[x.l] ^ pos[y.l]) ? x.l < y.l : ((pos[x.r] ^ pos[y.r]) ? x.r < y.r : x.tim < y.tim); } inline bool cmp1(node x, node y){ return (pos[x.l] ^ pos[y.l]) ? x.l < y.l : ((pos[x.l] & 1) ? x.r < y.r : x.r > y.r); } int s[N], S; int cnt[N], num; int ans[N]; inline void add(int x){ num += !cnt[x] ++; } inline void del(int x){ num -= !--cnt[x]; } inline void T(int t, int L, int R){ if(L <= f[t].l && f[t].l <= R){ del(a[f[t].l]); add(f[t].x); } swap(a[f[t].l], f[t].x); } int op[N]; int l[N], r[N], x[N]; bool F, FF; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 1; i <= n; ++ i){ cin >> a[i]; b[++ B] = a[i]; } for(int i = 1; i <= m; ++ i){ cin >> op[i]; if(op[i] == 1){ cin >> l[i] >> r[i] >> x[i]; t ++; f[t].l = l[i]; f[t].r = r[i]; f[t].x = x[i]; b[++ B] = x[i]; if(l[i] != r[i]){ F = 1; } FF = 1; } if(op[i] == 2){ cin >> l[i] >> r[i]; k ++; q[k].l = l[i]; q[k].r = r[i]; q[k].num = k; q[k].tim = t; } } if(!FF){ // cout << "shift\n"; p = sqrt(n); for(int i = 1; i <= n; ++ i){ pos[i] = pos[(i - 1) / p] + 1; } sort(q + 1, q + k + 1, cmp1); /* for(int i = 1; i <= k; ++ i){ cout << q[i].l << ' ' << q[i].r << '\n'; }*/ sort(b + 1, b + B + 1); for(int i = 1; i <= n; ++ i){ a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b; } int L = 1, R = 0; for(int i = 1; i <= k; ++ i){ while(L > q[i].l) add(a[-- L]); while(R < q[i].r) add(a[++ R]); while(L < q[i].l) del(a[L ++]); while(R > q[i].r) del(a[R --]); ans[q[i].num] = num; } for(int i = 1; i <= k; ++ i){ cout << ans[i] << '\n'; } return 0; } if(!F){ // cout << "byd\n"; p = pow(n, 2 / 3); for(int i = 1; i <= n; ++ i){ pos[i] = pos[(i - 1) / p] + 1; } sort(q + 1, q + k + 1, cmp); sort(b + 1, b + B + 1); for(int i = 1; i <= n; ++ i){ a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b; } for(int i = 1; i <= t; ++ i){ f[i].x = lower_bound(b + 1, b + B + 1, f[i].x) - b; } int L = 1, R = 0, now = 0; for(int i = 1; i <= k; ++ i){ while(L > q[i].l) add(a[-- L]); while(R < q[i].r) add(a[++ R]); while(L < q[i].l) del(a[L ++]); while(R > q[i].r) del(a[R --]); while(now < q[i].tim) T(++ now, L, R); while(now > q[i].tim) T(now --, L, R); ans[q[i].num] = num; } for(int i = 1; i <= k; ++ i){ cout << ans[i] << '\n'; } return 0; } // cout << "最真实的一集\n"; sort(b + 1, b + B + 1); for(int i = 1; i <= n; ++ i){ a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b; } for(int i = 1; i <= m; ++ i){ if(op[i] == 1) x[i] = lower_bound(b + 1, b + B + 1, x[i]) - b; } for(int i = 1; i <= m; ++ i){ if(op[i] == 1){ for(int j = l[i]; j <= r[i]; ++ j){ a[j] = x[i]; } } if(op[i] == 2){ num = 0; for(int j = l[i]; j <= r[i]; ++ j){ if(!cnt[a[j]]){ s[++ num] = a[j]; cnt[a[j]] ++; } } cout << num << '\n'; for(int j = 1; j <= num; ++ j){ cnt[s[j]] = 0; } } } return 0; } /* 修改和查询都与值有关,权值线段树? 明显我们不在乎 a 的实际大小,可以离散化 区间元素个数,离线查询,怎么和某个好久没用的东西有点眼熟啊 莫,莫队??? 带修? 莫队区间修改,我在做什么奇怪的梦 */


测评信息: