1500: [NOI2005]维修数列


查错ing.....扔个随机数

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;

const int maxn = 4E6 + 2E4 + 10;
const int p = 1001;

class data {
	private:
		struct Node {
			Node *ch[2];
			int siz,num,rev,modi,l,r,MAX,num;
		}pool[maxn],*root,*tot;
	
		void maintain(Node *&x) {
			int s1,s2,sl,sr,suml,sumr;
			x->MAX = -2E9; x->sum = x->num;
			x->l = max(0,x->num); x->r = max(0,x->num);
			s1 = s2 = sl = sr = suml = sumr = 0;
			if (x->ch[0] != NULL) {
				s1 = x->ch[0]->siz;
				sl = x->ch[0]->r;
				suml = x->ch[0]->sum;
				x->MAX = max(x->ch[0]->MAX,x->MAX);
				x->sum += x->ch[0]->sum;
				x->l = max(x->l,x->ch[0]->l);
			}
			if (x->ch[1] != NULL) {
				s2 = x->ch[0]->siz;
				sr = x->ch[1]->l;
				sumr = x->ch[1]->sum;
				x->MAX = max(x->ch[1]->MAX,x->MAX);
				x->sum += x->ch[1]->sum;
				x->r = max(x->r,x->ch[1]->r);
			}	
			x->MAX = max(x->MAX,sl + sr + x->num);
			x->siz = s1 + s2 + 1;
			x->l = max(x->l,suml + x->num + sr);
			x->r = max(x->r,sumr + x->num + sl);
		}	
	
		void pushdown(Node *&x) {
			if (x->rev) {
				swap(x->ch[0],x->ch[1]);
				for (int i = 0; i < 2; i++) if (x->ch[i] != NULL) 
					x->ch[i]->rev ^= 1,swap(x->ch[i]->l,x->ch[i]->r);
				x->rev ^= 1;
			}
			if (x->modi < p) {
				for (int i = 0; i < 2; i++) 
					if (x->ch[i] != NULL) {
						int t = x->modi;
						x->ch[i]->num = x->ch[i]->modi = t;
						x->ch[i]->sum = t*x->ch[i]->siz;
						if (t > 0) x->ch[i]->l = x->ch[i]->r = x->MAX = x->ch[i]->sum;
						else x->ch[i]->l = x->ch[i]->r = 0,x->ch[i]->MAX = t;
					}
			}
			maintain(x);
		}
	
		void rotate(Node *&x,int d) {
			Node *y = x->ch[d];
			x->ch[d] = y->ch[d^1];
			y->ch[d^1] = x;
			maintain(x);
			x = y;
			maintain(x);
		}
	
		void splay(Node *&x,int rank) {
			pushdown(x);
			int s1 = x->ch[0] == NULL?0:x->ch[0]->siz;
			if (s1 + 1 == rank) return;
			int d;
			if (s1 + 1 < rank) {
				rank = rank - s1 - 1;
				d = 1;
			}
			else d = 0;
			pushdown(x->ch[d]);
			int s2 = x->ch[d]->ch[0] == NULL?0:x->ch[d]->ch[0]->siz;
			if (s2 + 1 != rank) {
				int d1;
				if (s2 + 1 < rank) d1 = 1,rank = rank - s2 - 1;
				else d1 = 0;
				pushdown(x->ch[d]->ch[d1]);
				splay(x->ch[d]->ch[d1],rank)
				if (d == d1) rotate(x,d);
				else rotate(x->ch[d],d1);
			}
			rotate(x,d);
		}	
	
		Node *merge(Node *left,Node *right) {
			splay(left,left->siz);
			left->ch[1] = right;
			maintain(left);
			return left;
		}	
	
		void split(Node *x,Node *&left,Node *&right,int rank) {
			splay(x,rank);
			right = x->ch[1]; x->ch[1] = NULL;
			left = x; maintain(left);
		}	
	
	public:
		data() {
			tot = pool;
			root = ++tot;
			root->num = -2E9;
			root->rev = 0; root->modi = p;
			maintain(root);
		}
		void Insert (int rank,int num) {
			Node *left,*right;
			split(root,left,right,rank);
			left->ch[1] = ++tot;
			Node *&x = left->ch[1];
			x->num = num; x->rev = 0; x->modi = p;
			maintain(x);
			maintain(left);
			root = merge(left,right);
		}
		void Remove(int pos,int tot) {
			splay(root,pos);
			splay(root->ch[1],pos+tot+2);
			root->ch[1]->ch[0] = NULL;
			maintain(root->ch[1]);
			maintain(root);
		}
		void Modify(int pos,int tot,int num) {
			splay(root,pos);
			splay(root->ch[1],pos+tot+2);
			Node *&x = root->ch[1]->ch[0];
			x->modi = x->num = num;
			int t = x->modi;
			x->sum = t*x->siz;
			if (t > 0) x->l = x->r = x->MAX = x->sum;
			else x->l = x->r = 0,x->MAX = t;
		}
		void Rever(int pos,int tot) {
			splay(root,pos);
			splay(root->ch[1],pos+tot+2);
			Node *&x = root->ch[1]->ch[0];
			x->rev ^= 1;
			swap(x->l,x->r);
		}
		int SUM(int pos,int tot) {
			splay(root,pos);
			splay(root->ch[1],pos+tot+2);
			return root->ch[1]->ch[0]->sum;
		}
		int MAXSUM() {
			splay(root,1);
			return root->ch[1]->MAX;
		}
};

int main()
{
	#ifdef YZY
		   freopen("yzy.txt","r",stdin);
	#endif
	
	
	
	return 0;
}




#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<ctime>
#include<queue>
using namespace std;



int main()
{
	#ifdef YZY
		   freopen("yzy.txt","r",stdin);
	#endif
	
	srand(time(0));
	int n,m; n = m = 10;
	printf("%d %d\n",n,m);
	for (int i = 1; i <= n; i++) printf("%d ",rand()%2001-1000);
	cout << endl;
	while (m--) {
		int typ = rand() % 6;
		if (typ == 0) {
			int pos = rand()%(n+1);
			int tot = rand()%5 + 1;
			printf("INSERT %d %d ",pos,tot);
			while (tot--) printf("%d ",rand()%2001-1000);
			cout << endl;
			n += tot;
		}
		else if (typ == 1) {
			int pos = rand()%n+1;
			int tot;
			if (pos == n) tot = 1;
			else tot = rand()%(n-pos)+1;
			printf("DELETE %d %d\n",pos,tot);
			n -= tot;
		}
		else if (typ == 2) {
			int pos = rand()%n+1;
			int tot;
			if (pos == n) tot = 1;
			else tot = rand()%(n-pos)+1;
			int c = rand()%2001-1000;
			printf("MAKE-SAME %d %d %d\n",pos,tot,c);
		}
		else if (typ == 3) {
			int pos = rand()%n+1;
			int tot;
			if (pos == n) tot = 1;
			else tot = rand()%(n-pos)+1;
			printf("REVERSE %d %d\n",pos,tot);
		}
		else if (typ == 4) {
			int pos = rand()%n+1;
			int tot;
			if (pos == n) tot = 1;
			else tot = rand()%(n-pos)+1;
			printf("GET-SUM %d %d\n",pos,tot);
		}
		else printf("MAX-SUM\n");
	}
	return 0;
}


#include<iostream>  
#include<cstdio>  
#include<cstdlib>  
#include<algorithm>  
#include<cstring>  
#include<cmath>  
#include<vector>  
#include<queue>  
using namespace std;  
    
const int maxn = 5E5 + 50;  
const int p = 1001;  
    
int n,m;
  
class data {  
    private:  
        struct Node {  
            Node *ch[2];  
            int siz,rev,modi,l,r,MAX,num,sum,po;  
        }*root,pool[maxn];  
        
        int bo[maxn],now;
        
