水题场。。。。
结果因为D题看错题意,B题手贱写残了。。。现场只出了A,C,E
A:水题。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f; int main() { int n; scanf("%d",&n); int s=n%10; if(s<10-s)printf("%d ",n-s); else printf("%d ",n+10-s); return 0; } /******************** ********************/
B:水题。。。直接暴力,不用exgcd
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f; int main() { ll n,a,b; scanf("%lld%lld%lld",&n,&a,&b); for(ll i=0;i<=10000000;i++) { if(n-b*i>=0&&(n-b*i)%a==0) { puts("YES"); printf("%lld %lld ",(n-b*i)/a,i); return 0; } } puts("NO"); return 0; } /******************** ********************/
C:把同一个人的电话合在一起,一个电话是另一个电话的后缀代表相同,直接暴力模拟即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=30+10,maxn=90000+10,inf=0x3f3f3f3f; map<string,int>ma; string s[N]; vector<string>v[N]; bool ok[2000+10]; bool cmp(string a,string b) { return a.size()>b.size(); } int main() { fio; int n,sz=0; cin>>n; for(int i=1;i<=n;i++) { string p; cin>>p; if(ma[p]) { int id=ma[p],k; cin>>k; while(k--) { cin>>p; v[id].pb(p); } } else { s[++sz]=p; ma[p]=sz; int k; cin>>k; while(k--) { cin>>p; v[sz].pb(p); } } } cout<<sz<<" "; for(int i=1;i<=sz;i++) { sort(v[i].begin(),v[i].end(),cmp); memset(ok,1,sizeof ok); for(int j=0;j<v[i].size();j++) { for(int k=j+1;k<v[i].size();k++) { string a=v[i][j],b=v[i][k]; if(a.size()>=b.size()) { if(a.substr(a.size()-b.size(),b.size())==b)ok[k]=0; } } } cout<<s[i]<<" "; int ans=0; for(int j=0;j<v[i].size();j++)if(ok[j])ans++; cout<<ans<<" "; for(int j=0;j<v[i].size();j++) if(ok[j]) cout<<v[i][j]<<" "; cout<<" "; } return 0; } /******************** ********************/
D:题意:一整天内,如果连续m分钟里,闹钟响了k次,那么人会被吵醒,要使人不被吵醒找到最小需要关闭的闹钟个数
题解:先sort,然后边处理边维护前缀和,处理的时候找到,当前到前m时刻有多少个闹钟,如果已经有k-1个,那么当前闹钟必须被关闭,可以简略的证明,如果一个闹钟对两个时间段有影响,那么它一定在两个时间段相交的部分里,所以,前缀和维护 是可行的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f; int a[N],sum[N*10]; bool ok[N*10]; int main() { int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); ok[a[i]]=1; } sort(a+1,a+1+n); int ans=0; for(int i=1;i<=1000000;i++) { if(!ok[i])sum[i]=sum[i-1]; else { // cout<<sum[i-1]<<"----"<<sum[max(0,i-m)]<<"+++ "; if(sum[i-1]-sum[max(0,i-m)]==k-1) { ans++; sum[i]=sum[i-1]; } else sum[i]=sum[i-1]+1; } } printf("%d ",ans); return 0; } /******************** ********************/
E:题意:n个数,每次操作对一个数+1或-1,要求最小操作次数使得n个数里有n/2个是完全平方数
题解:对于每一个数,如果是完全平方数,我们维护最小需要多少次操作使他变成不是完全平方数,否则,看最小多少次操作变成完全平方数,然后sort一下,比较即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=200000+10,maxn=90000+10,inf=0x3f3f3f3f; ll a[N]; map<ll,ll>ma; ll c[N],po[N]; vector<ll>issq,notsq; int main() { for(ll i=0;i<=40000;i++)ma[i*i]=i,po[i]=i*i; ll n,sq=0; scanf("%lld",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); if(ma[a[i]]||a[i]==0) { sq++; if(a[i]==0)c[i]=2; else c[i]=1; issq.pb(c[i]); } else { int id=lower_bound(po,po+40001,a[i])-po; c[i]=min(po[id]-a[i],a[i]-po[id-1]); notsq.pb(c[i]); } } sort(issq.begin(),issq.end()); sort(notsq.begin(),notsq.end()); ll ans=0; if(sq>n/2) { for(int i=0;i<sq-n/2;i++) ans+=issq[i]; } else { for(int i=0;i<n/2-sq;i++) ans+=notsq[i]; } printf("%lld ",ans); return 0; } /******************** ********************/
F:题意:有一个很长的数,要求插入+,=使条件满足a+b=c,所有数不能有前导零
题解:对于长度为sz的数c,a要么长度为sz,sz-1,b要么长度sz,sz-1,只有四种情况(想到了这一点,但是高精度把我搞蒙蔽了,还是tle,学到了新姿势字符串Hash)
字符串Hash方便的判断两个字符串是否相同,推荐博客:字符串hash
我们以10为底,这样就可以满足线性关系了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=1000000+10,maxn=200000+10,inf=0x3f3f3f3f; const ll ba=10; ll p[N],Hash[N]; string s; void init() { p[0]=1,Hash[0]=s[0]-'0'; for(int i=1;i<=1000000+3;i++)p[i]=p[i-1]*ba%mod; for(int i=1;i<s.size();i++) { Hash[i]=Hash[i-1]*ba%mod+s[i]-'0'; if(Hash[i]>=mod)Hash[i]-=mod; } } bool check(int a,int b) { //cout<<a<<" "<<b<<endl; if(s[0]=='0'&&a!=1)return 0; if(s[a]=='0'&&b-a!=1)return 0; ll aa=Hash[a-1],bb=(Hash[b-1]-Hash[a-1]*p[b-a]%mod)%mod; ll cc=(Hash[s.size()-1]-Hash[b-1]*p[s.size()-b]%mod)%mod; // cout<<(aa+bb+mod)%mod<<"++++++ "<<(cc+mod)%mod<<endl; return (aa+bb+mod)%mod==(cc+mod)%mod; } int main() { fio; cin>>s; init(); for(int i=0;i<s.size();i++) { int sz=s.size()-i; if(2*sz<s.size()) { int a=sz,b=s.size()-sz; if(a<=sz&&b-a<=sz&&check(a,b)) { cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<" "; return 0; } a=s.size()-2*sz,b=s.size()-sz; if(a<=sz&&b-a<=sz&&check(a,b)) { cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<" "; return 0; } } if(2*sz-1<s.size()) { int a=sz-1,b=s.size()-sz; if(a<=sz&&b-a<=sz&&check(a,b)) { cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<" "; return 0; } a=s.size()-2*sz+1,b=s.size()-sz; if(a<=sz&&b-a<=sz&&check(a,b)) { cout<<s.substr(0,a)<<"+"<<s.substr(a,b-a)<<"="<<s.substr(b,s.size())<<" "; return 0; } } } return 0; } /******************** ********************/