码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #640 (Div. 4) 题解 (EFG)

时间:2020-05-10 00:55:32      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:ack   bit   fine   elements   sel   ons   limits   水过   span   

https://codeforces.com/contest/1352

本题解 \(+\) 熔岩 \(=\) 黑曜石

E. Special Elements

一看 \(n=8000\),就搞个 \(O(n^2)\) 水过吧

先记录 \(cnt[i]=(\ i\) 在数列 \(a\) 中的出现次数 \()\),然后遍历所有长度大于等于2的区间和 \(sum=\sum\limits_{i=l}^r a[i]\),与其对应的special elements个数就是 \(cnt[sum]\)。当然访问过 \(cnt[sum]\) 就后把 \(cnt[sum]\) 清空,避免重复记录

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=8010; typedef long long ll;
int T,n;
int a[N],cnt[N];
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		fill(cnt,cnt+n+2,0);
		int ans=0;
		repeat(i,0,n){
			cin>>a[i];
			cnt[a[i]]++;
		}
		repeat(len,2,n+1){
			int sum=0;
			repeat(i,0,len-1)sum+=a[i];
			repeat(i,len-1,n){
				sum+=a[i];
				if(sum<=n){ans+=cnt[sum]; cnt[sum]=0;}
				sum-=a[i-len+1];
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

F. Binary String Reconstruction

构造题,只要一开始全是0,然后全是1,最后在01之间反复横跳即可

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=8010; typedef long long ll;
int T,n0,n1,n2;
signed main(){
	cin>>T;
	while(T--){
		cin>>n0>>n1>>n2;
		if(n1==0){
			if(n0>0)repeat(i,0,n0+1)cout<<‘0‘;
			if(n2>0)repeat(i,0,n2+1)cout<<‘1‘; //这里n0和n2不可能同时大于0
			cout<<endl;
			continue;
		}
		repeat(i,0,n0+1)cout<<‘0‘;
		repeat(i,0,n2+1)cout<<‘1‘;
		repeat(i,0,n1-1)cout<<char(‘0‘+i%2);
		cout<<endl;
	}
	return 0;
}

G. Special Permutation

叕是构造题,只要倒着输出所有奇数,然后正着输出所有偶数(2和4位置反一下)即可

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=8010; typedef long long ll;
int T,n;
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		if(n>=4){
			repeat_back(i,1,n+1)if(i%2==1)cout<<i<<‘ ‘;
			cout<<"4 2 ";
			repeat(i,5,n+1)if(i%2==0)cout<<i<<‘ ‘;
		}
		else cout<<-1;
		cout<<endl;
	}
	return 0;
}

Codeforces Round #640 (Div. 4) 题解 (EFG)

标签:ack   bit   fine   elements   sel   ons   limits   水过   span   

原文地址:https://www.cnblogs.com/axiomofchoice/p/12861451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!