萌新珂朵莉树求条
查看原帖
萌新珂朵莉树求条
764676
ycr_sad楼主2024/8/18 19:49

事情是这样的:我最后一个点没过,于是想着卡常优化尝试过

但是全WA qwq

code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <cstring>
#define int long long
using namespace std;
struct node {
    int l, r;
    mutable int val;
    node(int L, int R = -1, int Val = 0) { l = L, r = R, val = Val; }
    bool operator<(const node& a) const { return l < a.l; }
};
typedef pair<int, int> pii;
inline int in()
{
    int k=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
    return k*f;
}
set<node> odt;
int a[100010], n, m, k;
bool b[40];

inline auto split(int pos) {
    auto it = odt.lower_bound(node(pos));
    if (it != odt.end() && it->l == pos)
        return it;
    it--;
    int l = it->l, r = it->r;
    int val = it->val;
    odt.erase(it);
    odt.insert(node(l, pos - 1, val));
    return odt.insert(node(pos, r, val)).first;
}
inline void assign(int l, int r, int val) {
    auto itr = split(r + 1), itl = split(l);
    odt.erase(itl, itr);
    odt.insert(node(l, r, val));
}
inline int diff(int l, int r) {
    memset(b, 0, sizeof(b));
    auto itr = split(r + 1), itl = split(l);
    int sum = 0;
    for (auto i = itl; i != itr; i++)
        if (!b[i->val]) {
            sum++;
            b[i->val] = 1;
        }
    return sum;
}
void test() {
    cout << "\n";
    for (auto i = odt.begin(); i != odt.end(); i++) cout << i->l << " " << i->r << " " << i->val << "\n";
    cout << "\n";
}
signed main() {
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
//    cin >> n >> k >> m;
//	freopen("P1558_1.in","r",stdin);
//	freopen("1.txt","w",stdout);
    n=in();
    k=in();
    m=in();
    odt.insert(node(1, n, 1));
    odt.insert(node(n+1,n+1,1));
    for (int i = 1; i <= m; i=-~i) {
        char op;
        int x, y, z;
//        cin >> op >> x >> y;
		scanf("%c",&op);
		x=in();
		y=in();
    	if(x > y)
    	  swap(x, y);
        if (op == 'C') {
//            cin >> z;
			z=in();
            assign(x, y, z);
        }
        if (op == 'P')
          printf("%d\n",diff(x,y));
//            cout << diff(x, y) << "\n";
        //		test();
        
    }
    return 0;
}
2024/8/18 19:49
加载中...