1. 程式人生 > >Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)

Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)

force return lose codeforce code 範圍 nal sin --

A、B都是暴力搞一搞。

A:

技術分享圖片
 1 #include<bits/stdc++.h>
 2 #define fi first
 3 #define se second
 4 #define mk make_pair
 5 #define pii pair<int,int>
 6 #define read(x) scanf("%d",&x)
 7 #define sread(x) scanf("%s",x)
 8 #define dread(x) scanf("%lf",&x)
 9 #define lread(x) scanf("%lld",&x)
10
using namespace std; 11 12 typedef long long ll; 13 const int inf=0x3f3f3f3f; 14 const int INF=0x3f3f3f3f3f3f3f3f; 15 const int N=1e6+7; 16 const int M=2333; 17 18 ll w[1001]; 19 int a,b; 20 int main() 21 { 22 for(int i=1;i<=1000;i++) 23 w[i]=w[i-1]+i; 24 read(a);read(b); 25 if(a>b)
26 swap(a,b); 27 ll ans=INF; 28 for(int i=a;i<=b;i++) 29 { 30 ans=min(ans,w[i-a]+w[b-i]); 31 } 32 printf("%lld\n",ans); 33 return 0; 34 } 35 /* 36 */
View Code

B:

技術分享圖片
#include<bits/stdc++.h>
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define
read(x) scanf("%d",&x) #define sread(x) scanf("%s",x) #define dread(x) scanf("%lf",&x) #define lread(x) scanf("%lld",&x) using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int INF=0x3f3f3f3f3f3f3f3f; const int N=1e6+7; const int M=2333; ll w[1001]; int n,a,b; vector<int> v[20]; int main() { read(n); read(a); read(b); for(int i=1;i<=n;i++) v[0].push_back(i); for(int i=0;i<=n;i++) { if(v[i].size()==2) break; for(int j=0;j<v[i].size();j+=2) { if(v[i][j]==a && v[i][j^1]==b || v[i][j]==b && v[i][j^1]==a) { printf("%d\n",i+1); return 0; } if(v[i][j^1]==a || v[i][j^1]==b) v[i+1].push_back(v[i][j^1]); else v[i+1].push_back(v[i][j]); } } puts("Final!"); } /* */
View Code

C題:剛開始沒看到給你的數據差值不小於等於2,感覺不會寫,看到了啪啦啪啦寫完啦。

技術分享圖片
 1 #include<bits/stdc++.h>
 2 #define fi first
 3 #define se second
 4 #define mk make_pair
 5 #define pii pair<int,int>
 6 #define read(x) scanf("%d",&x)
 7 #define sread(x) scanf("%s",x)
 8 #define dread(x) scanf("%lf",&x)
 9 #define lread(x) scanf("%lld",&x)
10 using namespace std;
11 
12 typedef long long ll;
13 const int inf=0x3f3f3f3f;
14 const int INF=0x3f3f3f3f3f3f3f3f;
15 const int N=1e6+7;
16 const int M=2333;
17 
18 int n,a[N],mn,cnt[100],ans[100];
19 int main()
20 {
21     int mn=inf;
22     read(n);
23     for(int i=1;i<=n;i++)
24         read(a[i]),mn=min(mn,a[i]);
25     for(int i=1;i<=n;i++)
26         a[i]-=mn;
27     int sum=0;
28     for(int i=1;i<=n;i++)
29         cnt[a[i]]++,ans[a[i]]++;
30     if(!cnt[1] && !cnt[2] || cnt[1] && !cnt[2])
31     {
32         printf("%d\n",n);
33         for(int i=1;i<=n;i++)
34             printf("%d ",a[i]+mn);
35         puts("");
36     }
37     else
38     {
39         int ret=min(cnt[0],cnt[2]);
40         int res=(cnt[1]/2)*2;
41         //printf("%d %d\n",ret,res);
42         if(2*ret>=res)
43         {
44             printf("%d\n",n-2*ret);
45             ans[0]-=ret;
46             ans[2]-=ret;
47             ans[1]+=2*ret;
48 
49         }
50         else
51         {
52             ans[0]+=res/2;
53             ans[1]-=res;
54             ans[2]+=res/2;
55             printf("%d\n",n-res);
56         }
57         for(int i=0;i<=2;i++)
58             for(int j=1;j<=ans[i];j++)
59                 printf("%d ",i+mn);
60         puts("");
61     }
62     return 0;
63 }
64 /*
65 */
View Code

D題:是我寫過最簡單的D題,dfs計算一下每個深度的點有多少個,對於每個深度來說如果是奇數個點貢獻是1,偶數個貢獻是0。

技術分享圖片
 1 #include<bits/stdc++.h>
 2 #define fi first
 3 #define se second
 4 #define mk make_pair
 5 #define pii pair<int,int>
 6 #define read(x) scanf("%d",&x)
 7 #define sread(x) scanf("%s",x)
 8 #define dread(x) scanf("%lf",&x)
 9 #define lread(x) scanf("%lld",&x)
