[考試反思]1016csp-s模擬測試76:自知


要打對拍。

要打對拍。

要打對拍。

要手模數據。

要手模數據。

要手模數據。

不要相信樣例。

不要相信樣例。

不要相信樣例。

 

不要飄。

不要飄。

不要飄。

 

跟skyh學壞了。最近不打對拍。

連續十幾次考試都沒打對拍,都沒有出鍋。

但是這次就崩了。

飄了。最近是有點飄。

也算是敲響了警鍾吧。

樣例都是精心構造的,有的是故意讓你理解錯的,有的是故意讓你打錯的。

我的代碼除了樣例基本都輸出No,隨便手模了一組樣例就掛了。

僥幸拿到了30分。雖然也沒爆零,但是也足以長記性了吧。

其實是一個大小於號打反了,判斷條件寫錯了。

要對碼下的每一個字負責。

上一輪11場以rank5告終了:2330/2143/2002/1924/1895/1890/1863/1853/1796/1731/1646/1630/1619/1590/1575|機房分數線

(和諧了一句話),跟前面的三個大神和一個大臉差距極大。。。

但是上一輪總體來說,尤其到后半,還是比較穩的。

可是這一輪一開始就是嚴重爆炸,直接150分差敬上。。。

長記性吧,別再犯了。

 

T1:序列

簡單的構造題。根據A*B=N的特殊數據就可以造了。

注意大小於號不要寫反。

 1 #include<cstdio>
 2 int main(){
 3     int t,n,a,b;scanf("%d",&t);
 4     while(t--){
 5         scanf("%d%d%d",&n,&a,&b);
 6         if(a+b-1>n||1ll*a*b<n){puts("No");continue;};
 7         puts("Yes");n-=a;b--;
 8         for(int i=1;i<=a;++i)printf("%d ",n+i);
 9         if(!b){puts("");continue;}
10         int sz=n/b+1,tms=n%b,sz2=n/b,tms2=b-n%b;
11         while(tms--){n-=sz;for(int i=1;i<=sz;++i)printf("%d ",n+i);}
12         while(tms2--){n-=sz2;for(int i=1;i<=sz2;++i)printf("%d ",n+i);}
13         puts("");
14     }
15 }
444B

 

T2:購物

算是半個結論,但是稍顯然。排序后考慮每個物品的一半和前面所有物品的sum的關系,看有沒有斷檔即可。

 1 #include<cstdio>
 2 #include<algorithm>
 3 int n;long long a[100005],sum,l[100005],r[100005],ans;
 4 int main(){
 5     scanf("%d",&n);
 6     for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
 7     std::sort(a+1,a+1+n);
 8     for(int i=1;i<=n;++i)
 9         if((a[i]+1>>1)>r[i-1])ans+=r[i-1]-l[i-1]+1,sum+=a[i],l[i]=a[i]+1>>1,r[i]=sum;
10         else l[i]=l[i-1],sum+=a[i],r[i]=sum;
11     ans+=r[n]-l[n]+1;
12     printf("%lld\n",ans-1);
13 }
386B

 

T3:計數

看起來很難。

前序遍歷有很多性質。

(——By rvalue %%%,他講的太好了我就不想寫了)

數對的限制很難處理。怎么突破?

可以發現在前序遍歷確定后,中序遍歷關系所限制的,其實就是a是否在b的左子樹內。

進一步說,b限制的是a的子樹大小。

如果在子樹內,那么限制的就是左子樹大小的下界,否則限制上界。

所以設dp[i][j]表示以i為根的子樹大小為j。然后就

記憶化一發即可。

(當然也可以直接dp參見LNC)

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 #define mod 1000000007
 5 int liml[405],limr[405],dp[405][405],m,n;
 6 int sch(int ord,int sz){
 7     if(dp[ord][sz]!=-1)return dp[ord][sz];
 8     if(!sz)return dp[ord][sz]=1;
 9     dp[ord][sz]=0;
10     for(int k=liml[ord];k<sz&&k<=limr[ord];++k)dp[ord][sz]=(dp[ord][sz]+1ll*sch(ord+1,k)*sch(ord+1+k,sz-k-1))%mod;
11     return dp[ord][sz];
12 }
13 int main(){
14     int t,n,m,a,b;scanf("%d",&t);
15     while(t--){
16         scanf("%d%d",&n,&m);
17         for(int i=1;i<=n+1;++i)for(int j=0;j<=n;++j)dp[i][j]=-1;
18         for(int i=1;i<=n;++i)liml[i]=0,limr[i]=n-i+1;
19         while(m--){
20             scanf("%d%d",&a,&b);
21             if(a>b)liml[b]=max(liml[b],a-b);else limr[a]=min(limr[a],b-a-1);
22         }printf("%d\n",sch(1,n));
23     }
24 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM