2019.8.15模拟测试

T1 前缀数组

大水题能说啥。。。。。

第三个大样例用freopen和直接打开不一样?

emmmmm。。。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD=1e9+7;
LL ans;

int Read(){
	int i=0,f=1;
	char c=getchar();
	for(;(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-') f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

int main(){
	int num=Read();
	string s;
	cin>>s;
	int len=s.size();
	for(LL i=1;i<=len;++i){
		ans=(ans+i*i%MOD)%MOD;
	}
	cout<<ans;
}

T2 失意

xjb写了个二分74分,本来以为还阔以结果90多起串串。。。。。wtcl

排序后可以发现左端点递增,所以只要保证右端点扩展即可,用堆维护一下就好了

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;

int num;
int n,m;
int ansl,ansr,ans;
struct node{
	int l,r;
	int id;
	friend inline bool operator<(const node &a,const node &b){
		if(a.l==b.l)  return a.r<b.r;
		return a.l<b.l;
	}
}a[MAXN];
priority_queue<int,vector<int>,greater<int> > q;

int Read(){
	int i=0,f=1;
	char c=getchar();
	for(;(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

int main(){
	num=Read();
	n=Read(),m=Read();
	for(int i=1;i<=n;++i)  a[i].l=Read(),a[i].r=Read(),a[i].id=i;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;++i){
		q.push(a[i].r);
		if(q.size()>m)  q.pop();
		if(q.size()==m&&q.top()-a[i].l>ans){
			ans=q.top()-a[i].l;
			ansl=a[i].l,ansr=q.top();
		}
	}
	cout<<ans<<'\n';
	int cnt=0;
	if(ans==0){
		for(int i=1;i<=m;++i)
		  cout<<i<<' ';
		return 0;
	}
	for(int i=1;i<=n;++i){
		if(a[i].l<=ansl&&a[i].r>=ansr)  cout<<a[i].id<<' ',++cnt;
		if(cnt==m)  break;
	}
	return 0;
}

T3 孤独

xjb想了个错误算法鬼知道他就艹过了第二个样例。。。。

正解容斥,对每个状态记录贡献为正或负,将每个出现状态下传到子集,最后扫一遍统计即可

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1<<21;
const LL MAXM=1e5+10;
const LL MOD=1e9+7;

LL num;
LL n,m,k,ans;
LL a[MAXN];
LL flag[MAXN],cnt[MAXN];

LL Read(){
	LL i=0,f=1;
	char c=getchar();
	for(;(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

LL ksm(LL a,LL b){
	LL ret=1;
	while(b){
		if(b&1)  ret=ret*a%MOD;
		b>>=1;
		a=a*a%MOD;
	}
	return ret;
}

int main(){
	num=Read();
	n=Read(),m=Read(),k=Read();
	LL state=1<<n;
	for(LL i=1;i<=m;++i){
		a[i]=Read();
		cnt[a[i]]++;
	}
	flag[0]=-1;
	for(LL i=0;i<state;++i){
		for(LL j=1;j<=n;++j){
			if(!(i&(1<<(j-1)))){
				flag[i+(1<<(j-1))]=flag[i]*(-1);
			}
		}
	}
	for(LL i=1;i<=n;++i){
		for(LL j=state-1;~j;--j){
			if(j&(1<<(i-1))){
				cnt[j-(1<<(i-1))]+=cnt[j];
			}
		}
	}
	for(LL i=1;i<state;++i){
		ans=((ans+flag[i]*ksm(cnt[i],k))%MOD+MOD)%MOD;
	}
	cout<<ans;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值