Codeforces Round #267 (Div. 2)

A

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 100000
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 int main()
18 {
19     int n,i,j;
20     int ans = 0;
21     cin>>n;
22     for(i = 1; i <= n; i++)
23     {
24         int x,y;
25         scanf("%d%d",&x,&y);
26         if(y-x>=2) ans++;
27     }
28     cout<<ans<<endl;
29     return 0;
30 }
View Code

B

还以为是间接的朋友,写复杂了,没想到那么简单。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 1010
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 int a[N];
18 int fa[N];
19 int r[N];
20 int find(int x)
21 {
22     if(x!=fa[x])
23     {
24         fa[x] = find(fa[x]);
25         return fa[x];
26     }
27     return x;
28 }
29 int main()
30 {
31     int n,m,k,i,j;
32     cin>>n>>m>>k;
33     for(i = 1 ;i <= m+1; i++) {fa[i] = i;r[i] = 1;}
34     for(i = 1; i <= m+1; i++)
35     scanf("%d",&a[i]);
36     int ans = 0;
37     for(i = 1 ; i <= m; i++)
38     {
39         int cnt = 0;
40         for(int g = 0 ; g < n ;g++)
41             if((a[m+1]&(1<<g))!=(a[i]&(1<<g))) cnt++;
42             if(cnt<=k) ans++;
43     }
44 //    for(i = 1; i <= m+1; i++)
45 //        for(j = 1; j <= m+1; j++)
46 //        {
47 //            if(i==j) continue;
48 //            int cnt = 0;
49 //            for(int g = 0 ; g < n ;g++)
50 //            if((i&(1<<g))!=(i&(1<<g))) cnt++;
51 //            if(cnt<=k)
52 //            {
53 //                int tx = find(i);
54 //                int ty = find(j);
55 //                if(tx!=ty)
56 //                {
57 //                    fa[tx] = ty;
58 //                    r[tx]+=r[ty];
59 //                }
60 //            }
61 //        }
62 //    int kk = find(m+1);
63     cout<<ans<<endl;
64     return 0;
65 }
View Code

 C

简单dp

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 5010
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 int a[N];
18 LL dp[N][N];
19 LL sum[N];
20 int main()
21 {
22     int n,m,k,i,j;
23     cin>>n>>m>>k;
24     for(i = 1; i <= n;  i++)
25     {
26         scanf("%d",&a[i]);
27         sum[i] = sum[i-1]+a[i];
28     }
29     for(i = m; i <= n ;i++)
30     {
31         for(j = 1; j <= k; j++)
32         dp[i][j] = max(dp[i-m][j-1]+sum[i]-sum[i-m],dp[i-1][j]);
33     }
34     cout<<dp[n][k]<<endl;
35     return 0;
36 }
View Code

D

tarjan缩点+dfs

dfs的时候少写了else里面的内容。。一直wa到结束

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 #include<map>
 11 #include<stack>
 12 using namespace std;
 13 #define N 500010
 14 #define M 500010
 15 #define LL long long
 16 #define INF 0xfffffff
 17 const double eps = 1e-8;
 18 const double pi = acos(-1.0);
 19 const double inf = ~0u>>2;
 20 struct node
 21 {
 22     int u,v,next,w;
 23 } edge[M];
 24 int t,low[N],pre[N],sccno[N],head[N],scc,dep,vis[N],dis[N];
 25 int dd1[N],dd2[N];
 26 int dp[N];
 27 int num[N],de[N];
 28 vector<int>cd[N];
 29 void init()
 30 {
 31     t = 0;
 32     memset(head,-1,sizeof(head));
 33 }
 34 void add(int u,int v)
 35 {
 36     edge[t].u  =u;
 37     edge[t].v = v;
 38     edge[t].next = head[u];
 39     head[u] = t++;
 40 }
 41 stack<int>s;
 42 void dfs(int u)
 43 {
 44     low[u] = pre[u] = ++dep;
 45     s.push(u);
 46     for(int i = head[u] ; i!=-1 ; i = edge[i].next)
 47     {
 48         int v = edge[i].v;
 49         if(!pre[v])
 50         {
 51             dfs(v);
 52             low[u] = min(low[u],low[v]);
 53         }
 54         else if(!sccno[v])
 55             low[u] = min(low[u],pre[v]);
 56     }
 57     if(low[u]==pre[u])
 58     {
 59         scc++;
 60         int minz = INF,sum=INF;
 61         for(;;)
 62         {
 63             int x = s.top();
 64             s.pop();
 65             if(minz>num[x])
 66             {
 67                 minz = num[x];
 68                 sum = dp[x];
 69             }
 70             else if(minz==num[x]) sum = min(dp[x],sum);
 71             sccno[x] = scc;
 72             if(x==u)break;
 73         }
 74         dd1[scc] = minz;
 75         dd2[scc] = sum;
 76 
 77     }
 78 }
 79 void find_scc(int n)
 80 {
 81     scc=0;
 82     dep=0;
 83     memset(low,0,sizeof(low));
 84     memset(pre,0,sizeof(pre));
 85     memset(sccno,0,sizeof(sccno));
 86     for(int i = 1; i <= n ; i++)
 87         if(!pre[i])
 88             dfs(i);
 89 }
 90 map<string,int>f;
 91 vector<int>ed[N];
 92 char s1[N],s2[N];
 93 int a[N];
 94 int judge(char *str)
 95 {
 96     int i,k;
 97     k= strlen(str);
 98     int cnt = 0;
 99     for(i = 0 ; i < k; i++)
100         if(str[i]=='R')
101             cnt++;
102     return cnt;
103 }
104 int ddfs(int u)
105 {
106     int i,j;
107     for(i = 0 ; i< ed[u].size() ; i++)
108     {
109         int v = ed[u][i];
110         if(!vis[v])
111         {
112             vis[v] = 1;
113             int ss = ddfs(v);
114             if(dd1[u]>=ss)
115             {
116                 if(dd1[u]==ss)
117                     dd2[u] = min(dd2[u],dd2[v]);
118                 else dd2[u] = dd2[v];
119                 dd1[u] = ss;
120             }
121         }
122         else if(dd1[u]>=dd1[v])
123         {
124             if(dd1[u]==dd1[v]) dd2[u] = min(dd2[u],dd2[v]);
125             else dd2[u] = dd2[v];
126             dd1[u] = dd1[v];
127         }
128     }
129     return dd1[u];
130 }
131 int main()
132 {
133     init();
134     int m,i,j,n;
135     scanf("%d",&m);
136     int g = 0;
137     for(i = 1; i <= m ; i++)
138     {
139         scanf("%s",s1);
140         int len = strlen(s1);
141         for(j = 0 ; j <  len; j++) if(s1[j]>='a'&&s1[j]<='z') s1[j]-=32;
142         if(!f[s1])
143         {
144             a[i] = ++g;
145             f[s1] = g;
146         }
147         else a[i] = f[s1];
148         num[a[i]] = judge(s1);
149         dp[a[i]] = len;
150     }
151     scanf("%d",&n);
152     for( i =1 ; i <= n ; i++)
153     {
154         int u,v;
155         scanf("%s%s",s1,s2);
156         int len1 =strlen(s1) ,len2 = strlen(s2);
157         for(j = 0 ; j <  len1; j++) if(s1[j]>='a'&&s1[j]<='z') s1[j]-=32;
158         for(j = 0 ; j <  len2; j++) if(s2[j]>='a'&&s2[j]<='z') s2[j]-=32;
159         if(!f[s1])
160         {
161             u = ++g;
162             f[s1] = g;
163         }
164         else u = f[s1];
165         if(!f[s2])
166         {
167             v = ++g;
168             f[s2] = g;
169         }
170         else v = f[s2];
171         add(u,v);
172         num[u] = judge(s1);
173         num[v] = judge(s2);
174         dp[u] = len1;
175         dp[v] = len2;
176         cd[u].push_back(v);
177     }
178     find_scc(g);
179     for(i = 1 ; i <= g; i++)
180     {
181         int u = sccno[i];
182         for(j = 0 ;j < cd[i].size() ; j++)
183         {
184             int v = sccno[cd[i][j]];
185             if(v==u) continue;
186             ed[u].push_back(v);
187             de[v] = 1;
188         }
189     }
190     memset(vis,0,sizeof(vis));
191     for(i = 1 ; i <= scc; i++)
192     {
193         if(!de[i])
194         {
195             vis[i] = 1;
196             ddfs(i);
197         }
198     }
199     LL ans = 0,sum=0;
200     for(i = 1 ; i<= m; i++)
201     {
202         int u = sccno[a[i]];
203         //cout<<u<<" "<<dd2[u]<<endl;
204         ans+=dd1[u];
205         sum+=dd2[u];
206     }
207     cout<<ans<<" "<<sum<<endl;
208     return 0;
209 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3981462.html