标签:pre else 首字母 银行排队 热点 div 匹配 false ons
思路:因为他是只交换左右子节点,就可以发现同构的树的父亲节点是相同的,所以你只要记住一个结点的父亲节点是什么,判断两棵树上相同点的父亲节点是否相同,就可以判断是否同构。
最后判断下为只有一个结节点的特殊情况。
/* n==1的情况是不符合的 */ #include<bits/stdc++.h> using namespace std; const int maxn=1e5+50; int n,m; int fa1[maxn],fa2[maxn]; struct node { string s1,s2,s3; }e1[maxn],e2[maxn]; int main() { //ios::sync_with_stdio(false); scanf("%d",&n); for(int i=0;i<n;++i) { cin>>e1[i].s1>>e1[i].s2>>e1[i].s3; } scanf("%d",&m); for(int i=0;i<m;++i) { cin>>e2[i].s1>>e2[i].s2>>e2[i].s3; } for(int i=1;i<=n;++i) fa1[i]=i; for(int j=1;j<=m;++j) fa2[j]=j; for(int i=0;i<n;++i) { int num=e1[i].s1[0]-‘A‘+1; if(e1[i].s2!="-") { int cnt=e1[i].s2[0]-‘0‘; fa1[e1[cnt].s1[0]-‘A‘+1]=num; } if(e1[i].s3!="-") { int cnt=e1[i].s3[0]-‘0‘; fa1[e1[cnt].s1[0]-‘A‘+1]=num; } } for(int i=0;i<m;++i) { int num=e2[i].s1[0]-‘A‘+1; if(e2[i].s2!="-") { int cnt=e2[i].s2[0]-‘0‘; fa2[e2[cnt].s1[0]-‘A‘+1]=num; } if(e2[i].s3!="-") { int cnt=e2[i].s3[0]-‘0‘; fa2[e2[cnt].s1[0]-‘A‘+1]=num; } } int flag=0; if(n!=m) flag=1; //if(n==1) flag=1; for(int i=1;i<=n;++i) { if(fa1[i]!=fa2[i]) { flag=1; break; } } if(flag) cout<<"No\n"; else cout<<"Yes\n"; return 0; }
思路:这个题目有点恶心的,给你你需要去掉前导和最后的空格,然后每个之间只能有一个空格,首字母大写,其余的字母都是小,同一句话里面相同的热点只算一次,就可以了。
/* 测试样例1模拟一遍就能过 样例二就是没有更多的情况 样例三就是空格 样例四就是首字母大小写以及去掉一些其他的 按照题目意思的一步步模拟就行了 */ #include<bits/stdc++.h> using namespace std; const int maxn=1e5+50; int t,vis[maxn]; map<string,int>mp; string s; struct data { string s; int cnt=0; bool friend operator<(const data& a,const data &b) { if(a.cnt==b.cnt) return a.s<b.s; return a.cnt>b.cnt; } }e[maxn]; int main() { scanf("%d",&t); getchar(); int num=1; while(t--) { getline(cin,s); for(int i=0;i<num;++i) vis[i]=0; //memset(vis,0,sizeof vis); int flag=0; int st,end; for(int i=0;i<s.size();++i) { if(s[i]==‘#‘) { if(!flag) flag=1,st=i+1; else { end=i-1; for(int i=end;i>=st;--i) { if((s[i]>=‘a‘&&s[i]<=‘z‘)||(s[i]>=‘A‘&&s[i]<=‘Z‘)||s[i]>=‘0‘&&s[i]<=‘9‘) { end=i; break; } } for(int i=st;i<=end;++i) { if((s[i]>=‘a‘&&s[i]<=‘z‘)||(s[i]>=‘A‘&&s[i]<=‘Z‘)||s[i]>=‘0‘&&s[i]<=‘9‘) { st=i; break; } } string ss=""; int nn=0; int ff=-1; for(int i=st;i<=end;++i) { if((s[i]>=‘a‘&&s[i]<=‘z‘)||(s[i]>=‘A‘&&s[i]<=‘Z‘)) { if(nn==0&&(s[i]>=‘a‘&&s[i]<=‘z‘)) { ss+=s[i]-‘a‘+‘A‘; }else if(nn==1&&(s[i]>=‘A‘&&s[i]<=‘Z‘)) { ss+=s[i]-‘A‘+‘a‘; }else { ss+=s[i]; } nn=1; ff=0; } else if(s[i]>=‘0‘&&s[i]<=‘9‘) ss+=s[i],ff=0; else if(!ff) { //if(i!=st&&i!=end&&s[i-1]!=‘ ‘) ss+=s[i]; ss+=‘ ‘; ff=1; } } flag=0; if(ss.size()==0) continue; if(!mp[ss]) { mp[ss]=num; e[num].s=ss; e[num].cnt=1; num++; }else { if(!vis[mp[ss]]) { e[mp[ss]].cnt++; } } vis[mp[ss]]=1; } } } } sort(e+1,e+num+1); // if(num==0) // { // cout<<endl; // cout<<0<<endl; // printf("And 0 more ...\n"); // } //else //{ // for(int i=0;i<num;++i) // { // cout<<e[i].cnt<<" "<<e[i].s<<endl; // } cout<<e[1].s<<endl; cout<<e[1].cnt<<endl; int sum=0; for(int i=2;i<=num;++i) { if(e[i].cnt==e[1].cnt) sum++; else break; } if(sum) printf("And %d more ...\n",sum); //} return 0; }
思路:模拟题,就按照他的题去模拟,但是需要注意的地方
1.你如果那个人没有插队,是按照顺序来的,如果他到达的时间比现在的时间是晚的那么是要加上中间的时间的
2.如果你是插队的,那么如果你的到达时间是晚于现在的时间,那么就是不能插队的。
因为数据比较水吧,你找到下一个点,就直接for一遍就可以了。
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+50; typedef long long ll; int n,m,vis[maxn]; map<string,int>mp,cus; struct { string s; int arr,op; }e[maxn]; bool cmp(string a,string b) { return cus[a]<cus[b]; } vector<string>ans,v[maxn]; int main() { //ios::sync_with_stdio(false); //cin.tie(0); cin>>n>>m; for(int i=1;i<=m;++i) { int l; cin>>l; while(l--) { string name; cin>>name; mp[name]=i; v[i].push_back(name); } } for(int i=1;i<=n;++i) { cin>>e[i].s>>e[i].arr>>e[i].op; cus[e[i].s]=i; if(e[i].op>60) e[i].op=60; } ll tmp=0,sum=0; for(int i=1;i<=n;++i) { if(!vis[i]) { if(e[i].arr>tmp) tmp=e[i].arr; sum+=tmp-e[i].arr; tmp+=e[i].op; ans.push_back(e[i].s); vis[i]=1; // if(mp.find(e[i].s)!=mp.end()) // { // sort(v[i].begin(),v[i].end(),cmp); // for(auto x:v[i]) // { // int id=cus[x]; // if(e[id].arr>tmp) break; // else if(vis[id]) continue; // else // { // sum+=tmp-e[id].arr; // tmp+=e[id].op; // ans.push_back(x); // vis[id]=1; // } // } // } if(mp.find(e[i].s)!=mp.end()) { for(int j=i+1;j<=n;++j) { if(e[j].arr>tmp) break; if(!vis[j]&&mp[e[i].s]==mp[e[j].s]) { if(e[j].arr<=tmp) { sum+=tmp-e[j].arr; if(e[j].op>60) e[j].op=60; tmp+=e[j].op; vis[j]=1; ans.push_back(e[j].s); } } } } } } for(auto x:ans) { cout<<x<<endl; } //cout<<sum<<endl; printf("%.1lf\n",1.0*sum/n); return 0; }
题意:给你个string,反转其中一个,看是否能够完全匹配
思路:直接模拟好像可以过一个,然后这道题可以用线段树,"("看成1,”)”看成-1,那么你去维护一个sum数组,当他整个区间的和为0是就是可以的,然后还要考考虑 ,如果“)”在“(“前面的情况
,维护一个minn数组,就可以了
// #include<bits/stdc++.h> // using namespace std; // const int maxn=1e5+50; // char s[maxn]; // int n,m; // int main() // { // ios::sync_with_stdio(false); // cin.tie(0) // cin>>n>>m; // cin>>s+1; // int len=strlen(s+1); // while(m--) // { // int x; // cin>>x; // if(n%2==1) // { // cout<<"No\n"; // } // else // { // if(s[x]==‘(‘) s[x]=‘)‘; // else s[x]=‘(‘; // int sum=0; // int flag=0; // for(int i=1;i<=len;++i) // { // if(s[i]==‘(‘) sum++; // else sum--; // if(sum<0) // { // flag=1; // break; // } // } // if(sum!=0) flag=1; // if(flag) cout<<"No\n"; // else cout<<"Yes\n"; // } // } // return 0; // } #include<bits/stdc++.h> using namespace std; const int maxn=1e5+50; char s[maxn]; int sum[maxn<<2],minn[maxn<<2]; void up(int rt,int l,int r,int pos,int x) { if(l==r&&l==pos) { sum[rt]=x; return ; } int mid=(l+r)>>1; if(pos<=mid) up(rt<<1,l,mid,pos,x); else up(rt<<1|1,mid+1,r,pos,x); sum[rt]=sum[rt<<1]+sum[rt<<1|1]; minn[rt]=min(minn[rt<<1],sum[rt<<1]+minn[rt<<1|1]); } int n,m; int main() { scanf("%d%d",&n,&m); cin>>s+1; memset(sum,0,sizeof sum); memset(minn,0,sizeof minn); for(int i=1;i<=n;++i) { if(s[i]==‘(‘) up(1,1,n,i,1); else up(1,1,n,i,-1); } while(m--) { int x; scanf("%d",&x); if(s[x]==‘(‘) { s[x]=‘)‘; up(1,1,n,x,-1); }else { s[x]=‘(‘; up(1,1,n,x,1); } if(sum[1]==0&&minn[1]==0) { cout<<"Yes\n"; }else cout<<"No\n"; } return 0; }
思路:二分答案。(二分有点弱,要加强一下)
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+50; int n,m; int a[maxn]; int main() { ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;++i) cin>>a[i]; sort(a+1,a+n+1); int l=a[1],r=a[n]; cout<<a[1]<<" "<<a[n]<<endl; while(l<r) { int mid=(l+r)>>1; int last=1,cnt=1 ; for(int i=2;i<=n;++i) { if(a[i]-a[last]>=mid) cnt++,last=i; } if(cnt>=m) l=mid+1; else r=mid-1; } cout<<l<<endl; return 0; }
标签:pre else 首字母 银行排队 热点 div 匹配 false ons
原文地址:https://www.cnblogs.com/passawayy/p/13905149.html