        void maintain(Node *&x) {  
            int s1,s2,sl,sr,suml,sumr;  
            x->MAX = -2E9; x->sum = x->num;  
            x->l = x->r = 0;  
            s1 = s2 = sl = sr = suml = sumr = 0;  
            if (x->ch[0] != NULL) {  
                s1 = x->ch[0]->siz;  
                sl = x->ch[0]->r;  
                suml = x->ch[0]->sum;  
                x->MAX = max(x->ch[0]->MAX,x->MAX);  
                x->sum += x->ch[0]->sum;  
                x->l = max(x->l,x->ch[0]->l);  
            }  
            if (x->ch[1] != NULL) {  
                s2 = x->ch[1]->siz;  
                sr = x->ch[1]->l;  
                sumr = x->ch[1]->sum;  
                x->MAX = max(x->ch[1]->MAX,x->MAX);  
                x->sum += x->ch[1]->sum;  
                x->r = max(x->r,x->ch[1]->r);  
            }     
            x->MAX = max(x->MAX,sl + sr + x->num);  
            x->siz = s1 + s2 + 1;  
            x->l = max(x->l,suml + x->num + sr);  
            x->r = max(x->r,sumr + x->num + sl);  
        }     
        
        void pushdown(Node *&x) {  
            if (x->rev) {  
                swap(x->ch[0],x->ch[1]);  
                for (int i = 0; i < 2; i++) if (x->ch[i] != NULL)   
                    x->ch[i]->rev ^= 1,swap(x->ch[i]->l,x->ch[i]->r);  
                x->rev ^= 1;  
            }  
            if (x->modi < p) {  
                for (int i = 0; i < 2; i++)   
                    if (x->ch[i] != NULL) {  
                        int t = x->modi;  
                        x->ch[i]->num = x->ch[i]->modi = t;  
                        x->ch[i]->sum = t*x->ch[i]->siz;  
                        if (t > 0) x->ch[i]->l = x->ch[i]->r = x->ch[i]->MAX = x->ch[i]->sum;  
                        else x->ch[i]->l = x->ch[i]->r = 0,x->ch[i]->MAX = t;  
                    }  
                x->modi = p;
            }  
            maintain(x);  
        }  
        
        void rotate(Node *&x,int d) {  
            Node *y = x->ch[d];  
            x->ch[d] = y->ch[d^1];  
            y->ch[d^1] = x;  
            maintain(x);  
            x = y;  
            maintain(x);  
        }  
        
        void splay(Node *&x,int rank) {  
            pushdown(x);  
            int s1 = x->ch[0] == NULL?0:x->ch[0]->siz;  
            if (s1 + 1 == rank) return;  
            int d;  
            if (s1 + 1 < rank) {  
                rank = rank - s1 - 1;  
                d = 1;  
            }  
            else d = 0;  
            pushdown(x->ch[d]);  
            int s2 = x->ch[d]->ch[0] == NULL?0:x->ch[d]->ch[0]->siz;  
            if (s2 + 1 != rank) {  
                int d1;  
                if (s2 + 1 < rank) d1 = 1,rank = rank - s2 - 1;  
                else d1 = 0;  
                pushdown(x->ch[d]->ch[d1]);  
                splay(x->ch[d]->ch[d1],rank);  
                if (d == d1) rotate(x,d);  
                else rotate(x->ch[d],d1);  
            }  
            rotate(x,d);  
        }     
        
        Node *merge(Node *left,Node *right) {  
            splay(left,left->siz);  
            left->ch[1] = right;  
            maintain(left);  
            return left;  
        }     
        
        void split(Node *x,Node *&left,Node *&right,int rank) {  
            splay(x,rank);  
            right = x->ch[1]; x->ch[1] = NULL;  
            left = x; maintain(left);  
        }     
          
        void DEL(Node *&x) {
            if (x->ch[0] != NULL) DEL(x->ch[0]);
            if (x->ch[1] != NULL) DEL(x->ch[1]);
            x->ch[0] = x->ch[1] = NULL;
            bo[++now] = x->po;
        }
          
