码迷,mamicode.com
首页 > 其他好文 > 详细

七中高新 NOIP模拟题 第一题 黄金拼图题解

时间:2017-09-30 19:51:43      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:有一个   bool   ==   alt   gif   有意思   map   logs   http   

技术分享

  

  开始考试时满心以为不会像上次SD_le出的模拟题一样不友好,然而我还是太年轻了……

  基本这道题就定了本次考试基本的基调——暴力大赛。  

  这套题被大佬们誉为“偏难怪”,中的“偏”。其实不是没有道理的,上来看到对于拼图是否完整如何判定时以为这是一道只有线性筛的简单数学题,然后……

  看到对于区间的询问时想到了莫队,又看到了强制在线,然后又去想平衡树,于是搞完暴力后用生平最快的速度敲出了SPLAY,然后发现需要树套树,然而我不会啊……

  然后开始思考对策,虽说之前说过会考平衡树,但没说要考树套树啊,然后就稀里糊涂的打了一个分块水分。好多大佬打了树套树,主席树等等等等本蒟蒻不会的高端打法,然而被出题人强行卡复杂度,最后和我暴力分一样高2333333。

  最后竟然有三位大佬AC了,%%%。

  最后正解让所有人懵逼,一个奇怪的推理。本题有一个很有意思的设定,所有块数属于[4,1000000],而不是[2,1000000]。对于素数来说,2有什么特殊呢?2是唯一一个偶数质数,本题对于输入的“破译”是依靠异或,很明显所有答案一定是单数。那么如果我们先不去考虑一开始lastans=0,那么如果他输入的数为偶数,那么实际op一定等于1,相反,如果说他输入的是奇数,那么op一定等于2,根据这个,我们就可一顺理成章的推出来上一次询问的答案了。所以根本没有数据结构任何事……唯一需要注意的是如果最后一次操作是询问的话,我们需要O(n)的暴力推一下他的答案。而对于一开始lastans=0我们特判一下就好了。

技术分享
  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <queue>
  6 #include <algorithm>
  7 #include <cmath>
  8 #include <map>
  9 #include <set>
 10 #define N 200005
 11 using namespace std;
 12 int n,zz,k,m,a[N];
 13 long long ss[1000005];
 14 bool fss[1000005];
 15 void xs()
 16 {
 17     for(int i=2;i<=1000003;i++)
 18     {
 19         if(!fss[i])
 20         {
 21             zz++;
 22             ss[zz]=i;
 23         }
 24         for(int j=1;j<=zz;j++)
 25         {
 26             if(i*ss[j]>1000000)break;
 27             fss[i*ss[j]]=1;
 28             if(i%ss[j]==0)break;
 29         }
 30     }
 31 }
 32 int la;
 33 int main()
 34 {
 35     xs();
 36     scanf("%d%d%d",&n,&k,&m);
 37     for(int i=1;i<=n;i++)
 38         scanf("%d",&a[i]);
 39     int lla[4];
 40     bool yx=1;
 41     for(int i=1;i<=m;i++)
 42     {
 43         int x,y,z;
 44         scanf("%d%d%d",&x,&y,&z);
 45         if(x%2==0)lla[0]=i,lla[1]=y,lla[2]=z;
 46         if(yx)
 47         {
 48             if(la==0)
 49             {
 50                 if(x%2)
 51                 {
 52                     yx=0;
 53                 }
 54                 else
 55                 {
 56                     a[y]=z;
 57                 }
 58             }
 59             else
 60             {
 61                 if(x%2==0)
 62                 {
 63                     yx=0;
 64                 }
 65                 else
 66                 {
 67                     x^=la,y^=la,z^=la;
 68                     a[y]=z;
 69                 }
 70             }
 71         }
 72         else
 73         {
 74             if(x%2==0)
 75             {
 76                 la=x^1;
 77                 yx=0;
 78                 printf("%d\n",la);
 79             }
 80             else
 81             {
 82                 la=x^2;
 83                 yx=1;
 84                 printf("%d\n",la);
 85                 y^=la,z^=la;
 86                 a[y]=z;
 87             }
 88         }
 89     }
 90     if(lla[0]==m)
 91     {
 92         lla[1]^=la,lla[2]^=la;
 93         priority_queue<int> q1;
 94         int js=0;
 95         for(int i=lla[1];i<=lla[2];i++)
 96         {
 97             if(!fss[a[i]])
 98             {
 99                 js++;
100                 q1.push(a[i]);
101             }
102         }
103         while(js>k)
104         {
105             js--;
106             q1.pop();
107         }
108         printf("%d\n",q1.top());
109     }
110     return 0;
111 }
View Code

七中高新 NOIP模拟题 第一题 黄金拼图题解

标签:有一个   bool   ==   alt   gif   有意思   map   logs   http   

原文地址:http://www.cnblogs.com/liutianrui/p/7614508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!