牛客练习赛49
Problem A?筱瑪愛地理
https://ac.nowcoder.com/acm/contest/946/A
題意:
題解:逆元+排序
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=200000+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; struct node{int v,e;bool operator<(const node &S)const{return (double)e/v>(double)S.e/S.v;} }G[N]; ll POW(ll a,ll b=MOD-2,ll c=MOD){ll res=1;ll base=a%c;while(b){if(b&1)res=(res*base)%c;base=(base*base)%c;b>>=1;}return res; } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&G[i].v,&G[i].e);sort(G+1,G+n+1);for(int i=1;i<=n;i++)cout<<G[i].e*POW(G[i].v)%MOD<<endl;#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem B?筱瑪愛閱讀
https://ac.nowcoder.com/acm/contest/946/B
題意:
題解:
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=100+10; const int M=600000+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 f[1<<15],c[20]; int g[1<<15],sz[1<<15]; int main() { #ifdef DEBUGfreopen("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",&c[i]);sum+=c[i];}sort(c+1,c+n+1);for(int i=1;i<=m;++i) {int s=0;scanf("%d",&k);for(int i=1;i<=k;++i)scanf("%d",&p),s|=(1<<(p-1));g[s]=1;}for(int i=1;i<(1<<n);++i) sz[i]=sz[(i-1)&i]+1;for(int i=0;i<(1<<n);++i) {int s=((1<<n)-1)^i;for(int j=s;j;j=(j-1)&s) if(g[j]) {f[i|j]=max(f[i|j],f[i]+c[sz[i]+1]);}}printf("%d\n",sum-f[(1<<n)-1]);//}#ifdef DEBUGprintf("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/946/C
題意:
題解:
C++版本一
?
Problem D?筱瑪愛線段樹
https://ac.nowcoder.com/acm/contest/946/D
題意:第一種操作對[l,r]區間內每幢房子塞入一個皮卡丘; 第二種操作對第l次到第r次的操作重復一遍。
題解:可以 O(n)維護兩個差分數組,一個是針對重復操作的差分數組,一個是針對當前房子塞入皮卡丘的個數的差分數組。對第二個差分數組的每次修改的大小是當前操作重復操作次數。 因為每一次第二種操作總是針對之前的操作,所以要倒著跑一遍。 最后對針對當前房子塞入皮卡丘的個數的差分數組求個前綴和就好了。
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; ll a[N],pre[N]; char str; struct node{int l,r,op; }e[N]; int main() { #ifdef DEBUGfreopen("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(~scanf("%d%d",&n,&m)){memset(pre,0,sizeof(pre));memset(a,0,sizeof(a));pre[m+1]++;pre[0]--;for(int i=1;i<=m;i++){scanf("%d%d%d",&e[i].op,&e[i].l,&e[i].r);}for(int i=m;i>=1;i--){pre[i]=(pre[i]+pre[i+1])%MOD;if(e[i].op!=1){pre[e[i].r]=(pre[e[i].r]+pre[i])%MOD;pre[e[i].l-1]=(pre[e[i].l-1]-pre[i]+MOD)%MOD;}else{a[e[i].l]=(a[e[i].l]+pre[i])%MOD;a[e[i].r+1]=(a[e[i].r+1]-pre[i]+MOD)%MOD;//cout<<e[i].l<<" "<<e[i].r<<" "<<pre[i]<<endl;}}for(int i=1;i<=n;i++){a[i]=(a[i]+a[i-1])%MOD;}for(int i=1;i<=n;i++){printf("%lld%c",a[i]," \n"[i==n]);}}#ifdef DEBUGprintf("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/946/E
題意:
首先,桌面上一共有nn個數。
兩個人輪流從桌面上取走一個數,并把這個數放入集合中。
如果在某次操作結束后,集合中存在一個異或和為00的非空子集,那么進行這次操作的人輸。
如果全部取完,則最后操作的人贏。
題解:線性基
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; ll a[N]; char str; struct node{}; struct Linear_Basis{ll d[63],p[63],tot;void init(){tot=0;memset(d,0,sizeof(d));memset(p,0,sizeof(p));}bool ins(ll x){for(int i=62;i>=0;i--)if (x&(1ll<<i)){if (!d[i]) {d[i]=x;break;}x^=d[i];}return x>0;} } LB; int main() { #ifdef DEBUGfreopen("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",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){if(LB.ins(a[i]))ans++;}cout<<(ans&1?"First":"Second")<<endl;//}#ifdef DEBUGprintf("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/946/F
題意:
題解:
C++版本一
?
?
總結
- 上一篇: CG CTF CRYPTO 异性相吸
- 下一篇: CTF(Capture The Flag