Codeforces Round 895 (Div. 3) A-G

未完 暂时只有赛时写出来的A-F的AC代码
还有E的TLE代码 等我今天把题目补完

在这里插入图片描述

A

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;}
signed main(){
	int t;
	cin>>t;
	while(t--){
		double a,b,c;
		cin>>a>>b>>c;
		double ans=abs(a-b);
		if(ans==0.0){
			cout<<0<<endl;
			continue;
		}
		ans/=2;
		double count=ans/c;
		int use=count;
		count+=0.999;
		int use1=count;
		if(use==use1){
			cout<<use<<endl;
		}
		else cout<<use+1<<endl;
	}
	return 0;
}

B

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;}
int d,s,n;
signed main(){
	int t;
	cin>>t;
	
	while(t--){
		int far=0x3f3f3f3f;
		cin>>n;
		for(int i=1;i<=n;i++){
			d=read();
			s=read();
			if(far>d+(s-1)/2){
				far=d+(s-1)/2;
			}
		}
		cout<<far<<endl;
	}
	return 0;
}

C

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
	int t;
	cin>>t;
	while(t--){
		int a,b;
		bool f=1;
		cin>>a>>b;
		if(a==b&&a%2==1){
			for(int i=3;i<=sqrt(b);i+=2){
				if(a%i==0){
					if(a/i==1){
						break;
					}
					cout<<a/i<<' '<<a/i*(i-1)<<endl;
					f=0;
					break;
				}
			}
			if(f==1){
				cout<<-1<<endl;
			}
			continue;
		}
		
		for(int i=a;i<=b;i++){
			if(i%2==0&&i!=2){
				cout<<i/2<<' '<<i/2<<endl;
				f=0;
				break;
			}
		}
		if(f) cout<<-1<<endl;
	}
	return 0;
}

D

#include<bits/stdc++.h>
#define int long long
using namespace std;

int gcd(int a, int b) {
    return b > 0 ? gcd(b, a % b) : a;
}

int lcm(int a, int b) {
    return a / gcd(a, b) * b; // Prevent overflow
}

inline int read() {
    int x = 0, f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
    return x * f;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        int n, x, y;
        n = read();
        x = read();
        y = read();
        int use = lcm(x, y);
        int a = n / x;
        int b = n / y;
        int c = n / use;
        int num = 0;

        num += (n * (n + 1) / 2) - ((n - (a - c)) * (n - (a - c) + 1) / 2);
        num -= (b - c) * (b - c + 1) / 2;

        cout << num << endl;
    }
    return 0;
}

E(TLE)

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*f;
}
int a[100005],q;
int prefix[100005];
signed main() {
	//freopen("TEST.cpp","w",stdout);
	int t;
	t=read();
	while (t--) {
		int n;
		n=read();
		for(int i=1; i<=n; i++) {
			cin>>a[i];
			if(i==0) {
				prefix[i]=a[i];
			} else prefix[i]=prefix[i-1]^a[i];
		}
		char s[100005];
		cin>>(s+1);
		q=read();
		while(q--){
			int b;
			b=read();
			if(b==1){
				int l,r;
				cin>>l>>r;
				for(int i=l;i<=r;i++){
					if(s[i]=='0') s[i]='1';
					else s[i]='0';
				}
			}
			else{
				int g;
				cin>>g;
				int result=0;
				for(int i=1;i<=n;i++){
					if(s[i]-'0'==g){
						if(i==0){
							result^=prefix[1];
						}
						else result^=prefix[i]^prefix[i-1];
					}
				}
				cout<<result<<' ';
			}
		}
		cout<<endl;
	}
	return 0;
}

E (AC)
这个还是讲一下吧,比赛的时候写了一个暴力+前缀和的代码,想着div3就没有计算时间复杂度…结果TLE了然后最后15分钟疯狂的搞线段树也没搞出来/(ㄒoㄒ)/~~赛后发现别人的写法根本没用到线段树…

