zoukankan      html  css  js  c++  java
  • 【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;
    }
    


  • 相关阅读:
    定时器
    Vue CLI环境变量
    负数的二进制表示方法
    IDEA指定启动JDK版本
    Windows7安装两个jdk配置
    Bloom Filter 数据结构去重
    新浪微博爬虫参考
    Spring Data JPA
    Spring的JDBC框架
    数据库连接池:Druid
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793742.html
Copyright © 2011-2022 走看看