第一次在學校打CF,和博哥一塊兒打,九點半到十一點半,沒想到回宿舍以後舍友都沒睡。。。c++
整體來講這是一把體驗比較刺激的CF,AB題很快切掉,C構造題結論猜錯可是博哥立馬切了,D題一眼大力模擬,在幾近自閉之時,改了一些沒開long long,沒特判開局方向的錯誤後,在最後幾分鐘過掉了,直接從2000名左右跳到了300+名,可是因爲提交次數過多,D的分比C少(什麼破爛CF賽制),次日早上起來發現不少人D被System Test給弄掉了,最後190+名苟且上紫。ide
博哥最後十幾秒來了一發激情提交,可是因爲某些變量未開long long而炸掉了,慘慘。spa
很討厭又臭又長的英文題面,緊張的氛圍之中靜下心看題真是件難事。code
貪心就完事了,兩種策略,分別猛取其中一個方案,再儘量取另外一個方案,取個maxblog
1 #include<bits/stdc++.h> 2 #define FOR(i,a,b) for (register int i=(a);i<=(b);i++) 3 #define For(i,a,b) for (register int i=(a);i>=(b);i--) 4 #define mem(i,j) memset(i,j,sizeof(i)) 5 #define GO(u) for (register int j=f[u];j!=-1;j=nxt[j]) 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define pii pair<int,int> 10 #define MP make_pair 11 using namespace std; 12 typedef long long ll; 13 int t,a,b,c,ans; 14 inline int read() 15 { 16 int x=0,f=1; 17 char c=getchar(); 18 while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} 19 while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();} 20 return f*x; 21 } 22 inline void write(int x) 23 { 24 if (x<0) putchar('-'),x=-x; 25 if (x>9) write(x/10); 26 putchar(x%10+'0'); 27 return; 28 } 29 inline int solve() 30 { 31 int x,y,z,ret=0,tmp,sum; 32 33 sum=0; 34 x=a,y=b,z=c; 35 tmp=min(x,y/2); 36 sum+=3*tmp; 37 x-=tmp,y-=2*tmp; 38 tmp=min(y,z/2); 39 sum+=3*tmp; 40 ret=max(ret,sum); 41 42 sum=0; 43 x=a,y=b,z=c; 44 tmp=min(y,z/2); 45 sum+=3*tmp; 46 y-=tmp,z-=2*tmp; 47 tmp=min(x,y/2); 48 sum+=3*tmp; 49 ret=max(ret,sum); 50 51 return ret; 52 } 53 int main() 54 { 55 t=read(); 56 while (t--) 57 { 58 a=read(),b=read(),c=read(); 59 ans=solve(); 60 write(ans),putchar('\n'); 61 } 62 return 0; 63 }
快速冪直接完事$(2^m-1)^n$get
1 #include<bits/stdc++.h> 2 #define FOR(i,a,b) for (register ll i=(a);i<=(b);i++) 3 #define For(i,a,b) for (register ll i=(a);i>=(b);i--) 4 #define mem(i,j) memset(i,j,sizeof(i)) 5 #define GO(u) for (register ll j=f[u];j!=-1;j=nxt[j]) 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define pii pair<ll,ll> 10 #define MP make_pair 11 using namespace std; 12 typedef long long ll; 13 const ll mod=1e9+7; 14 ll n,m,ans; 15 inline ll read() 16 { 17 ll x=0,f=1; 18 char c=getchar(); 19 while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} 20 while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();} 21 return f*x; 22 } 23 inline void write(ll x) 24 { 25 if (x<0) putchar('-'),x=-x; 26 if (x>9) write(x/10); 27 putchar(x%10+'0'); 28 return; 29 } 30 inline ll qpow(ll x,ll y) 31 { 32 ll ret=1; 33 while (y) 34 { 35 if (y&1) ret=1LL*ret*x%mod; 36 y>>=1; 37 x=1LL*x*x%mod; 38 } 39 return ret; 40 } 41 int main() 42 { 43 n=read(),m=read(); 44 m=qpow(2,m)-1; 45 m=(1LL*m+mod)%mod; 46 ans=qpow(m,n); 47 write(ans); 48 return 0; 49 }
猜了個循環移位分組,是錯的。博哥來了個縱向蛇皮構造(蛇形構造),就過了。it
1 #include<bits/stdc++.h> 2 #define FOR(i,a,b) for (register int i=(a);i<=(b);i++) 3 #define For(i,a,b) for (register int i=(a);i>=(b);i--) 4 #define mem(i,j) memset(i,j,sizeof(i)) 5 #define GO(u) for (register int j=f[u];j!=-1;j=nxt[j]) 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define pii pair<int,int> 10 #define MP make_pair 11 using namespace std; 12 typedef long long ll; 13 const int N=5050; 14 int n,a[N][N],pt=0; 15 inline int read() 16 { 17 int x=0,f=1; 18 char c=getchar(); 19 while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} 20 while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();} 21 return f*x; 22 } 23 inline void write(int x) 24 { 25 if (x<0) putchar('-'),x=-x; 26 if (x>9) write(x/10); 27 putchar(x%10+'0'); 28 return; 29 } 30 int main() 31 { 32 n=read(); 33 FOR(i,1,n) 34 { 35 if (i&1) For(j,n,1) a[j][i]=++pt; 36 else FOR(j,1,n) a[j][i]=++pt; 37 } 38 FOR(i,1,n) 39 { 40 FOR(j,1,n) write(a[i][j]),putchar(' '); 41 putchar('\n'); 42 } 43 return 0; 44 }
顯然咱們從起點出發後,因爲每一個位置只能通過一次,咱們不得不走到底,能走就走,不能走就右轉,直到一步都不能走。event
這時候咱們看一下通過的格子數是否正確便可,正確性應該顯然吧。class
用vector維護障礙物,每次lower_bound二分查找,再記錄四個界限的標記,它們是不斷往中間收攏的,最後注意開long long,以及一開始是能夠往下走的。變量
ps:通過親測,若是不判一開始往下走,會WA218,這是個hack點,終測時候會掛掉。
1 #include<bits/stdc++.h> 2 #define FOR(i,a,b) for (register LL i=(a);i<=(b);i++) 3 #define For(i,a,b) for (register LL i=(a);i>=(b);i--) 4 #define mem(i,j) memset(i,j,sizeof(i)) 5 #define GO(u) for (register LL j=f[u];j!=-1;j=nxt[j]) 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define pii pair<LL,LL> 10 #define MP make_pair 11 using namespace std; 12 typedef long long LL; 13 const LL N=2e5+5; 14 LL n,m,k,x[N],y[N],a=1,b=1,now=1,cnt=1,hh[2],ll[2]; 15 vector <LL> h[N],l[N]; 16 inline LL read() 17 { 18 LL x=0,f=1; 19 char c=getchar(); 20 while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} 21 while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();} 22 return f*x; 23 } 24 inline void write(LL x) 25 { 26 if (x<0) putchar('-'),x=-x; 27 if (x>9) write(x/10); 28 putchar(x%10+'0'); 29 return; 30 } 31 inline void init() 32 { 33 FOR(i,1,n) h[i].pb(0),h[i].pb(m+1); 34 FOR(i,1,m) l[i].pb(0),l[i].pb(n+1); 35 FOR(i,1,k) h[x[i]].pb(y[i]),l[y[i]].pb(x[i]); 36 FOR(i,1,n) sort(h[i].begin(),h[i].end()); 37 FOR(i,1,m) sort(l[i].begin(),l[i].end()); 38 hh[0]=0,hh[1]=n+1; 39 ll[0]=0,ll[1]=m+1; 40 return; 41 } 42 inline void solve() 43 { 44 LL pos; 45 while (cnt<n*m-k) 46 { 47 switch (now) 48 { 49 case 1: 50 pos=upper_bound(h[a].begin(),h[a].end(),b)-h[a].begin(); 51 pos=h[a][pos]; 52 pos=min(pos,ll[1]); 53 if (pos-b==1) return; 54 cnt+=pos-b-1; 55 b=pos-1; 56 now=2; 57 hh[0]=max(hh[0],a); 58 break; 59 case 2: 60 pos=upper_bound(l[b].begin(),l[b].end(),a)-l[b].begin(); 61 pos=l[b][pos]; 62 pos=min(pos,hh[1]); 63 if (pos-a==1) return; 64 cnt+=pos-a-1; 65 a=pos-1; 66 now=3; 67 ll[1]=min(ll[1],b); 68 break; 69 case 3: 70 pos=lower_bound(h[a].begin(),h[a].end(),b)-h[a].begin(); 71 pos--; 72 pos=h[a][pos]; 73 pos=max(pos,ll[0]); 74 if (b-pos==1) return; 75 cnt+=b-pos-1; 76 b=pos+1; 77 now=4; 78 hh[1]=min(hh[1],a); 79 break; 80 case 4: 81 pos=lower_bound(l[b].begin(),l[b].end(),a)-l[b].begin(); 82 pos--; 83 pos=l[b][pos]; 84 pos=max(pos,hh[0]); 85 if (a-pos==1) return; 86 cnt+=a-pos-1; 87 a=pos+1; 88 now=1; 89 ll[0]=max(ll[0],b); 90 break; 91 } 92 } 93 return; 94 } 95 int main() 96 { 97 n=read(),m=read(),k=read(); 98 FOR(i,1,k) x[i]=read(),y[i]=read(); 99 init(); 100 solve(); 101 if (cnt==n*m-k) {printf("Yes\n");exit(0);} 102 hh[0]=0,hh[1]=n+1; 103 ll[0]=0,ll[1]=m+1; 104 a=b=1; 105 cnt=1; 106 now=2; 107 solve(); 108 if (cnt==n*m-k)printf("Yes\n"); 109 else printf("No\n"); 110 return 0; 111 } 112 /* 113 4 2 4 114 1 2 115 2 2 116 3 2 117 4 2 118 */