CSP202209-4--->吉祥物投票

20分代码
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=1e4+10;
const int M=2e3+10;
int a[N];
int cnt[M];
//记录当前吉祥物有多少个支持者
int n,m,q;
int main()
{
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
    a[i]=0;
    //一开始全部都是0
    cnt[0]=n;
    //因此,为0的一共有n个
    int op,x1,x2,x3;
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&op);
        switch(op)
        {
            case 1:
            {
                scanf("%d%d%d",&x1,&x2,&x3);
                for(int j=x1;j<=x2;j++)
                {
                    cnt[a[j]]--;
                    cnt[x3]++;
                    a[j]=x3;
                }
                break;
            }
            case 2:
            {
                scanf("%d%d",&x1,&x2);
                cnt[x2]+=cnt[x1];
                cnt[x1]=0;
                for(int j=1;j<=n;j++)
                {
                    if(a[j]==x1)
                    a[j]=x2;
                }
                break;
            }
            case 3:
            {
                scanf("%d%d",&x1,&x2);
                swap(cnt[x1],cnt[x2]);
                for(int j=1;j<=n;j++)
                {
                    if(a[j]==x1)
                    a[j]=x2;
                    else if(a[j]==x2)
                    a[j]=x1;
                }
                break;
            }
            case 4:
            {
                scanf("%d",&x1);
                cout<<cnt[x1]<<endl;
                break;
            }
            case 5:
            {
                int ans=-1;
                int goal=-1;
                for(int j=1;j<=n;j++)
                {
                    if(cnt[j]>ans)
                    {
                        ans=cnt[j];
                        goal=j;
                    }
                }
                if(ans>0)
                cout<<goal<<endl;
                else
                cout<<0<<endl;
                break;
            }
        }
    }
}
ToBeContinue
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<set>
#include<map>
using namespace std;
typedef pair<pair<int,int>,int>PIII;
struct node
{
    int l;
    int r;
    int value;
    bool operator<(const node& n)const
    {
        return l<n.l;
    }
};
const int N=1e4+10;
const int M=2e3+10;
int cnt[M];
//记录当前吉祥物有多少个支持者
int cnt_help[M];
//记录某个吉祥物的cnt已经修改了多少次,方便判断优先队列的队首是不是最新数据(不是就删除)
priority_queue<PIII>heap;
//优先队列,判断当前最多的是哪个元素
//PII的第一维度是次数,第二维度是吉祥物编号(用相反数存,这样才能满足编号小的优先),第三维度记录修改次数,以此来判断是否是最新消息
set<int>store;
//放入所有的node.r
map<int,node>Map;
int Hash[M];
//输入虚拟地址,得到物理地址
int n,m,q;
void init()
{
    cnt[0]=n;
    heap.push({{n,0},0});
    store.insert(n);
    Map[n]={1,n,0};
    for(int i=0;i<=m;i++)
    Hash[i]=i;
    //一开始的时候,每个物理地址等于其虚拟地址
}
void op1(int l,int r,int x)
{
    set<int>::iterator t=store.lower_bound(l);//找到第一个需要修改的东西
    vector<set<int>::iterator>tmp;
    //得先在store中找到会被影响的区域,将它们一一修改
    for(auto i=t;i!=store.end();i++)
    {
        int index=*i;
        //取得下标
        node&n=Map[index];
        if(r<n.l||n.r<l)
        break;
        //如果不存在交集,说明已经到达终点了
        tmp.push_back(i);
        //存放进去
    }
    //寻找与[l,r]有交集的段的迭代器
    vector<node>NEW;
    if()
    {
        
    }
}
//改a[l....r]-->x
void op2(int x,int w)
{
    
}
//x的支持者全部支持w
void op3(int x,int y)
{
    
}
//x和y的支持者互换
int op4(int w)
{
    
}
//w号作品有多少个支持者
int op5()
{
    
}
//当前最多支持者的作品是什么
int main()
{
    scanf("%d%d%d",&n,&m,&q);
    //一开始全部都是0
    init();
    int op,x1,x2,x3;
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&op);
        switch(op)
        {
            case 1:
            {
                scanf("%d%d%d",&x1,&x2,&x3);
                op1(x1,x2,x3);
                break;
            }
            case 2:
            {
                scanf("%d%d",&x1,&x2);
                op2(x1,x2);
                break;
            }
            case 3:
            {
                scanf("%d%d",&x1,&x2);
                op3(x1,x2);
                break;
            }
            case 4:
            {
                scanf("%d",&x1);
                cout<<op4(x1)<<endl;
                break;
            }
            case 5:
            {
                cout<<op5()<<endl;
                break;
            }
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值