Problem A 斑羚飞渡
https://ac.nowcoder.com/acm/contest/917/A
题意:
题解:
C++版本一
Problem B 诡异的因数
https://ac.nowcoder.com/acm/contest/917/B
题意:求因子个数
题解:暴力试除法,强力试除即可。
C++版本一
题解:暴力
#include<stdio.h>
int a[10005];
int main(){
int t,k;
scanf("%d",&t);
for(int i = 1 ; i <= 10000 ; i ++ )
for(int j = 1 ; i*j <= 10000 ; j ++ )
a[i*j]++;
while(t--){
scanf("%d",&k);
printf("%d\n",a[k]);
}
return 0;
}
C++版本二
题解:筛法
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a[N];
char str;
struct node{};
int D[M];
int pre[M];
bool prime[M];
int num[N];
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
D[1]=1;
prime[0]=prime[1]=1;
for(int i=2;i<M;i++){
if(!prime[i]){
D[i]=2;
pre[++cnt]=i;
num[i]=1;
}
for(int j=1;j<=cnt&&i*pre[j]<M;j++){
prime[i*pre[j]]=1;
D[i*pre[j]]=D[i]*2;
num[i*pre[j]]=1;
if(i%pre[j]==0){
num[i*pre[j]]=num[i]+1;
D[i*pre[j]]=D[i]/num[i*pre[j]]*(num[i*pre[j]]+1);
break;
}
}
//cout<<i<<" "<<D[i]<<endl;
}
scanf("%d",&t);
while(t--){
scanf("%d",&n);
cout<<D[n]<<endl;
}
#ifdef DEBUG
printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
//cout << "Hello world!" << endl;
return 0;
}
Problem C 表单
https://ac.nowcoder.com/acm/contest/917/C
题意:
题解:
C++版本一
题解:set
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a[N];
string str;
struct node{};
set<string>st;
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
//scanf("%d",&t);
//while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
cin>>str;
if(st.count(str))cnt++;
st.insert(str);
}
while(m--){
scanf("%d",&k);
if(k==1){
cin>>str;
if(st.count(str)){
cnt++;
}else{
st.insert(str);
}
}else{
cout<<cnt<<endl;
cnt=0;
}
}
//}
#ifdef DEBUG
printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
//cout << "Hello world!" << endl;
return 0;
}
Problem D 分数的运算
https://ac.nowcoder.com/acm/contest/917/D
题意:
题解:
C++版本一
题解:模拟
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
ll t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a[N];
char str;
struct node{};
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
//scanf("%d",&t);
//while(t--){
scanf("%lld%lld%lld%lld",&n,&m,&u,&v);
k=n*v+m*u;
p=m*v;
ll gcd=__gcd(k,p);
cout<<k/gcd<<" "<<p/gcd<<endl;
k=n*v-m*u;
p=m*v;
gcd=__gcd(k,p);
if(k==0)cout<<0<<" "<<0<<endl;
else cout<<k/gcd<<" "<<p/gcd<<endl;
k=n*u;
p=m*v;
gcd=__gcd(k,p);
cout<<k/gcd<<" "<<p/gcd<<endl;
k=n*v;
p=m*u;
gcd=__gcd(k,p);
cout<<k/gcd<<" "<<p/gcd<<endl;
//}
#ifdef DEBUG
printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
//cout << "Hello world!" << endl;
return 0;
}
Problem E 希望
https://ac.nowcoder.com/acm/contest/917/E
题意:
题解:01背包+线段树+lazy
C++版本一
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
ll ans,cnt,flag,temp,sum;
int a[N];
ll dp[N];
int c[N];
ll tree[N<<2];
ll lazy2[N<<2];
char str;
struct node{};
void pushup(int rt){
tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);
}
void pushdown(int l,int r,int rt){
tree[rt<<1]=min(tree[rt<<1],lazy2[rt]);
tree[rt<<1|1]=min(tree[rt<<1|1],lazy2[rt]);
lazy2[rt<<1|1]=min(lazy2[rt<<1|1],lazy2[rt]);
lazy2[rt<<1]=min(lazy2[rt<<1],lazy2[rt]);
lazy2[rt]=INF;
}
void build(int l,int r,int rt){
lazy2[rt]=INF;
if(l==r){
//scanf("%lld",&tree[rt]);
tree[rt]=INF;
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void updata(int l,int r,int rt,int L,int R,ll C){
if(L<=l&&r<=R){
tree[rt]=min(tree[rt],C);
lazy2[rt]=min(lazy2[rt],C);
return;
}
int mid=(l+r)>>1;
pushdown(l,r,rt);
if(L<=mid)updata(l,mid,rt<<1,L,R,C);
if(mid<R)updata(mid+1,r,rt<<1|1,L,R,C);
pushup(rt);
}
void see(int l,int r,int rt){
if(l==r){
c[l]=tree[rt];//printf("%lld%c",tree[rt]," \n"[r==n]);
return;
}
int mid=(l+r)>>1;
pushdown(l,r,rt);
see(l,mid,rt<<1);
see(mid+1,r,rt<<1|1);
pushup(rt);
}
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
//scanf("%d",&t);
//while(t--){
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&l,&r,&p);
updata(1,n,1,l,r,p);
}
see(1,n,1);
for(int i=1;i<=n;i++){
if(a[i]<0)
for(int j=k;j>=c[i];j--){
dp[j]=max(dp[j],dp[j-c[i]]-a[i]);
}
}
//cout<<sum+dp[k]<<endl;
printf("%lld\n",sum+dp[k]);
//}
#ifdef DEBUG
printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
//cout << "Hello world!" << endl;
return 0;
}
Problem F 跳跃的旋律
https://ac.nowcoder.com/acm/contest/917/F
题意:
题解:
C++版本一
Problem G FTOS的测试
https://ac.nowcoder.com/acm/contest/917/G
题意:
题解:
C++版本一
Problem H 数据结构题
https://ac.nowcoder.com/acm/contest/917/H
题意:
题解:
C++版本一
题解:二分
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=20180623;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a[N];
char str;
struct node{};
vector<int>V[N];
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
//scanf("%d",&t);
//while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
V[a[i]].push_back(i);
}
for(int i=1;i<=m;i++){
scanf("%d%d%d%d%d",&l,&r,&u,&v,&k);
if(l>r)swap(l,r);
if(u>v)swap(u,v);
ll x=upper_bound(V[k].begin(),V[k].end(),r)-lower_bound(V[k].begin(),V[k].end(),l);
ll y=upper_bound(V[k].begin(),V[k].end(),v)-lower_bound(V[k].begin(),V[k].end(),u);
cout<<x%MOD<<endl;
cout<<y%MOD<<endl;
cout<<x*y%MOD<<endl;
}
//}
#ifdef DEBUG
printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
//cout << "Hello world!" << endl;
return 0;
}
C++版本二
题解:主席树
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define PII pair<int,int >
#define FI first
#define SE second
#define PB push_back
#define POP pop_back
#define endl '\n'
const int N=1000005;
const int mod=20180623;
struct dat{
int ls,rs,v;
}tr[N<<2];
int s[N];
int cnt;
int ss[N];
int build(int l,int r){
int pos=++cnt;
//cout<<l<<' '<<r<<' '<<pos<<endl;
if(l==r){
tr[pos].v=0;
//cout<<s[l]<<endl;
return pos;
}
int mid=l+r>>1;
tr[pos].ls=build(l,mid);
tr[pos].rs=build(mid+1,r);
return pos;
}
int update(int x,int l,int r,int loc,int value){
int pos=++cnt;
//cout<<pos<<endl;
if(l==r){
tr[pos].v=value;
return pos;
}
int mid=l+r>>1;
if(loc<=mid){
tr[pos].rs=tr[x].rs;
tr[pos].ls=update(tr[x].ls,l,mid,loc,value);
}
else{
tr[pos].ls=tr[x].ls;
tr[pos].rs=update(tr[x].rs,mid+1,r,loc,value);
}
return pos;
}
int f(int x,int l,int r,int loc){
if(l==r)return tr[x].v;
int mid=l+r>>1;
if(mid>=loc)return f(tr[x].ls,l,mid,loc);
else return f(tr[x].rs,mid+1,r,loc);
}
int ed[N];
int main()
{
int n,m,v,op,loc,value;
while(~scanf("%d%d",&n,&m)){
build(-100000,100000);
ed[0]=1;
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
int xxx=f(ed[i-1],-100000,100000,s[i])+1;
ed[i]=update(ed[i-1],-100000,100000,s[i],xxx);
}
int l,r,ll,rr,x;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d%d",&l,&r,&ll,&rr,&x);
if(l>r)swap(l,r);
if(ll>rr)swap(ll,rr);
LL p=f(ed[r],-100000,100000,x)-f(ed[l-1],-100000,100000,x);
LL q=f(ed[rr],-100000,100000,x)-f(ed[ll-1],-100000,100000,x);
cout<<p<<endl;
cout<<q<<endl;
cout<<p%mod*q%mod<<endl;
}
}
return 0;
}
Problem I y大的字符串
https://ac.nowcoder.com/acm/contest/917/I
题意:
题解:
C++版本一
Problem J 外挂
https://ac.nowcoder.com/acm/contest/917/J
题意:
题解:线段树+数学
C++版本一
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
//const int MOD=10000+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q,p;
int ans,cnt,flag,temp,sum;
ll tree[N<<2];
ll tree2[N<<2];
ll lazy2[N<<2];
char str;
struct node{};
ll POW(ll a,int b){
if (b==1) return a;
if (b==2) return a*a;
return 1;
}
void pushup(int rt){
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
tree2[rt]=tree2[rt<<1]+tree2[rt<<1|1];
}
void pushdown(int l,int r,int rt){
if(lazy2[rt]){
int mid=(l+r)>>1;
int llen=(mid-l+1);
int rlen=(r-mid);
tree2[rt<<1]=tree2[rt<<1]+llen*POW(lazy2[rt],2)+2*tree[rt<<1]*lazy2[rt];
tree2[rt<<1|1]=tree2[rt<<1|1]+rlen*POW(lazy2[rt],2)+2*tree[rt<<1|1]*lazy2[rt];
tree[rt<<1]=tree[rt<<1]+llen*lazy2[rt];
tree[rt<<1|1]=tree[rt<<1|1]+rlen*lazy2[rt];
lazy2[rt<<1]=lazy2[rt<<1]+lazy2[rt];
lazy2[rt<<1|1]=lazy2[rt<<1|1]+lazy2[rt];
lazy2[rt]=0;
}
}
void build(int l,int r,int rt){
lazy2[rt]=0;
if(l==r){
scanf("%lld",&tree[rt]);
//tree[rt]=0;
tree2[rt]=tree[rt]*tree[rt];
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void updata(int l,int r,int rt,int L,int R,ll C){
if(L<=l&&r<=R){
int len=r-l+1;
tree2[rt]=tree2[rt]+(len*POW(C,2))+2*tree[rt]*C;
tree[rt]=tree[rt]+len*C;
lazy2[rt]=lazy2[rt]+C;
return;
}
int mid=(l+r)>>1;
pushdown(l,r,rt);
if(L<=mid)updata(l,mid,rt<<1,L,R,C);
if(mid<R)updata(mid+1,r,rt<<1|1,L,R,C);
pushup(rt);
}
ll query(int l,int r,int rt,int L,int R,int op){
if(L<=l&&r<=R){
if(op==1)return tree[rt];
if(op==2)return tree2[rt];
}
int mid=(l+r)>>1;
ll res=0;
pushdown(l,r,rt);
if(L<=mid)res=res+query(l,mid,rt<<1,L,R,op);
if(mid<R)res=res+query(mid+1,r,rt<<1|1,L,R,op);
return res;
}
void see(int l,int r,int rt){
if(l==r){
printf("%lld%c",tree2[rt]," \n"[r==n]);
return;
}
int mid=(l+r)>>1;
pushdown(l,r,rt);
see(l,mid,rt<<1);
see(mid+1,r,rt<<1|1);
}
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
//scanf("%d",&t);
//while(t--){
while(~scanf("%d%d",&n,&m)){
build(1,n,1);
int op;
int l,r;
ll c;
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
scanf("%d%d%lld",&l,&r,&c);
updata(1,n,1,l,r,c);
}else{
scanf("%d%d",&l,&r);
ll q1=query(1,n,1,l,r,1);
ll q2=query(1,n,1,l,r,2);
cout<<(q1*q1-q2)/2<<endl;
}
//see(1,n,1);
}
}
//}
#ifdef DEBUG
printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
//cout << "Hello world!" << endl;
return 0;
}
参考文章:
https://ac.nowcoder.com/discuss/198506?tdsourcetag=s_pcqq_aiomsg