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 }
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 }
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 }