    public:  
        data() {  
            root = &pool[0];  
            root->num = 0;  
            root->rev = 0; root->modi = p;  
            maintain(root);
			for (int i = 1; i <= 500000; i++) bo[i] = i;
			now = 500000;
        }  
        void Insert (int rank,int num) {  
            Node *left,*right;  
            split(root,left,right,rank);  
            left->ch[1] = &pool[bo[now]];
            Node *&x = left->ch[1];  x->po = bo[now--];
            x->num = num; x->rev = 0; x->modi = p;  
            maintain(x);  
            maintain(left);  
            root = merge(left,right);  
            splay(root,rank);
        }  
        void Remove(int pos,int tot) {  
            splay(root,pos);  
            if (pos + tot == n) {
                DEL(root->ch[1]);
                root->ch[1] = NULL;
                maintain(root);
            }
            else {
                splay(root->ch[1],tot+1);  
                DEL(root->ch[1]->ch[0]);
                root->ch[1]->ch[0] = NULL;  
                maintain(root->ch[1]);  
                maintain(root);  
            }
        }  
        void Modify(int pos,int tot,int num) {  
            splay(root,pos);  
            Node *x;
            if (pos + tot == n) x = root->ch[1];
            else {
                splay(root->ch[1],tot+2);  
                x = root->ch[1]->ch[0];  
            }
            x->modi = x->num = num;  
            int t = x->modi;  
            x->sum = t*x->siz;  
            if (t > 0) x->l = x->r = x->MAX = x->sum;  
            else x->l = x->r = 0,x->MAX = t;  
            if (pos + tot == n) root->ch[1] = x;
            else root->ch[1]->ch[0] = x;
            if (pos + tot != n) maintain(root->ch[1]);
            maintain(root);
        }  
        void Rever(int pos,int tot) {  
            splay(root,pos);  
            Node *x;
            if (pos + tot == n) x = root->ch[1];
            else {
                splay(root->ch[1],tot+2);  
                x = root->ch[1]->ch[0];  
            }
            x->rev ^= 1;  
            swap(x->l,x->r);  
            if (pos + tot == n) root->ch[1] = x;
            else root->ch[1]->ch[0] = x;
            if (pos + tot != n) maintain(root->ch[1]);
            maintain(root);
        }  
        int SUM(int pos,int tot) {  
            splay(root,pos);  
            if (pos + tot == n) return root->ch[1]->sum;
            else {
                splay(root->ch[1],tot+2);  
                return root->ch[1]->ch[0]->sum;  
            }
        }  
        int MAXSUM() {  
            splay(root,1);  
            return root->ch[1]->MAX;  
        }  
};  
    
char co[10];
    
int getcom()
{
    scanf("%s",co);
    if (co[0] == 'I') return 1;
    if (co[0] == 'D') return 2;
    if (co[0] == 'R') return 4;
    if (co[0] == 'G') return 5;
    int len = strlen(co);
    if (len > 7) return 3;
    else return 6;
}  
  
int typ,tot,pos;
  
int main()  
{  
    #ifdef YZY  
           freopen("yzy.txt","r",stdin);  
    #endif  
        
    scanf("%d%d",&n,&m);
    static data tree;
    int N = n; n = 1;
    for (int i = 1; i <= N; i++) {
        int x; scanf("%d",&x);
        ++n;
        tree.Insert(i,x);
    }
    while (m--) {
        typ = getcom();
        if (typ == 1) {
            int c;
            scanf("%d%d",&pos,&tot);
            for (int i = pos + 1; i <= pos + tot; i++) {
                scanf("%d",&c);
                ++n;
                tree.Insert(i,c);
            }
        }
        else if (typ == 2) { 
            scanf("%d%d",&pos,&tot);
            tree.Remove(pos,tot);
            n -= tot;
        }
        else if (typ == 3) {
            int c;
            scanf("%d%d%d",&pos,&tot,&c);
            tree.Modify(pos,tot,c);
        }
        else if (typ == 4) {
            scanf("%d%d",&pos,&tot);
            tree.Rever(pos,tot);
        }
        else if (typ == 5) {
            scanf("%d%d",&pos,&tot);
            if (!n) printf("0\n");
            else printf("%d\n",tree.SUM(pos,tot));
        }
        else {
        	if (!n) printf("0\n");
        	else printf("%d\n",tree.MAXSUM());
        }
    }
    return 0;  
}  


你可能感兴趣的:(1500: [NOI2005]维修数列)