哈尔滨理工大学第六届程序设计团队 I-Team

/*
以前做过一个插队的题,这个类似从后往前操作
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#define N 600000
using namespace std;
struct node
{
    int x,y,z;
    //每一个操作,z表示这个操作是不是有效的
    node(){}
    node(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
};
vector<node>v;
vector<int>w;
int t,n,m;
int x,y,z;
int done[N];//表示当前数字操作过没有
int a[N];//表示那些人被添加进来了
void init()
{
    memset(a,0,sizeof a);
    v.clear();
    v.push_back(node(0,0,0));
    w.clear();
    memset(done,0,sizeof done);
}
int main()
{
    //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
    scanf("%d",&t);
    //cout<<t<<endl;
    while(t--)
    {
        init();
        scanf("%d%d",&n,&m);
        //cout<<n<<" "<<m<<endl;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            v.push_back(node(x,y,1));
        }
        for(int i=v.size()-1;i>=0;i--)
        {
            if(v[i].z)//这个操作可以做
            {
                if(v[i].x==3)
                    v[v[i].y].z=0;
                else if(v[i].x==1)
                {
                    if(done[v[i].y]==0)
                    {
                        a[v[i].y]=1;
                        done[v[i].y]=1;
                    }

                }
                else if(v[i].x==2)
                {
                    if(done[v[i].y]==0)
                    {
                        a[v[i].y]=0;
                        done[v[i].y]=1;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            //cout<<a[i]<<" ";
            if(a[i]==1)
            {
                w.push_back(i);
                //cout<<i<<" ";
            }
        }
        //cout<<endl;
        printf("%d\n",w.size());
        for(int i=0;i<w.size();i++)
            printf("%d ",w[i]);
        printf("\n");
    }
    return 0;
}
/*
急需一个能写模拟的队友,在线等挺急的

莫名地RE了,所有能考虑的地方都考虑了
*/
/*
先不要进行操作,先将所有的操作跑一边看看哪些1,2操作是有效的,哪些是无效的
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#define N 600000
using namespace std;
struct node
{
    int x,y,z;
    //每一个操作,z表示这个操作是不是有效的
    node(){}
    node(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
};
vector<node>v;
vector<int>w;
int t,n,m;
int x,y,z;
int a[N];//表示那些人被添加进来了
void recall(int x)//x就是要撤销的x号操作
{
    if(x<1||x>v.size())
        return;
    //cout<<x<<endl;
    if(v[x].x!=3)//如果要撤销的是1,2号操作的话
    {
        v[x].z^=1;//将这个操作撤销
        //如果已经被撤销了的话就不用管了
        return ;
    }
    else
    {
        v[x].z^=1;//将这个操作撤销
        recall(v[x].y);//继续递归下去撤销下一个操作
        //如果已经被撤销了的话就不用管了
    }
}
void init()
{
    memset(a,0,sizeof a);
    v.clear();
    v.push_back(node(0,0,0));
    w.clear();
}
int main()
{
    //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
    scanf("%d",&t);
    //cout<<t<<endl;
    while(t--)
    {
        init();
        scanf("%d%d",&n,&m);
        //cout<<n<<" "<<m<<endl;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            //cout<<x<<" "<<y<<endl;
            if(x==1)
            {
                v.push_back(node(x,y,1));
            }
            else if(x==2)
            {
                v.push_back(node(x,y,1));
            }
            else if(x==3)
            {
                v.push_back(node(x,y,1));
                //cout<<"**********"<<endl;
                recall(y);
               // cout<<"**********"<<endl;
            }
        }
        for(int i=0;i<v.size();i++)
        {
            if(v[i].x!=3)//只有1,2号操作可以
            {
                if(v[i].z)//这个操作有效的
                {
                    //cout<<v[i].x<<" "<<v[i].y<<endl;
                    if(v[i].x==1)
                    {
                        a[v[i].y]=1;
                    }
                    else if(v[i].x==2)
                    {
                        a[v[i].y]=0;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            //cout<<a[i]<<" ";
            if(a[i]==1)
            {
                w.push_back(i);
                //cout<<i<<" ";
            }
        }
        //cout<<endl;
        printf("%d\n",w.size());
        for(int i=0;i<w.size();i++)
            printf("%d ",w[i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-10-14 19:35:21

哈尔滨理工大学第六届程序设计团队 I-Team的相关文章

哈尔滨理工大学第六届程序设计团队 E-Mod

/* 成功水过,哈哈哈,可能数据水吧 */ #include <stdio.h> #include <algorithm> #include <string.h> #include <queue> #include <set> #define t_mid (l+r >> 1) #define ls (o<<1) #define rs (o<<1 | 1) #define lson ls,l,t_mid #def

