Codeforces Round #425 (Div. 2))——A题&&B题&&D题

A. Sasha and Sticks

题目链接:http://codeforces.com/contest/832/problem/A

题目意思:n个棍,双方每次取k个,取得多次数的人获胜,Sasha先取,问Sasha是否可以取胜。

代码:

 1 //Author: xiaowuga
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <set>
 5 #include <vector>
 6 #include <queue>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <cstdio>
10 #include <ctime>
11 #include <map>
12 #include <bitset>
13 #include <cctype>
14 #define maxx INT_MAX
15 #define minn INT_MIN
16 #define inf 0x3f3f3f3f
17 #define mem(s,ch) memset(s,ch,sizeof(s))
18 const long long N=100; 
19 using namespace std;
20 typedef long long LL;
21 int main() {
22     ios::sync_with_stdio(false);cin.tie(0);
23     LL n,k;
24     LL ct;
25     cin>>n>>k;
26     if(n%k==0){
27         ct=n/k;
28     }
29     else ct=n/k;
30     if(ct%2){cout<<"YES"<<endl;}
31     else cout<<"NO"<<endl;
32     return 0;
33 }
View Code

B. Petya and Exam

题目链接:http://codeforces.com/contest/832/problem/B

题目意思:一个xjb大模拟。第一行是好字符(26个),除此之外都是坏字符,第二行是B字符串,B中问号可以change为好字符,* 只能change为坏字符串(字符可以有可以0~MAX个),接下来n次询问,每次给出目标C字符串,问B可以change为C么?

思路:这个题真的wa了很多发啊…………,分四种情况:1.询问串长度大于模式串且差大于1;2.询问串长度大于模式串且差等于1,3.询问串长度等于模式串;4.询问串长度小于模式串。

其中在情况1的时候,还要判断是否出现过*,因为可能没有出现过*,整体的思路就是先把*代表东西补出来,然后安慰比较久可以了。

代码:

  1 //Author: xiaowuga
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <set>
  5 #include <vector>
  6 #include <queue>
  7 #include <cmath>
  8 #include <cstring>
  9 #include <cstdio>
 10 #include <ctime>
 11 #include <map>
 12 #include <bitset>
 13 #include <cctype>
 14 #define maxx INT_MAX
 15 #define minn INT_MIN
 16 #define inf 0x3f3f3f3f
 17 #define mem(s,ch) memset(s,ch,sizeof(s))
 18 const long long N=1e5+10;
 19 using namespace std;
 20 char a[N],b[N];
 21 int la,lb,lc,lm;
 22 int check[26]={0};
 23 typedef long long LL;
 24 int main() {
 25     ios::sync_with_stdio(false);cin.tie(0);
 26     cin>>a>>b;
 27     la=strlen(a);lb=strlen(b);
 28     for(int i=0;i<la;i++) check[a[i]-'a']=1;
 29     int n;  
 30     cin>>n;
 31     while(n--){
 32         char c[N];cin>>c;
 33         int  lc=strlen(c);
 34         lm=lb-lc;
 35         int flag=1;
 36         if(lm>1) {cout<<"NO"<<endl;continue;}
 37         else if(lm==1){
 38             int h=0;
 39             for(int i=0;i<lb;i++) if(b[i]=='*') {h=1;break;}
 40             if(h){
 41                 for(int i=0,j=0;j<lc;i++){
 42                     if(b[i]=='*') {continue;}
 43                     else if(b[i]=='?'){
 44                         if(check[c[j]-'a']==0) {flag=0;break;}  
 45                     }
 46                     else if(b[i]!=c[j]){
 47                         flag=0; break;
 48                     }
 49                     j++;
 50                 }
 51             }
 52             else flag=0;
 53             
 54         }
 55         else if(lm==0){
 56             for(int i=0;i<lb;i++){
 57                 if(b[i]=='*'||b[i]=='?'){
 58                     if(b[i]=='*'){
 59                         if(check[c[i]-'a']){flag=0;break;}
 60                     }
 61                     else{
 62                         if(check[c[i]-'a']==0){flag=0;break;}
 63                     }
 64                 }
 65                 else if(b[i]!=c[i]){flag=0;break;}
 66             }
 67         }
 68         else if(lm<0){
 69             char mb[N];
 70             lm=-lm+1;
 71             //cout<<lm<<endl;
 72             int ct=0;
 73             for(int i=0,j=0;i<lb;i++){
 74                 if(b[i]=='*'){
 75                     for(int k=0;k<lm;k++){
 76                        if(check[c[j]-'a']){ mb[ct++]='?';}
 77                        else   mb[ct++]=c[j++];
 78                     }
 79                     continue;
 80                 }
 81                 else if(b[i]=='?'){
 82                     if(check[c[j]-'a']) mb[ct++]=c[j];
 83                     else mb[ct++]='?';
 84                 }
 85                 else if(b[i]!=c[j]) { mb[ct++]=b[i];}
 86                 else mb[ct++]=c[j];
 87                 j++;
 88             }
 89             if(ct<lc) flag=0;
 90             else{
 91                for(int i=0;i<lc;i++){
 92                     if(mb[i]!=c[i]){
 93                         flag=0;break;
 94                     }
 95                } 
 96             }
 97         }
 98         if(flag) cout<<"YES"<<endl;
 99         else cout<<"NO"<<endl;
100         
101     }
102     return 0;
103 }
View Code

