zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    二分查找
    二分排序
    How to use hdu?
    HGOI 20200721
    HGOI 20200720
    HGOI 20190719
    HGOI 20200716
    HGOI 20190714
    LCA 的一些扩展算法
    HGOI 20190711
  • 原文地址:https://www.cnblogs.com/xiaowuga/p/7323122.html
Copyright © 2011-2022 走看看