10 using namespace std;
11 
12 typedef long long ll;
13 const int inf=0x3f3f3f3f;
14 const int INF=0x3f3f3f3f3f3f3f3f;
15 const int N=1e6+7;
16 const int M=2333;
17 
18 vector<int> edge[N];
19 int n,d[N];
20 void dfs(int u,int de)
21 {
22     d[de]++;
23     for(int v:edge[u])
24         dfs(v,de+1);
25 }
26 int main()
27 {
28     read(n);
29     for(int i=2;i<=n;i++)
30     {
31         int fa; read(fa);
32         edge[fa].push_back(i);
33     }
34     dfs(1,1);
35     int ans=0;
36     for(int i=1;i<=n;i++)
37         if(d[i]&1)
38             ans++;
39     printf("%d\n",ans);
40     return 0;
41 }
42 /*
43 */
View Code

E題:比賽的時候一直看錯題,以為是猜對的概率,題目是唯一確定答案的概率,一直調都不對,結果GG啦,其實也很簡單,

統計一下點與點之間的情況,對於一種字符來說,第二張要翻開的卡的位置都是一樣的,算一下這個概率就好啦。

技術分享圖片
#include<bits/stdc++.h>
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define read(x) scanf("%d",&x)
#define sread(x) scanf("%s",x)
#define dread(x) scanf("%lf",&x)
#define lread(x) scanf("%lld",&x)
using namespace std;

const int N=5007;
int n,cnt[26][26][N];
char s[N];
double mp[26];
int main()
{
    sread(s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            cnt[s[i]-a][s[j]-a][j-i]++;
            cnt[s[j]-a][s[i]-a][n-(j-i)]++;
        }
    }
    for(int i=0;i<26;i++)
    {
        for(int k=1;k<n;k++)
        {
            int tot=0,sum=0;
            for(int j=0;j<26;j++)
            {
                sum+=cnt[i][j][k];
                if(cnt[i][j][k]==1)
                    tot++;
            }
            mp[i]=max(mp[i],1.0*tot/sum);
        }
    }
    double ans=0;
    for(int i=1;i<=n;i++)
        ans+=mp[s[i]-a]/n;
    printf("%.12f\n",ans);
    return 0;
}
/*
*/
View Code

F題:題目大意:給你n條線段覆蓋的x軸,範圍在1-m之間,有一個人開始詢問,每次詢問一個點的覆蓋次數,問你最多幾次之後

還是無法確定是不是有一個點被所有線段覆蓋。

思路:這題想了好久。。。 剛開始以為是和點被覆蓋最大值有關,寫了很久發現有問題,我們考慮對於兩個點a,b來說,如果有一個

點c在a,b之間,且c < max (a, b) ,那麽覆蓋a的線段,和覆蓋b的線段肯定不完全相同,如果完全相同,肯定有 c>=max(a,b),矛盾。

所以我們的問題就變成了從裏面選出盡可能多的點,使其的覆蓋次數滿足先增後減,然後就很開心地最長不下降子序列搞一搞就好啦。

技術分享圖片
 1 #include<bits/stdc++.h>
 2 #define fi first
 3 #define se second
 4 #define mk make_pair
 5 #define pii pair<int,int>
 6 #define read(x) scanf("%d",&x)
 7 #define sread(x) scanf("%s",x)
 8 #define dread(x) scanf("%lf",&x)
 9 #define lread(x) scanf("%lld",&x)
10 using namespace std;
11 
12 const int N=1e5+5;;
13 int in[N],out[N],cnt[N],d[N],ans1[N],ans2[N];
14 int n,m;
15 int main()
16 {
17     read(n); read(m);
18     for(int i=1;i<=n;i++)
19     {
20         int l,r;
21         read(l); read(r);
22         in[l]++;
23         out[r]++;
24     }
25     int all=0;
26     for(int i=1;i<=m;i++)
27     {
28         all+=in[i];
29         cnt[i]=all;
30         all-=out[i];
31     }
32     ans1[1]=1;
33     
34     d[1]=cnt[1];
35     int len=1;
36     for(int i=2;i<=m;i++)
37     {
38         if(cnt[i]>=d[len])
39         {
40             d[++len]=cnt[i];
41             ans1[i]=len;
42         }
43         else
44         {
45             int j=upper_bound(d+1,d+len+1,cnt[i])-d;
46             ans1[i]=j;
47             d[j]=cnt[i];
48         }
49     }
50     ans2[m]=1;
51     d[1]=cnt[m];
52     len=1;
53     for(int i=m-1;i>=1;i--)
54     {
55         if(cnt[i]>=d[len])
56         {
57             d[++len]=cnt[i];
58             ans2[i]=len;
59         }
60         else
61         {
62             int j=upper_bound(d+1,d+len+1,cnt[i])-d;
63             ans2[i]=j;
64             d[j]=cnt[i];
65         }
66     }
67     int ans=0;
68     for(int i=1;i<=m;i++)
69         ans=max(ans,ans1[i]+ans2[i]-1);
70     printf("%d\n",ans);
71     return 0;
72 }
73 /*
74 */
View Code

Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)