求助卡常
查看原帖
求助卡常
317225
SZNK楼主2023/7/26 08:50

第一个点怎么也过不去

卡了半天也是3.7s

有无大佬帮我看看如何卡常

#include<bits/stdc++.h>
using namespace std;
const int N = 300005, M = 2505;
int n, m, T, L[M], R[M], cnt1, cnt2, pos[N], to[N], head[N], nxt[N], cnt, seq[N], a[N], top, POS[N];
long long yu[N], ans[N], num[M];
bool f[N], vis[N], Ch[N];
struct Change{
    int x, y;
}C[M];
struct Query{
    int x, y, k, ti, id;
}Q[M];
struct node{
    int pos, flag, l, r, Ol, Or, val;
}st[M], t;
inline int read(){
    int q = 0, w = 1;
    char ch = getchar();
    while(!isdigit(ch)){
        ch = getchar();
    }
    while(isdigit(ch)){
        q = q * 10 + (ch - '0');
        ch = getchar();
    }
    return q * w;
}
inline void write(long long x){
    if(x > 9){
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
inline bool cmp(Query x, Query y){
    return x.k < y.k;
}
inline void add(const int u, const int v){
    cnt++;
    to[cnt] = v;
    nxt[cnt] = head[u];
    head[u] = cnt;
}
inline void change(const int x, const bool fflag){
	t.flag = t.l = t.Ol = t.Or = t.pos = t.r = t.val = 0;
    t.pos = x;
    seq[x] = x;
    f[t.pos] = 1; 
    bool flag1 = false;
    bool flag2 = false;
    if((x - 1) >= L[pos[x]] && f[x - 1] == 1){
        flag1 = true;
    }
    if((x + 1) <= R[pos[x]] && f[x + 1] == 1){
        flag2 = true;
    }
    if(flag1 == false && flag2 == false){
        t.flag = 0;
        t.val = 1;
    }else{
        t.flag = 1;
        if(flag1 == true && flag2 == true){
            t.val = (x - seq[x - 1] + 1) * (seq[x + 1] - x + 1);
            t.l = seq[x - 1];
            t.r = seq[x + 1];
            t.Ol = x - 1;
            t.Or = x + 1;
            int tt = seq[x - 1];
            seq[seq[x - 1]] = seq[x + 1];
            seq[seq[x + 1]] = tt;
        }else if(flag1 == true){
            t.val = (x - seq[x - 1] + 1);
            t.l = seq[x - 1];
            t.Ol = x - 1;
            t.r = x;
            t.Or = x;
            seq[x] = seq[x - 1];
            seq[seq[x - 1]] = x;
        }else if(flag2 == true){
            t.val = (seq[x + 1] - x + 1);
            t.l = seq[x + 1];
            t.Ol = x + 1;
            t.r = x;
            t.Or = x;
            seq[x] = seq[x + 1];
            seq[seq[x + 1]] = x;
        }
    }
    num[pos[x]] += t.val;
//    cout<<(int)flag1<<' '<<(int)flag2<<' '<<x<<' '<<seq[x]<<' '<<seq[x - 1]<<' '<<seq[x + 1]<<' '<<x<<' '<<t.val<<endl;
    if(fflag == true){
        st[++top] = t;
    }
}
inline long long find(const int x, const int y){
    long long sum = 0;
//    for(register int i = 1;i <= n;++i){
//    	cout<<f[i]<<' ';
//	}
//	cout<<endl;
    if(pos[x] == pos[y]){
        int len = 0;
        for(register int i = x;i <= y;++i){
            if(f[i] == 1){
                len++;
            }else{
                sum += yu[len];
                len = 0;
            }
        }
        sum += yu[len];
        return sum;
    }
    int le = 0, ri = 0, len = 0;
    for(register int i = x;i <= R[pos[x]];++i){
        if(f[i] == 1){
            le++;
        }else{
            sum += yu[le];
            le = 0;
        }
    }
    for(register int i = y;i >= L[pos[y]];i--){
        if(f[i] == 1){
            ri++;
        }else{
            sum += yu[ri];
            ri = 0;
        }
    }
    len = le;
    for(register int i = pos[x] + 1;i <= pos[y] - 1;++i){
        if(seq[L[i]] == R[i]){
            len += (R[i] - L[i] + 1);
        }else{
            if(f[L[i]] != 0){
                len += (seq[L[i]] - L[i] + 1);
                sum -= yu[seq[L[i]] - L[i] + 1];
            }
            sum += num[i];
            sum += yu[len];
//            cout<<num[i]<<endl;
            len = 0;
            if(f[R[i]] != 0){
                len += (R[i] - seq[R[i]] + 1);
                sum -= yu[R[i] - seq[R[i]] + 1];
            }
        }
    }
	sum += yu[len + ri];
    return sum;
}
inline void wor(){
    for(register int i = 1;i <= n;++i){
        f[i] = 0;
        head[i] = 0;
        seq[i] = 0;
    }
    for(register int i = 1;i <= pos[n];++i){
        num[i] = 0;
    }
    cnt = 0;
    for(register int i = 1;i <= cnt1;++i){
        Ch[C[i].x] = 1;
    }
    for(register int i = 1;i <= n;++i){
        if(Ch[i] == 0){
            add(a[i], i);
        }
	}
    sort(Q + 1, Q + 1 + cnt2, cmp);
    int ed = 1;
    for(register int i = 1;i <= cnt2;++i){
        for(register int j = 1;j <= cnt1;++j){
            vis[C[j].x] = 0;
        }
        while(ed <= Q[i].k){
            for(register int j = head[ed];j;j = nxt[j]){
                int v = to[j];
                change(v, 0);
            }
            ed++;
        }
        for(register int j = Q[i].ti;j >= 1;j--){
            if(vis[C[j].x] == 0){
                vis[C[j].x] = 1;
                if(C[j].y <= Q[i].k){
                    change(C[j].x, 1);
//					f[C[j].x] = 1;
                }
            }
        }
        for(register int j = Q[i].ti + 1;j <= cnt1;++j){
            if(vis[C[j].x] == 0){          	
                vis[C[j].x] = 1;
                if(a[C[j].x] <= Q[i].k){
                    change(C[j].x, 1);
//					f[C[j].x] = 1;
                }
            }
        }
        ans[Q[i].id] = find(Q[i].x, Q[i].y);
        while(top){
            t = st[top];
            top--;
            num[pos[t.pos]] -= t.val;
            f[t.pos] = 0;
            if(t.flag){
                seq[t.l] = t.Ol;
                seq[t.r] = t.Or; 
            }
        }
    }
    for(register int i = 1;i <= cnt1;++i){
        Ch[C[i].x] = 0;
    }    
}
int main(){	
//	freopen("site.in", "r", stdin);
//	freopen("site.out", "w", stdout);
    n = read(); m = read();
//    T = sqrt(n);
//	T = sqrt(0.8 * n);
	T = 625;
    for(register int i = 1;i <= n;++i){
        a[i] = read();
        yu[i] = 1LL * i * (i + 1) / 2;
        pos[i] = (i - 1) / T + 1;
        R[pos[i]] = i;
        if(L[pos[i]] == 0){
            L[pos[i]] = i;
        }
    }
//    T = 500;
//    T = sqrt(m);
    T = 1766;
	POS[0] = 1;
    for(register int i = 1;i <= m;++i){
        POS[i] = (i - 1) / T + 1;
        if(POS[i] != POS[i - 1]){
            wor();
            for(register int j = 1;j <= cnt2;++j){
                write(ans[j]);
                puts("");
            }
            for(register int j = 1;j <= cnt1;++j){
                a[C[j].x] = C[j].y;
            }
            cnt1 = 0;
            cnt2 = 0;
        }
        int ind = read();
        if(ind == 1){
            cnt1++;
            C[cnt1].x = read();
            C[cnt1].y = read();
        }else{
            cnt2++;
            Q[cnt2].x = read();
            Q[cnt2].y = read();
            Q[cnt2].k = read();
            Q[cnt2].id = cnt2;
            Q[cnt2].ti = cnt1;
        }
    }
    if(cnt2 != 0){
	    wor();
	    for(register int j = 1;j <= cnt2;++j){
	    	write(ans[j]);
	    	puts("");
		}    	
	}
    return 0;
}
2023/7/26 08:50
加载中...