哈尔滨理工大学第六届程序设计团队 H-Permutation

/* 数学是硬伤......推了半小时推出来一个错误的公式 */ #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #define mod 1000000007 using namespace std; int n,t; /* 推出来的错误公式....... f[n]=f[n-1]+(n-1)*(f[n-1]-1); */ long long a[2

河南理工大学第六届程序设计大赛

问题 A: 感恩节KK专场——送给新生的礼物 时间限制: 1 Sec  内存限制: 128 MB 提交: 633  解决: 189 [提交][状态][讨论版] 题目描述 学长KK要送给学弟学妹们礼物,他送给学弟每人一个礼物,送给学妹每人两个礼物.为什么?KK单身好多年了. 现在KK想知道他需要准备的礼物数目.注意:如果没有学妹,KK会十分伤心,就不会给任何人发礼物. 输入 给定一个整数t,表示有t(t<=30)组测试数据.每组测试数据有两个整数b(0<=b<=100)和g(0<=g

牛客网 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-低年级组)求最大值

题目描述 给出一个序列,你的任务是求序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度.然后接下来一行输入n个数,表示原先序列的样子.数据范围:3<=n<=200000-1000000000<=a[i]<=1000000000 输出描述: 每组数据输出一行一个浮点数,保留两位小数,表示所求的最大值. 示例1 输入 5 2 4 6 8 10 输出 2.00 备注: 输入只有

哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A - 所有情况的和

题目描述 在acimo星球, tabris 是一名勇敢的屠龙勇士,在上绿岛屠龙前决定挑选N种装备武装自己,现在每种装备有两个,**但每种装备tabris必须选择拿一个**,**不能多也不能少**.每件装备有自己的属性值,能给tabris属性加成.对于不同种类的装备之间有叠加效果,如果选择多件装备,最终的属性加成为他们的乘积.若tabris初始属性值为0,最后属性加成的期望是多少. 输入描述: 有多组测试样例,输入到文件结束.每组测试数据的第一行包含一个正整数NN,表示装备的种类数.接下来N行,每

哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)E - 音乐转换

题目描述 John是一位热衷的音游爱好者. 一天,他正在玩音游,碰到了一个难题.他面前有一个初始旋律,游戏目标是要把这一段初始旋律变成目标旋律.但是,难点在于,John并不能随意的改变这一旋律,每一次改变之后的旋律必须在他的旋律库中(或者为目标旋律),更令人头疼的是,每一次操作都需要消耗一定的combo,我们假设从A旋律改变成B旋律,那么这一次操作所消耗的Combo数是A与B的最大子旋律长度(最大公共子序列)再加1.需要注意的是,初始旋律必须变成旋律库中的一个旋律或者直接变成目标旋律,而旋律库中

“青软杯”安徽科技学院第六届程序设计大赛_专业组

Contest - "青软杯"安徽科技学院第六届程序设计大赛_专业组 Start time:  2015-04-18 08:00:00.0  End time:  2015-04-18 12:00:00.0 Current System Time:  2015-04-21 00:07:42.57  Contest Status:   Ended 关于举办"青软杯"安徽科技学院 第六届程序设计大赛通知 ACM 国际大学生程序设计竞赛 (International Co

北京师范大学第十六届程序设计竞赛决赛-重现赛 ACFGI

A 塞特斯玛斯塔 题目描述 quailty是一名狂热的ACM音游选手,沉迷各种音乐游戏,比如Lunatic Rave 2,osu!之类的. 今天,quailty玩的是国内游戏厂商雷亚(并不是赞助商)出品的一款音乐游戏Cytus. 游戏中,玩家需要随着游戏界面中上下移动的扫描线来适时演奏对应音符. 当上下移动的黑色线(扫描线)与圆形的物体(音符)的圆心重合时点击音符. 普通音符(图中第一种)只需点击即可. 锁链音符(图中第二种)将带箭头的音符(滑块)按下后不要松开,并将滑块沿着斜线和圆点组成的路径

2018年长沙理工大学第十三届程序设计竞赛 E 小木乃伊到我家

题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力.qwb想把这么可爱的小木乃伊送给AA,于是便找上了快递姐姐,这下可让快递姐姐犯愁了,因为去往AA家的路实在太难走了(甚至有可能没有路能走到AA家),快递姐姐找上聪明的ACMer,想请你帮忙找出最快到达AA家的路,你行吗? 输入描述: 第一行输入两个整数n和m(2<=n<=m<=200000),分别表示有n座城市和m条路,城市编号为1~n(快递姐姐所在城市为1,AA所在城市为n).接下