• 【APIO2008T1】珠链交换器-离线处理询问+模拟


    测试地址:抱歉,在大多数广为人知的OJ中都未找到这一题,只能在一个私人OJ中找到,这里就不贴了。

    题目大意:一排的珠子被编号为1~N,对珠子依次执行M个操作,每个操作都是将第Pi个位置的珠子和第Pi+1个位置的珠子调换位置,接下来有几组询问,每组询问有一个问题数Q,还有Q个问题,形式为:问一开始的Ki号珠子在执行完第Ji个操作后所在的位置标号,对于每个问题输出正确的答案。

    做法:看着题目描述感觉很像维护历史版本的可持久化数据结构,然而根本不是这么回事儿......注意到操作是按次序进行的,那么我们为什么不能将所有询问按Ji从小到大排序,然后再模拟处理呢?显然是可以的。然而这题有一个巨大的坑点,注意题目中我加粗的几个字“几组询问”,也就是说读入这些询问时要一直读到EOF,不注意这一点的话就只剩5分,很惨。

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,m,q,now[300010],rnow[300010],r[300010],ans[300010];
    struct query {int pos,k,j;} qry[300010];
    
    bool cmp(query a,query b)
    {
      return a.j<b.j;
    }
    
    int main()
    {
      scanf("%d%d",&n,&m);
      for(int i=1;i<=n;i++) now[i]=i,rnow[i]=i;
      for(int i=1;i<=m;i++) scanf("%d",&r[i]);
      q=0;
      int a;
      while(scanf("%d",&a)!=EOF)
      {
        for(int i=1;i<=a;i++)
        {
          qry[q+i].pos=q+i;
          scanf("%d%d",&qry[q+i].k,&qry[q+i].j);
        }
    	q+=a;
      }
      
      sort(qry+1,qry+q+1,cmp);
      
      int t=1;
      for(int i=1;i<=m;i++)
      {
        swap(now[r[i]],now[r[i]+1]);
    	swap(rnow[now[r[i]]],rnow[now[r[i]+1]]);
    	while(qry[t].j==i)
    	{
    	  ans[qry[t].pos]=rnow[qry[t].k];
    	  t++;
    	}
      }
      
      for(int i=1;i<=q;i++)
        printf("%d
    ",ans[i]);
      
      return 0;
    }
    


  • 相关阅读:
    The connection to adb is down, and a severe error has occured
    android 补间动画
    Android Geocoder(位置解析)
    Android服务之AIDL
    SQL语言学习-数据操纵语言
    SQL语言学习-数据定义语言
    asp.net MVC 验证注解
    django之用户表的继承
    django之ModelForm组件
    django之 基于queryset和双下划线的跨表查询
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793742.html
Copyright © 2020-2023  润新知