赛时过了5个题(1,2,4,5 ,11),写一下过了的题
1.按题意模拟,双指针
//#pragma GCC optimize(2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back
int const mod=1e9+7;
int const B=507;
//int const mod=998244353;
//int const base=131,mod=2e9+11;
int const N=2e5+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;
int n,m,q,k;
int x,y,z;
int a[N];
string s,t;
vector<int>g[N];
void solve(){
getline(cin,s);
getline(cin,t);
n=s.size(); m=t.size();
for(int i=0,j=0;i<n;i++){
if(s[i]==t[j]){
j++;
if(j==m){
cout<<"Lucky!";
return;
}
}
}
cout<<"QAQ Unlucky!";
}
void init(){
}
int main()
{
//std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//init();
int T=1;
//cin>>T;
//scanf("%d",&T);
for(int i=1;i<=T;i++){
solve();
}
return 0;
}
2.要保证字典序最小,用堆跑拓扑排序,比赛中没看懂题目意思,做了巨长的时间
//#pragma GCC optimize(2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back
int const mod=1e9+7;
int const B=507;
//int const mod=998244353;
//int const base=131,mod=2e9+11;
int const N=2e5+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;
int n,m,q,k;
int x,y,z;
vector<int>g[N];
LL w[N];
int inD[N];
struct Node{
int u;
LL w;
bool operator<(const Node &o)const{
return u<o.u;
}
};
void solve(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
g[x].pb(y);
inD[y]++;
}
priority_queue<int,vector<int>,greater<int>>q;
for(int i=1;i<=n;i++){
if(inD[i]==0){
q.push(i);
}
}
vector<int>res;
vector<Node>ans;
while(q.size()){
int x=q.top(); q.pop();
res.pb(x);
if(g[x].empty()){
ans.pb({x,w[x]});
}
for(int y:g[x]){
w[y]+=w[x];
if(--inD[y]==0){
q.push(y);
}
}
}
for(int i=0;i<n;i++) printf("%d ",res[i]);
printf("\n");
sort(all(ans));
for(auto &p:ans) printf("%lld ",p.w);
printf("\n");
}
void init(){
}
int main()
{
//std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//init();
int T=1;
//cin>>T;
//scanf("%d",&T);
for(int i=1;i<=T;i++){
solve();
}
return 0;
}
4.先用并查集,将必须分在一组的合并在一起,在跑背包,背包会tle,用bitset(压位过了),赛时交了10多发才过
//#pragma GCC optimize(2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back
int const mod=1e9+7;
int const B=507;
//int const mod=998244353;
//int const base=131,mod=2e9+11;
int const N=2.5e5+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;
int n,m,q,k;
int x,y,z;
int a[N],cnt[N];
int fa[N];
int find(int x){
return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
void solve(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
cnt[i]=1;
fa[i]=i;
}
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
int px=find(x),py=find(y);
if(px==py) continue;
fa[py]=px;
cnt[px]+=cnt[py];
}
vector<int>v;
for(int i=1;i<=n;i++)
if(i==find(i)) v.pb(cnt[i]);
sort(all(v));
int m=n/2;
bitset<N/2>f;
f[0]=1;
for(int i=v.size()-1;i>=0;i--){
int x=v[i];
f|=f<<x;
if(f[m]){
cout<<1LL*m*(n-m);
return;
}
}
for(int j=m;j>=0;j--){
if(f[j]){
cout<<1LL*j*(n-j);
return;
}
}
}
void init(){
}
int main()
{
//std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//init();
int T=1;
//cin>>T;
//scanf("%d",&T);
for(int i=1;i<=T;i++){
solve();
}
return 0;
}
5.一个数的因数之和=(1+p1+p1*p1+p1*p1*p1...)+(1+p2+p2*p2...)
首先我们可以发现那个a数组很小,最大为100,那么对于每一个质数,建权值线段树,也就是主席树,转化为单点修改区间查询,利用上面的公式预处理质数,质数的(1+p1+p1*p1+p1*p1*p1...),在利用主席树维护每一个质数区间内出现的次数
//#pragma GCC optimize(2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
#define fi first
#define se second
#define all(ss) ss.begin(),ss.end()
#define pb push_back
int const mod=1e9+7;
int const B=507;
//int const mod=998244353;
//int const base=131,mod=2e9+11;
int const N=1e5+7,M=N*20;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;
int n,m,q,k;
int x,y,z;
int a[N];
int ls[M],rs[M],sum[M];
int root[101],tot;
bool vis[N];
vector<int>p;
int f[30][N*10];
void modify(int &u,int l,int r,int p,int v){
if(!u) u=++tot;
if(l==r){sum[u]+=v; return;}
int mid=(l+r)>>1;
if(mid>=p) modify(ls[u],l,mid,p,v);
else modify(rs[u],mid+1,r,p,v);
sum[u]=sum[ls[u]]+sum[rs[u]];
}
int query(int u,int l,int r,int x,int y){
if(x<=l&&r<=y) return sum[u];
int mid=(l+r)>>1;
int res=0;
if(mid>=x) res=query(ls[u],l,mid,x,y);
if(y>mid) res+=query(rs[u],mid+1,r,x,y);
return res;
}
void solve(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
int k=a[i];
for(int x:p){
if(k%x==0){
int v=0;
while(k%x==0) k/=x,v++;
modify(root[x],1,n,i,v);
}
}
if(k>1) modify(root[k],1,n,i,1);
}
for(int i=0;i<(int)p.size();i++){
f[i][0]=1;
LL t=1;
for(int j=1;j<N*10;j++){
t=(t*p[i]+1)%mod;
f[i][j]=t;
}
}
scanf("%d",&m);
while(m--){
int opt,l,r;
scanf("%d%d%d",&opt,&l,&r);
if(opt==1){
LL ans=1;
for(int i=0;i<(int)p.size();i++){
int x=p[i];
if(sum[root[x]]==0) continue;
LL t=query(root[x],1,n,l,r);
ans=ans*f[i][t]%mod;
}
printf("%lld\n",ans);
}
else{
int k=a[l];
for(int x:p){
if(k%x==0){
int v=0;
while(k%x==0) k/=x,v++;
modify(root[x],1,n,l,-v);
}
}
if(k>1) modify(root[k],1,n,l,-1);
k=a[l]=r;
for(int x:p){
if(k%x==0){
int v=0;
while(k%x==0) k/=x,v++;
modify(root[x],1,n,l,v);
}
}
if(k>1) modify(root[k],1,n,l,1);
}
}
}
void init(){
for(int i=2;i<=100;i++){
if(!vis[i]) p.pb(i);
for(int j=0;j<(int)p.size()&&p[j]*i<=100;j++){
vis[i*p[j]]=true;
if(i%p[j]==0) break;
}
}
}
int main()
{
//std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
init();
int T=1;
//cin>>T;
//scanf("%d",&T);
for(int i=1;i<=T;i++){
solve();
}
return 0;
}
11.也是一个模拟题,不过也要稍微优先一下,不然会tle
//#pragma GCC optimize(2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back
int const mod=1e9+7;
int const B=507;
//int const mod=998244353;
//int const base=131,mod=2e9+11;
int const N=1e6+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;
int n,m,q,k;
PII a[N],b[N];
void solve(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d%d",&a[i].fi,&a[i].se);
for(int i=0;i<m;i++) scanf("%d%d",&b[i].fi,&b[i].se);
for(int i=0,j=0;;){
int w1=b[j].se,w2=a[i].se;
int mi=min((a[i].fi+w1-1)/w1,(b[j].fi+w2-1)/w2);
a[i].fi-=mi*w1;
b[j].fi-=mi*w2;
if(a[i].fi<=0) i++;
if(b[j].fi<=0) j++;
// if(a[i].fi-w1<=0){
// i++;
// }
// else a[i].fi-=w1;
// if(b[j].fi-w2<=0){
// j++;
// }
// else b[j].fi-=w2;
if(i==n&&m==j){
cout<<"Fine";
return;
}
else if(i==n){
cout<<"QAQ";
return;
}
else if(j==m){
cout<<"Win";
return;
}
}
}
void init(){
}
int main()
{
//std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//init();
int T=1;
//cin>>T;
//scanf("%d",&T);
for(int i=1;i<=T;i++){
solve();
}
return 0;