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;
    }
    


  • 相关阅读:
    Best Time to Buy and Sell Stock I II III
    数据挖掘算法面试题
    C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
    ASP.NET MVC 5
    net破解一(反编译,反混淆-剥壳,工具推荐)
    面试题及相关参考答案
    Linux 查看内核版本命令的相关说明
    c# 获取应用程序exe文件路径及退出应用程序的几种方法
    C# WebBrowser设置代理
    c# combobox控件的使用
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793742.html
Copyright © 2011-2022 走看看