D. Misha, Grisha and Underground

题目链接:http://codeforces.com/contest/832/problem/D

题目意思:LCA模板题,可以数到标签的数量等于(dist(a,b)+dist(c,b)-dist(a,c))/2+1。两点之间的距离可以用LCA算出。这里LCA用的是基于DFS序的RMQ算法。

代码:

 1 //Author: xiaowuga
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <set>
 5 #include <vector>
 6 #include <queue>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <cstdio>
10 #include <ctime>
11 #include <map>
12 #include <bitset>
13 #include <cctype>
14 #define maxx INT_MAX
15 #define minn INT_MIN
16 #define inf 0x3f3f3f3f
17 #define mem(s,ch) memset(s,ch,sizeof(s))
18 #define nc cout<<"nc"<<endl
19 const long long N=200000+1000;
20 using namespace std;
21 typedef long long LL;
22 typedef int II;
23 vector<int>p[N];
24 II n,q;
25 II fr[2*N],de[2*N],pos[2*N],tot=0;
26 II d[N][65];
27 void RMQ_init(){
28     for(II i=1;i<=tot;i++) d[i][0]=fr[i];
29     for(II j=1;(1<<j)<=tot;j++)
30         for(II i=1;i+(1<<j)-1<=tot;i++){
31             II x=d[i][j-1];
32             II y=d[i+(1<<(j-1))][j-1];
33             if(de[x]<de[y]) d[i][j]=x;
34             else d[i][j]=y;
35         }
36 }
37 II RMQ(II x,II y){
38     II L=min(pos[x],pos[y]),R=max(pos[x],pos[y]);
39     II k=log((double)(R-L+1))/log(2.0);
40     II t1=d[L][k];
41     II t2=d[R-(1<<k)+1][k];
42     if(de[t1]<de[t2]) return t1;
43     else return t2;
44 }
45 
46 void dfs(II u,II pre,II dep){
47     fr[++tot]=u;pos[u]=tot;de[u]=dep;
48     for(II i=0;i<p[u].size();i++){
49         II v=p[u][i];
50         if(v==pre) continue;
51         dfs(v,u,dep+1);
52         fr[++tot]=u;
53     }
54 }
55 
56 II dist(II x,II y){
57     II qe=RMQ(x,y); 
58     int len=de[x]+de[y]-2*de[qe];
59     return len; 
60 }
61 int main(){
62     ios::sync_with_stdio(false);cin.tie(0);
63     cin>>n>>q;
64     for(II i=2;i<=n;i++){
65         II x;
66         cin>>x;
67         p[i].push_back(x);p[x].push_back(i);
68     } 
69     dfs(1,-1,1);
70     RMQ_init();
71     while(q--){
72         II x,y,z;
73         cin>>x>>y>>z;
74         II t,ans=minn;
75         II lxy=dist(x,y),lxz=dist(x,z),lyz=dist(y,z);
76         t=(lxy+lyz-lxz)/2+1;//y为终点
77         ans=max(t,ans);
78         t=(lxy+lxz-lyz)/2+1;//x为终点
79         ans=max(t,ans);
80         t=(lxz+lyz-lxy)/2+1;//z为终点
81         ans=max(t,ans);
82         cout<<ans<<endl; 
83     }
84     return 0;
85 }
View Code
原文地址:https://www.cnblogs.com/xiaowuga/p/7323122.html