您的位置:首页 > 其它

1500: [NOI2005]维修数列

2016-03-13 13:45 337 查看
查错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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: