ACM-東北賽划水記
阿新 • • 發佈:2020-10-11
今天東北賽,滑了一天水,做了幾道題。
T8:
- 題意:字串壓縮
SOL:優先壓縮長度,再選字典序最優。注意可能對長度有貢獻的數字1 2 16 16*16 16*16*16......
把這些點記錄下來,再對每個點進行嘗試,判斷去掉一個字元後對字典序的貢獻是減少還是增加,如果有減少的點,選減少的最前面的那個點,不然就選增加的最後一個點。
#include<bits/stdc++.h> #define N 1000007 using namespace std; int t[17],len,tag,c[N],ta[N],sb,sb1,sb2,ff1[N],ff2[N]; charView Codep[N],s[N]; bool get_ab() { for (int i=1;i<=tag;i++) { for (int j=1;j<=6;j++) if (c[i]==t[j]) {ta[++sb]=i; break;} } return sb!=0; } void out(int x) { if (x==0) return; out(x/16); x=x%16; if (0<=x&&x<10) putchar(48+x); else putchar(55+x); } signed main () { t[1]=1; t[2]=2; t[3]=16; t[4]=256; t[5]=4096; t[6]=65536; while (scanf("%s",s+1)!=EOF) { len=strlen(s+1); tag=0; sb=0; for (int i=1;i<=len;i++) { if (s[i]==s[i-1]) c[tag]++; else p[++tag]=s[i],c[tag]=1; } if (get_ab()) { sb1=sb2=0;for (int i=1;i<=sb;i++) { if (c[ta[i]]==1) { if (p[ta[i]]>p[ta[i]+1]) ff1[++sb1]=ta[i]; else ff2[++sb2]=ta[i];} if (c[ta[i]]==2) { ff2[++sb2]=ta[i];} if (c[ta[i]]>2) { ff2[++sb2]=ta[i];} } if (sb1!=0) c[ff1[1]]--; else c[ff2[sb2]]--; } else {c[1]--;} for (int i=1;i<=tag;i++) { if (c[i]==0) continue; if (c[i]==1) { putchar(p[i]); continue;} putchar(p[i]); out(c[i]); } putchar('\n'); } }
T10
可以發現,如果n充分大,那麼對於y同奇偶的點,選定一個點的顏色,其他都唯一確定了。 所以2個自由元,答案為4
n比較小的時候寫暴力觀察即可。
T5
咋一看像線性基,其實不是
對於k是奇數,可以發現選後k+1位分別選一位為0即可。
對於偶數,認真觀察(瞎幾把猜)可以發現是無解的(不會證明)
#include<bits/stdc++.h> using namespace std; long long f[73];int T,n,k; signed main () { scanf("%d",&T); while (T--) { scanf("%d%d",&n,&k); if (n==1&&k==1) {puts("1"); continue;} if (n==k||k==0) {puts("-1"); continue;} if (k%2==1) { for (int i=1;i<=k+1;i++) f[i]=(1ll<<k+1)-1ll-(1ll<<(k+1-i)); for (int i=k+2;i<=n;i++) f[i]=(1ll<<i-1)+(1ll<<k-1)-1ll; for (int i=1;i<n;i++) printf("%lld ",f[i]); printf("%lld\n",f[n]); } else { puts("-1"); continue; } } }View Code
T13
水題,不多bb
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta #include<bits/stdc++.h> using namespace std; int p[1000007]; void t(int x){ if (x<1||x>1000000) return; p[x]=1; } int T,x; signed main () { p[1]=1; for (int i=1;i<=1000000;i++) if (p[i]) { t(i*5+13); t(i*5-13); t(i*13-5); t(i*13+5); } scanf("%d",&T); while (T--) { scanf("%d",&x); // if (x>) puts(p[x]?"Yes":"No"); } }View Code