18浙江省赛训练总结
作者:互联网
A 队友过得没看
B 队友过得没看
F 预处理前缀和+lower_bound时间空间可能都有点卡
处理下公式就能发现规律,因为向下取整不能用前缀和做,但是除数其实就30个,所以直接用sum[i][j]求出[1,i]除以j的前缀和
然后用upper_bound来求即可,注意一些细节的优化,否则会t
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 500005 #define mod 1000000000 ll n,m,p[maxn],a[maxn]; ll sum[maxn][30]; int main(){ int t; cin>>t; ll anss=0; while(t--){ cin>>n>>m; anss=0; for(int i=1;i<=n;i++)scanf("%lld",&a[i]); for(int i=1;i<=m;i++)scanf("%lld",&p[i]); sort(a+1,a+1+n); for(int j=1;j<30;j++){ sum[0][j]=0; for(int i=1;i<=n;i++) sum[i][j]=sum[i-1][j]+a[i]/j; } for(int i=1;i<=m;i++){ ll ans=0,down=1,up=p[i],pow=1; while(1){ if(a[1]>up){ pow++;down*=p[i];up*=p[i]; continue; } ll L=upper_bound(a+1,a+1+n,down)-a; ll R=upper_bound(a+1,a+1+n,up)-a-1; // R=min(R,n); ans+=sum[R][pow]-sum[L-1][pow]; pow++;down*=p[i];up*=p[i]; if(down>=a[n])break; } anss=(anss+ans*i)%mod; } cout<<anss<<endl; } }View Code
J 构造题,要求把1-n放到两个集合里,使两个集合的和相等
有个结论 n是偶数:n/2是偶数可行,n/2是奇数不可行
n是奇数:n/2是奇数可行,n/2是偶数不行
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<bitset> typedef long long ll; using namespace std; const int maxn=100200; ll n; int t; // 女生 1 2 男生 3 4 //1+3== 2+4; char sz[maxn]; //1 男生 0 女生 // n为3是 1 2放在1 3, 3放在2 4; char ans[maxn]; int main(){ scanf("%d",&t); while(t--){ scanf("%lld",&n); memset(ans,0,sizeof(ans)); scanf("%s",sz+1); if(n==1||n==2){ printf("-1\n"); continue; } ll sum=((n+1)*n)/2; if(sum%2==1){ printf("-1\n"); continue; } if(n%2==0){ if((n/2)%2==0){ for(int i=1;i<=(n/2);i++){ if(i%2==1){//奇数放在 1 3 if(sz[i]=='1') ans[i]='3'; else ans[i]='1'; if(sz[n-i+1]=='1') ans[n-i+1]='3'; else ans[n-i+1]='1'; }else{//偶数放在 2 4 if(sz[i]=='1') ans[i]='4'; else ans[i]='2'; if(sz[n-i+1]=='1') ans[n-i+1]='4'; else ans[n-i+1]='2'; } } for(int i=1;i<=n;i++) printf("%c",ans[i]); printf("\n"); }else printf("-1\n"); }else{ ll q=(n-3); if((q/2)%2==0){// 12放在13 3放在24; if(sz[1]=='1') ans[1]='3'; else ans[1]='1'; if(sz[2]=='1') ans[2]='3'; else ans[2]='1'; if(sz[3]=='1') ans[3]='4'; else ans[3]='2'; // printf("SSNSBBSBSB\n"); // printf("%d\n",3+(q/2)); for(int i=4,j=1;i<=3+(q/2);i++,j++){ // printf("%d\n",j); if(i%2==1){//奇数放在 1 3 if(sz[i]=='1') ans[i]='3'; else ans[i]='1'; if(sz[n-j+1]=='1') ans[n-j+1]='3'; else ans[n-j+1]='1'; }else{//偶数放在 2 4 if(sz[i]=='1') ans[i]='4'; else ans[i]='2'; if(sz[n-j+1]=='1') ans[n-j+1]='4'; else ans[n-j+1]='2'; } } for(int i=1;i<=n;i++) printf("%c",ans[i]); printf("\n"); }else printf("-1\n"); } } return 0; }View Code
k 分情况讨论题
情况很多,慢慢讨论。。
#include <bits/stdc++.h> using namespace std; const int N = 2e6+5; int arr[N]; template<typename T> inline void read(T&x){ x=0;int f=1;char c=getchar(); while(c<'0' || c>'9'){ if(c=='-')f=-1;c=getchar(); } while(c>='0'&& c<='9'){ x=x*10+c-'0';c=getchar(); } x*=f; } int main(){ int T;read(T); while(T--){ int n,m; read(n);read(m); int loc=-1; //memset(arr,0,sizeof(arr)); for(int i=1;i<=n;i++){ char c;cin>>c; if(c=='W'){ loc=i; }else { int pos;read(pos); if(c=='C')arr[i]=pos; else if(c=='B'){ pos+=m; arr[i]=pos; }else if(c=='D'){ arr[i]=2*m+pos; } } } arr[n+1]=3*m+1; if(n==1){ printf("%d\n",3*m);continue; } /*if(n==2){ if(loc==-1)printf("%d\n",1+3*m-n); else if(loc==1)printf("%d\n",arr[2]-1); else if(loc==2){ printf("%d\n",3*m-arr[1]+1); } continue; }*/ if(loc==-1){ if(arr[1]>arr[2])printf("1\n"); else printf("%d\n",1+3*m-n); }else{ if(loc==1){ printf("%d\n",arr[2]-1); }else if(loc==2){ //printf("%d\n",arr[3]-arr[1]); printf("%d\n",arr[loc+1]-arr[loc-1]); }else{ if(arr[1]>arr[2])printf("1\n"); else printf("%d\n",arr[loc+1]-arr[loc-1]-1); } } } }View Code
L 。二元组排序
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 105 struct Node{ string s; ll w; }p[maxn]; int n,m; int cmp(Node a,Node b){ if(a.w==b.w) return a.s<b.s; return a.w>b.w; } int main(){ int t; cin>>t; while(t--){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>p[i].s>>p[i].w; sort(p+1,p+1+n,cmp); ll ans=0; for(int i=1;i<=m;i++) ans+=(m-i+1)*p[i].w; cout<<ans; for(int i=1;i<=m;i++) cout<<" "<<p[i].s; puts(""); }return 0; }View Code
M。队友做的没看
#include <bits/stdc++.h> using namespace std; int main(){ int T;cin>>T; while(T--){ int n,b;cin>>n>>b; bool fp=false; for(int i=1;i<=n;i++){ int now;cin>>now; if((now+b)%7==0){ fp=true; } } if(fp)puts("Yes"); else puts("No"); } }View Code
D。待补
E。待补
标签:总结,loc,arr,int,18,ll,else,printf,浙江省 来源: https://www.cnblogs.com/zsben991126/p/10713440.html