CF-928(已更新:B C D E)

CF-928

排名四千多,目前为止排名最高的一场~

E题我赛时基本上是猜的结论(但是也推了快一小时才想到有这个可能性),因此目前只能放个码在这(⊙﹏⊙)

D的话现就放个码在这0-^-0

……上一场牛客打得特别烂(⊙﹏⊙),等我补了牛客的再更新-^-


B

分析

观察它的性质,答案为正方形时,所有出现1的行里,1的左右边界一定相等,且这个边界等于出现1的上下边界

操作

用l[]与r[]数组以出现1的行数为下标记录它的左右边界,同时用b与e记录出现1的上下边界,这些行里所有边界一定相等,因此之后再遍历b~e,若满足所有l等于r同时r-l等于e-b,则输出"SQUARE",否则输出"TRIANGLE"

其中左右上下边界的记录是难点,我这里用的是标记,使得左边界只更新一次,右边界一直更新

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,cnt=0,ans=0;cin>>t;
	while(t--){
		cin>>n;
		char a[11][11];
		char op;int l[11],r[11];
		int b,e,fff=0;
		for(int i=1;i<=n;i++){
			int f=0;
			for(int j=1;j<=n;j++){
				cin>>op;//a[i][j];
				if(op=='1'){
					r[i]=j;//只要出现1就更新右边界
					if(f==0){
						l[i]=j;//如果1在此行第一次出现,记录左边界
						f=1;
					}
				}
			}
            //同理记录与更新上下边界
			if(f){
				e=i;
				if(fff==0){
					b=i;
					fff=1;
				}
			}
		}
		int ff=1;
		for(int i=b+1;i<=e;i++){
			if(l[i]==l[i-1]&&r[i]==r[i-1]&&r[i]-l[i]==e-b) continue;
			ff=0;
		}
		if(ff) cout<<"SQUARE";
		else cout<<"TRIANGLE";
		cout<<endl;
	}
	return 0;
}




C

分析

即求1~n的数位之和,同时要注意时间限制是0.5s,意味着我们需要将答案预处理

操作

我们可以遍历1~2e5,用tmp记录i的数位和,再用a数组记录数位和的前缀和,这样在查询时直接输出a[n]就行

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int a[N];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,cnt=0,ans=0;cin>>t;
	string s;
    //预处理
	rep(i,1,2e5){
		int res=0,tp=i;
		while(tp){
			res+=tp%10;
			tp/=10;
		}
		a[i]=res+a[i-1];
	}
	while(t--){
		cin>>n;
		int sum=a[n];
		cout<<sum<<endl;
	}
	return 0;
}




D

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int a[N];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,cnt=0,ans=0;cin>>t;
	while(t--){
		cin>>n;
		map<int,int>mp;
		int c=2147483647;
		rep(i,1,n){
			cin>>a[i];
			mp[a[i]]++;
		}
		ans=0;
		rep(i,1,n){
			if(mp[a[i]^c]&&mp[a[i]]){//计数配对数 
				//cout<<a[i]<<" "<<(a[i]^c)<<endl;
				ans++;
				mp[a[i]]--;
				mp[a[i]^c]--;	
			}
		}
		//计数未配对的 
		for(auto it:mp){
			ans+=it.second;
		}
		cout<<ans<<endl;
	}
	return 0;
}

E

代码

赛时是边写边想,所以最后的注释代码巨长……这里是删了之后的

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
int fp(int b,int p){
	int res=1;
	while(p){
		if(p&1) res=res*b;
		b=b*b;
		p>>=1;
	}
	return res;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,cnt=0,ans=0;cin>>t;
	int k;
	while(t--){
		cin>>n>>k;
		int o,e;
		if(n&1){
			o=n/2+1;
			e=n-o;
		}
		else{
			o=e=n/2;
		}
		if(k<=o){
			cout<<k*2-1<<endl;
			continue;
		}
		k-=o;
        //这里就是公式部分了
		for(int i=1;i<=32;i++){
			int tp=(n/fp(2,i)+1)/2;
			if(k<=tp){
				cout<<(k*2-1)*fp(2,i)<<endl;
				break;
			}
			k-=tp;
		}
	}
	return 0;
}
posted @ 2024-02-20 08:41  mono_4  阅读(37)  评论(0编辑  收藏  举报