1. 程式人生 > >七中高新 NOIP模擬題 第一題 黃金拼圖題解

七中高新 NOIP模擬題 第一題 黃金拼圖題解

alt 答案 void 註意 意思 urn 屬於 namespace cst

技術分享

  

  開始考試時滿心以為不會像上次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模擬題 第一題 黃金拼圖題解