hdu 5071 vector操作恶心模拟

43 篇文章 0 订阅
12 篇文章 0 订阅

http://acm.hdu.edu.cn/showproblem.php?pid=5071

对于每一个窗口,有两个属性:优先级+说过的单词数,支持8个操作:新建窗口,关闭窗口并输出信息,聊天(置顶窗口加单词),把优先级最高的窗口移到最前,把当前第i个窗口移到最前,把选择的窗口移到最前,把某个窗口置顶,把置顶窗口取消置顶。。。最后按优先级输出每个窗口的优先级以及单词数。。。


数据范围n<=5000…,恶心模拟

主要就是vector的操作,开始的时候没有置顶窗口记得把now置为0,注意每个参数范围为10^9,要用long long 记录单词数

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL;
typedef pair<int,LL> p2;
vector<p2> p;
int find(int x)
{
    for(int i = 0;i < p.size();++i)
        if(p[i].first == x)
            return i;
    return -1;
}
void erase(int x)
{
    int i = 0;
    for(vector<p2>::iterator it = p.begin();it != p.end();it++,i++){
        if(i == x){
            p.erase(it);return;
        }
    }
}
int x,now;
void Add()
{
    RD(x);
    if(-1 != find(x))
        puts("same priority.");
    else{
        p.push_back(make_pair(x,0));
        puts("success.");
    }
}
void Close()
{
    RD(x);
    int cl = find(x);
    if(cl == -1)
        puts("invalid priority.");
    else{
        if(x == now)
            now = 0;
        printf("close %d with %I64d.\n",p[cl].first,p[cl].second);
        erase(cl);
    }
}
void Chat()
{
    RD(x);
    if(0 == p.size())
        puts("empty.");
    else{
        if(now)
            p[find(now)].second += x;
        else
            p[0].second += x;
        puts("success.");
    }
}
void Rotate(int y)
{
    if(y < 1 || y > p.size())
        puts("out of range.");
    else{
        p2 erase_p = p[y - 1];
        erase(y - 1);
        p.insert(p.begin(),erase_p);
        puts("success.");
    }
}
void Prior()
{
    int mx = 0,mx_i = -1;
    if(p.size() == 0)
        puts("empty.");
    else{
        for(int i = 0;i < p.size();++i)
            if(p[i].first > mx)
                mx = p[i].first , mx_i = i;
        Rotate(mx_i + 1);
    }
}
void Choose()
{
    RD(x);
    int ch = find(x);
    if(ch == -1)
        puts("invalid priority.");
    else
        Rotate(ch + 1);
}
void Top()
{
    RD(x);
    if(find(x) == -1)
        puts("invalid priority.");
    else
        now = x,puts("success.");
}
void Untop()
{
    if(now)
        now = 0,puts("success.");
    else
        puts("no such person.");
}
void Bye()
{
    if(now){
        x = find(now);
        if(p[x].second != 0)
            printf("Bye %d: %I64d\n",p[x].first,p[x].second);
        erase(x);
    }
    for(int i=0; i<p.size(); ++i)
        if(p[i].second)
            printf("Bye %d: %I64d\n",p[i].first,p[i].second);
}
int main() {
    string op;
    int _,y,n;RD(_);while(_--){
        now = 0;
        RD(n);
        p.clear();
        for(int cas = 1;cas <= n;++cas){
            cin>>op;
            printf("Operation #%d: ",cas);
            if(op=="Add")
                Add();
            else if(op=="Close")
                Close();
            else if(op=="Chat")
                Chat();
            else if(op=="Rotate")
                RD(y),Rotate(y);
            else if(op=="Prior")
                Prior();
            else if(op=="Choose")
                Choose();
            else if(op=="Top")
                Top();
            else if(op=="Untop")
                Untop();
        }
        Bye();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值