8/12 最小表示法+牛客月赛
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8/12 最小表示法+牛客月赛相关的知识,希望对你有一定的参考价值。
P1368 【模板】最小表示法
用途:求出最小同构串
思路:
1.破环成链,长度扩大为2倍
2.利用三个指针控制,分类跳转,及时淘汰不满足题意 选项。
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
int n;
int s[N];
int get_min(int s[]) //找出最小同构串
for(int i=1;i<=n;i++) s[n+i]=s[i];
int i=1,j=2,k=0;
while(i<=n&&j<=n)
for(k=0;k<n&&s[i+k]==s[j+k];k++);
s[i+k]>s[j+k]?i=i+k+1:j=j+k+1;
if(i==j) j++;
return min(i,j);
void solve()
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
int k=get_min(s);
for(int i=k;i<=n;i++)
cout<<s[i]<<" ";
for(int i=1;i<k;i++)
cout<<s[i]<<" ";
cout<<endl;
signed main()
solve();
return 0;
Sum 小白月赛A
思路:看到要删除数字,第一个想到stl容器。2个情况要考虑到:
1.如果n==1,直接输出0
2.只有将最大的两个数相加加入到容器中,值才会最大。若出现相加结果为0,及时退出。
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
using namespace std;
const int N=5e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n;
priority_queue<int>q;
void solve()
while(!q.empty()) q.pop();
cin>>n;
if(n==1)
cout<<0<<endl;return;
for(int i=1;i<=n;i++)
int x;cin>>x;
q.push(x);
int ans=0;
while(q.size()>1)
int x=q.top();q.pop();
int y=q.top();q.pop();
int tmp=x+y;
if(tmp<0)
break;
ans=(ans+tmp)%mod;
q.push(tmp);
cout<<ans<<endl;
signed main()
int t;cin>>t;
while(t--)
solve();
return 0;
Gaming 小白月赛B
题意:刚开始看这个题意,真的不知道在说啥,
尤其是“如果多次获得编号为 xx 的 debuff,视为身上带有,但仅带有一个”这句话。
只要不带有m个点所有的debuff,就能获得分数
思路:
1.即为能获得所有分数,但要减去一个debuff所在点的分数不能获取。
2.里用差分求出每个点所有的分数,比较出一个最大值。
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
using namespace std;
const int N=7e6+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,m,a[N],b[N];
void solve()
cin>>n>>m;
int sum=0,ans=0;
for(int i=1;i<=n;i++)
int x,y,z;cin>>x>>y>>z;
a[x]+=z;
a[y+1]-=z;
sum+=z;
for(int i=1;i<=m;i++)
b[i]=b[i-1]+a[i];
for(int i=1;i<=m;i++)
ans=max(ans,sum-b[i]);
cout<<ans<<endl;
signed main()
solve();
return 0;
School 小白月赛C
思路:
1.开两个结构数组,进行区间合并 2.结构体内定义排序算法,方便使用lowerbound函数
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=1e3+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,m,h,q;
struct node
int l,r;
bool operator <(const node &e1) const
return r<e1.r;
e[N],g[N];
bool cmp(node e1,node e2)
if(e1.l==e2.l)
return e1.r<e2.r;
return e1.l<e2.l;
void solve()
cin>>n>>h>>m>>q;
for(int i=1;i<=n;i++)
int a,b,c,d;
cin>>a>>b>>c>>d;
e[i].l=a*m+b;
e[i].r=c*m+d;
sort(e+1,e+n+1,cmp);
g[1]=e[1];
int cnt=1;
for(int i=2;i<=n;i++)
if(g[cnt].r<e[i].l)
g[++cnt]=e[i];
else
g[cnt].r=max(g[cnt].r,e[i].r);
while(q--)
int x,y;
cin>>x>>y;
node tmp=x*m+y,x*m+y;
int p=lower_bound(g+1,g+cnt+1,tmp)-g;
if(p>cnt)
cout<<"Yes"<<endl;
else
if(tmp.l>=g[p].l)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
signed main()
ios;
solve();
return 0;
以上是关于8/12 最小表示法+牛客月赛的主要内容,如果未能解决你的问题,请参考以下文章