七中高新 NOIP模拟题 第一题 黄金拼图题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七中高新 NOIP模拟题 第一题 黄金拼图题解相关的知识,希望对你有一定的参考价值。
开始考试时满心以为不会像上次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 }
以上是关于七中高新 NOIP模拟题 第一题 黄金拼图题解的主要内容,如果未能解决你的问题,请参考以下文章
10.1 国庆节给祖国母亲献礼 NOIP 模拟题 第一题网格题解