HDU4699-杭电多校第十场1004

来源:互联网 发布:java中的properties类 编辑:程序博客网 时间:2024/06/07 11:54

题目:题目链接

 

题意:

   就是给你五个操作,分别实现这些操作:

   主要的就是对于Q操作,我们需要输出对应的前K的数字中和最大的那个和,sum(i) = a1+a2+....ai;

   对于当前光标位置,我们使用两个栈A和B来存储光标前面的数据,用B来存储光标后面的数据。这样就很容易能够

实现前四个操作。对于Q操作,我们需要用一个数组来维护,对应的求第I个位置的MAX值,最后直接输出MAX[k]就可以

了:

 

   唉,没有考虑栈为空的情况,WA了好几次,加一个特判就可以了:

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))__int64 inf=-100000000;using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 1000008int prime[N];struct node{    int x, y;};bool cmp(const node & a, const node & b){    return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);char O;int num;int t;stack<int>A;stack<int>B;int cnt;int  sum[N];int  MAX[N];void add(int num){    cnt++;    if(!A.empty())    {        A.push(num);        sum[cnt] = sum[cnt-1] + num;        if(sum[cnt] > MAX[cnt-1])            MAX[cnt] = sum[cnt];        else            MAX[cnt] = MAX[cnt-1];    }    else    {        A.push(num);        sum[cnt] = num;        MAX[cnt] =num;    }}void del(){    if(!A.empty())    {        A.pop();        cnt--;    }}void left(){    if(!A.empty())    {        int tp = A.top();        A.pop();        B.push(tp);        cnt--;    }}void right(){    if(!B.empty())    {        int tp = B.top();        B.pop();        if(!A.empty())        {            A.push(tp);            cnt++;            sum[cnt] = sum[cnt-1] + tp;            if(sum[cnt] > MAX[cnt-1])                MAX[cnt] = sum[cnt];            else                MAX[cnt] = MAX[cnt-1];        }        else        {            A.push(tp);            cnt++;            sum[cnt]=tp;            MAX[cnt]=tp;        }    }}void que(int num){    printf("%d\n", MAX[num]);}int main(){    char O[3];    while(scanf("%d", &t) == 1)    {        while(!A.empty())            A.pop();        while(!B.empty())            B.pop();        mem(sum, 0);        cnt = 0;        for(int i = 0; i < t; ++i)        {            scanf("%s", O);            switch(O[0])            {            case 'I':                scanf("%d", &num);                add(num);                break;            case 'D':                del();                break;            case 'L':                left();                break;            case 'R':                right();                break;            case 'Q':                scanf("%d", &num);                que(num);                break;            default:                break;            }        }    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}


 

 

原创粉丝点击