19-10-31-B
%%%B哥
ZJ一下:
开题。
发现
语文考试????
我不认识XD。老帅哥救我!
后来……
对什么取模???
什么玩意??输入什么??

满足啥??

全是亻
啊!
后来才知道是题楔×了
不管了。
然后发现T1是慢速乘?
我以为是自然数幂和,结果不是。
就一个柿子。
T2想了半天……后来丢一个 set 乱搞。
T3打暴力,后来没调出来……
这是TJ:
T1
慢速乘(=快速加$\Leftarrow$快速幂)
直接等差数列求和。
//sum
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
using namespace std;
LL lx,ly,rx,ry,mod;
LL li,co;
LL mul(LL a,LL b){
	LL res=0;
	a%=mod;
	while(b){
		if(b&1)res=(res+a)%mod;
		a=(a+a)%mod;
		b>>=1;
	}
	return res;
}
int main(){
#ifndef LOCAL
	freopen("sum.in" ,"r",stdin);
	freopen("sum.out","w",stdout);
#endif
	cin>>lx>>ly>>rx>>ry>>mod;
	li=rx-lx+1;
	co=ry-ly+1;
	LL ans=0;
	if(co&1) ans=(ans+mul(mul((co+1)/2,  co),li))%mod;
	else     ans=(ans+mul(mul( co+1   ,co/2),li))%mod;
	if(li&1) ans=(ans+mul(mul((li-1)/2,li  ),co))%mod;
	else     ans=(ans+mul(mul( li-1   ,li/2),co))%mod;
	LL val=((lx%mod+ly%mod)%mod-2+mod)%mod;
	ans=(ans+mul(mul(li,co),val))%mod;
	cout<<ans<<endl;
}
T2
倍增。
这个题是倍增思想的普适思路。
区间合法就先更新,然后将增量倍增。
区间非法就不更新,然后将增量减半。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define N 555555
#define LL long long
using namespace std;
LL lim;
int pn;
LL bo[N],gi[N];
int ans=0;
vector<LL>a,b;
LL check(int l,int r){
	a.clear();
	b.clear();
	for(int i=l;i<=r;i++){
		a.push_back(bo[i]);
		b.push_back(gi[i]);
	}
	sort(a.begin(),a.end());
	sort(b.begin(),b.end());
	LL dat=0;
	for(int i=0;i<a.size();i++){
		dat+=a[i]*b[i];
	}
//	cout<<l<<" "<<r<<" "<<dat<<endl;
	return dat;
}
int main(){
#ifndef LOCAL
	freopen("pair.in" ,"r",stdin);
	freopen("pair.out","w",stdout);
#endif
	cin.sync_with_stdio(false);
	cin>>pn>>lim;
	for(int i=1;i<=pn;i++)
		cin>>bo[i];
	for(int i=1;i<=pn;i++)
		cin>>gi[i];
	for(int i=1;i<=pn;){
		int p=1,r=i;
		ans++;
		while(p!=0){
			if(r+p<=pn&&check(i,r+p)<=lim){
				r+=p;
				p*=2;
			}
			else p/=2;
		}
		i=r+1;
	}
	cout<<ans<<endl;
}
T3
先口古
    Miemeng真的蒻

                
            
        
浙公网安备 33010602011771号