正解
查询:
题目每次查询所有s[i]为0或s[i]为1的a[i]异或和可以直接存储
修改:
因为XOR相同为0不同为1 所以很显然两个十进制的数相互XOR的结果为0 那么就可以介入前缀和啦 使用xorSum表示a[i]前缀异或和当a[l~r]需要修改的时候,我们只需要把a[i]在l-r区间上的变化量求出来,因为xorSum[r]^xorSum[l-1] 等于区间l到r翻转后的a值所以再异或存储的就行(估计讲的不太好 建议多看看代码,自己模拟模拟)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005],xorSum[100005];
signed main() {
	int t;
	cin>>t;
	while(t--){
		memset(xorSum,0,sizeof(xorSum));
		int n;
		cin>>n;
		int xorzero=0;
		int xorone=0;
		for(int i=0;i<n;i++){
			cin>>a[i];
			xorSum[i+1]=xorSum[i]^a[i];
		}
		string s;
		cin>>s;
		for(int i=0;i<n;i++){
			if(s[i]=='0') {
				xorzero^=a[i];
			}
			else {
				xorone^=a[i];
			}
		}
		int q;
		cin>>q;
		while(q--){
			int x;
			cin>>x;
			if(x==2){
				int g;
				cin>>g;
				if(g==0){
					cout<<xorzero<<' '<<endl;
				}
				else{
					cout<<xorone<<' '<<endl;
				}
			}
			else{
				int l,r;
				cin>>l>>r;
				int xorSumLR=xorSum[r]^xorSum[l-1];
				xorone^=xorSumLR;
				xorzero^=xorSumLR;
			}
		}
	}
	return 0;
}

F

#include<bits/stdc++.h>
#define int long long
using namespace std;
int mod=1000000007;
int idx=0;
int mini=0x3f3f3f3f;
void dfs(int i,int adj[],bool vis[],int c[],vector<int>&order){
	vis[i]=1;
	int par=adj[i];
	order.push_back(i);
	if(c[i]<=mini){
		mini=c[i];
		idx=i;
	}
	if(vis[par]==0){
		dfs(par,adj,vis,c,order);
	}
}
int par[100005],c[100005],inedges[100005];
bool vis[100005];

signed main(){
	int t=1;
	cin>>t;
	while(t--){
		memset(vis,0,sizeof(vis)); 
		memset(inedges,0,sizeof(inedges));
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>par[i];
			inedges[par[i]]++;
		}
		for(int i=1;i<=n;i++){
			cin>>c[i];
		}
		queue<int>q;
		vector<int> ans;
		for(int i=1;i<=n;i++){
			if(inedges[i]==0){
				q.push(i);
			}
		}
		while(!q.empty()){
			int curr=q.front();
			vis[curr]=1;
			inedges[par[curr]]--;
			ans.push_back(curr);
			q.pop();
			if(inedges[par[curr]]==0){
				q.push(par[curr]);
			}
		}
		for(int i=1;i<=n;i++){
			if(vis[i]==0){
				idx=-1;
				vector<int> order;
				mini=0x3f3f3f3f;
				dfs(i,par,vis,c,order);
				int id= 1;
				for(int j=0;j<order.size();j++){
					if(order[j]==idx){
						id=j;
						break;
					}
				}
				for(int j=id+1;j<order.size();j++){
					ans.push_back(order[j]);
				}
				for(int j = 0; j < id; j++) {
					ans.push_back(order[j]);
				}
				ans.push_back(idx);

			}
		}
		for(int i=0;i<ans.size();i++){
			cout<<ans[i]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

还有,如果想在比赛的时候要代码,可以私信我,如果人数足够了,我就再开一个账号,专门在比赛时候给大家免费发代码 关注我就行 谢谢啦O(∩_∩)O
喜欢的点个攒吧,谢谢了 今天6点前把所有题都补上

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值