4699如此编码
#include<iostream>
using namespace std;
typedef long long ll;
int a[30];
int main(){
int n;
ll m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll tmp = 1;
for(int i=1;i<=n;i++){
int tmpRes = m%(tmp*a[i])/tmp;
m = m-tmpRes*tmp;
tmp*=a[i];
cout<<tmpRes<<" ";
}
return 0;
}
4729 解密
二元一次方程
关于NO的判断是看的题解,原来这样就能保证有解和精度
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){
int k;
cin>>k;
while(k--){
ll n,e,d;
cin>>n>>e>>d;
ll q,p;
ll sum = n-e*d+2;
ll mul = n;
ll sub = sum*sum-4*mul;
sub = sqrt(sub);
p = (sum-sub)/2;
q = (sum+sub)/2;
if(p>0&&q>0&&p+q==sum){
cout<<p<<" "<<q<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
3729改变数组元素
以为要输入一个处理一次,但其实每个输入就是一个固定的修改区间,可以等输入结束后再处理
易知修改区间的左右坐标,且由暴力的1e9超时可知,区间修改用差分
#include<iostream>
#include<cstring>
using namespace std;
const int maxx = 2e5+10;
int d[maxx],a[maxx];
int main(){
int T,N;
cin>>T;
while(T--){
memset(d,0,sizeof d);
cin>>N;
for(int i=0;i<N;i++){
cin>>a[i];
int l = max(0,i-a[i]+1);
int r = i+1;
d[l]++;
d[r]--;
}
int pre = 0;
for(int i=0;i<N;i++){
d[i]+=pre;
pre=d[i];
if(d[i]>=1){
cout<<"1";
}else{
cout<<"0";
}
cout<<" ";
}
cout<<endl;
}
return 0;
}
789数的范围
二分模板博客
二分模板,l初始为-1,R为n(数组长度),循环结束条件是L+1!=R,然后自己挑是L还是R,L是左边最后一个(upper_bound),R是右边第一个(lower_bound)
int L=-1,R=n;
while(L+1!=R)
{
int mid=L+R>>1;
if(check()) L=mid;
else R=mid;
//最后根据你所分左右两边区间的结果
//选取L或者R作为结果
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//分为左边小于tar,右边大于等于tar
int findl(vector<int> v,int tar){
int L=-1,R=v.size();
while(L+1!=R)
{
int mid=L+R>>1;
if(v[mid]>=tar) R=mid;
else L=mid;
}
return R;
}
//分为左边小于等于tar,右边大于tar
int findr(vector<int> v,int tar){
int L=-1,R=v.size();
while(L+1!=R)
{
int mid=L+R>>1;
if(v[mid]<=tar) L=mid;
else R=mid;
}
return L;
}
int main(){
int N,Q;
cin>>N>>Q;
vector<int> v;
for(int i=0;i<N;i++){
int tmp;
cin>>tmp;
v.push_back(tmp);
}
while(Q--){
int tmp;
cin>>tmp;
//第一个大于等于tmp的
int l = findl(v,tmp);
if(l>v.size()||v[l]!=tmp){
cout<<"-1 -1"<<endl;
continue;
}
int r = findr(v,tmp);
cout<< l << " " << r <<endl;
}
return 0;
}
795 前缀和
水题模板
#include<iostream>
using namespace std;
const int maxx = 1e5+10;
int a[maxx],d[maxx];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
d[i]=a[i]+d[i-1];
}
while(m--){
int l,r;
cin>>l>>r;
cout<<d[r]-d[l-1]<<endl;
}
return 0;
}
797 差分
水题模板
#include<iostream>
using namespace std;
const int maxx = 1e5+10;
int a[maxx],d[maxx];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
d[i]=a[i]-a[i-1];
}
while(m--){
int l,r,change;
cin>>l>>r>>change;
d[l]+=change;
d[r+1]-=change;
}
for(int i=1;i<=n;i++){
d[i]=d[i]+d[i-1];
cout<<d[i]<<" ";
}
return 0;
}