Educational Codeforces Round 87 (Rated for Div. 2)

题目在这

A. Alarm Clock

一个人要睡够a分钟,一开始睡了b分钟,闹钟响了,如果没睡足a分钟,那么他就将闹钟调后c分钟,同时要花d分钟再次入睡。
问:睡够a分钟需要多久

#include
using namespace std;
#define int long long
#define mem(a) memset(a,0,sizeof(a))
#define lb(x) (x&(-x))
const int inf=0x3f3f3f3f;
const long long mod=1e9+7;
const int maxn=1e5+5;
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); 
    int t;cin>>t;
    while(t--){
    	int a,b,c,d;
    	cin>>a>>b>>c>>d;
    	//一开始没睡够,且后面补不上
    	if(a>b&&c<=d){
    		cout<<-1<<endl;
    		continue;
	    }
	    //一开始就睡够了
	    if(a<=b){
	    	cout<<b<<endl;
		}
		else{
			a-=b;//还要睡多久 
			int rest=a/(c-d);
			if(a%(c-d)!=0){
				rest++;
			}
			int ans=b;
			ans+=rest*c;
			cout<<ans<<endl;
		}
	}
}

B. Ternary String

一个包含‘1’或‘2’或‘3’的字符串,求他的最短“相似子串”长度。
(相似子串:同时包含1,2,3)

思路:从前往后遍历,记录在当前位置之前,1,2,3分别出现的离 当前位置最近 的位置,如果1,2,3都出现了的话,就可以更新ans:
ans = min(ans,max(a,max(b,c)-min(a,min(b,c))+1)

如果直到最后ans还没被更新,也就是ans == inf 那么就说明1,2,3至少有一个没出现。

#include
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define lb(x) (x&(-x))
const int inf=0x3f3f3f3f;
const long long mod=1e9+7;
const int maxn=2e5+5;
signed main(){
    std::ios::sync_with_stdio(false);
    int t;cin>>t;
    while(t--){
    	string s;
		cin>>s;
		int a=0,b=0,c=0,ans=inf;
		for(int i=0;i<s.size();i++){
			if(s[i]=='1'){
				a=i+1;
			}
			if(s[i]=='2'){
				b=i+1;
			}
			if(s[i]=='3'){
				c=i+1;
			}
			if(a&&b&&c){
				ans=min(ans,max(a,max(b,c))-min(a,min(c,b))+1);
			}
		}
		if(ans==inf) cout<<0<<endl;
		else cout<<ans<<endl;
	}
}

C.Simple Polygon Embedding

求包含一个正多边形的 最小正方形的边长

c1:n为奇数
c2: n为偶数
找规律题,据说c2旋转度数是不变的。
有时间再更吧

D. Multiset

树状数字组
不懂什么是树状数组点这里
a[i]表示 小于等于i的数出现的次数;)
添加元素x,就是在x的出现次数+1(add(i,1);
删除第k大的元素:二分搜索
找出最左端的大于等于k的a[i],满足a[i-1]

#include
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define lb(x) (x&(-x))
const int inf=0x3f3f3f3f;
const long long mod=1e9+7;
const int maxn=1e6+10;
int a[maxn];
void add(int x,int v=1){
	for(;x<maxn;x+=lb(x)){
		a[x]+=v;
	}
} 
int query(int x){
	int sum=0;
	for(;x>0;x-=lb(x)){
		sum+=a[x];
	}
	return sum;
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); 
    int n,q;
    cin>>n>>q;
    int x;
    for(int i=1;i<=n;i++){
    	cin>>x;
    	add(x,1);
	}
	int t;
	while(q--){
		cin>>t;
		if(t>0) add(t,1);
		else{
			t=-t;
			int l=1,r=maxn,mid;
			while(l<r){
				mid=(l+r)>>1;
				if(query(mid)>=t) r=mid;
				else l=mid+1;
			}
			add(r,-1);
		}
	}
	int flag=0;
	for(int i=1;i<=maxn;i++){
		if(query(i)-query(i-1)>0){
			cout<<i<<endl;
			flag=1;
			break;
		}
	}
	if(!flag) cout<<0<<endl;
}

你可能感兴趣的:(Educational Codeforces Round 87 (Rated for Div. 2))