台州学院ICPC赛前训练5

人生第一次ak,而且ak得还蛮快的,感谢队友带我飞

A 直接用claris的模板啊,他模板确实比较强大,其实就是因为更新的很快

#include<bits/stdc++.h>
using namespace std;
int fun(int x,int y)
{
return x&y;
}
const int N=1e5+;
int n,a[N],l[N],v[N];
int main()
{
ios::sync_with_stdio(),cin.tie(),cout.tie();
int T;
cin>>T;
while(T--)
{
cin>>n;
for(int i=; i<=n; i++)cin>>a[i];
long long ans=;
for(int i=,j; i<=n; i++)
for(v[i]=a[i],j=l[i]=i; j; j=l[j]-)
{
v[j]=fun(v[j],a[i]);
while(l[j]>&&fun(a[i],v[l[j]-])==fun(a[i],v[j]))l[j]=l[l[j]-];
ans+=v[j]*1LL*(j-l[j]+);
}
cout<<ans<<"\n";
}
return ;
}

B按照题意写就好了

#include<bits/stdc++.h>
using namespace std; int a[];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,tian=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==-)tian++;
}
if(tian==n)
{
a[]=;
printf("%d",a[]);
for(int i=;i<=n;i++)
{
a[i]=(a[i-]+)%m;
printf(" %d",a[i]);
}
printf("\n");
continue;
}
for(int i=;i<=n;i++)
{
if(a[i]!=-)
{
for(int j=i+;j<=n;j++)
{
if(a[j]==-)
{
a[j]=(a[j-]+)%m;
}
else
break;
}
}
}
for(int i=;i<=n;i++)
{
if(a[i]!=-)
{
for(int j=i-;j>=;j--)
{
if(a[j]==-)
a[j]=(a[j+]-+m)%m;
}
}
}
printf("%d",a[]);
for(int i=;i<=n;i++)
printf(" %d",a[i]);
printf("\n");
}
return ;
}

C队友貌似写了很久的感觉,用了二分

#include <bits/stdc++.h>
using namespace std;
const int MD=1e9+;
int a[],b[],n;
int calc(int x)
{
int l=,r=n-,ans=-;
while(l<=r)
{
int mid=(l+r)>>;
if(b[mid]<=x) ans=mid,l=mid+;
else r=mid-;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
map<int,int> ma;
scanf("%d",&n);
int maxx=-,maxxx=-;
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
if(maxx<a[i]) maxxx=maxx,maxx=a[i];
else if(maxxx<a[i]) maxxx=a[i];
ma[a[i]]++;
}
sort(b,b+n);
for(int i=;i<n;i++)
{
int tmp=MD-a[i]-,ans=calc(tmp);
if(ans==-)
{
if(a[i]==maxx&&ma[maxx]==) a[i]=(a[i]+maxxx)%MD;
else a[i]=(a[i]+maxx)%MD;
}
else
{
if(b[ans]!=a[i]) a[i]=(a[i]+b[ans])%MD;
else
{
if(ans==) a[i]=(a[i]+maxx)%MD;
else a[i]=(a[i]+b[ans-])%MD;
}
}
}
for(int i=;i<n;i++)
printf("%d%c",a[i],i==n-?'\n':' ');
}
return ;
}

D就是分循环节,要找到左端点和右端点

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
char s[N];
int pre[N][],lst[N][];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,q;
scanf("%d%d",&n,&q);
getchar();
scanf("%s",s+);
for(int i=;i<=n;i++)
for(int j=;j<;j++)
pre[i][j]=pre[i-][j]+(s[i]-'a'==j);
for(int j=;j<;j++)
lst[n][j]=(s[n]-'a'==j);
for(int i=n-;i>;i--)
for(int j=;j<;j++)
lst[i][j]=lst[i+][j]+(s[i]-'a'==j);
while(q--)
{
int l,r;
char c;
scanf("%d%d %c",&l,&r,&c);
long long L=l/n*n,R=r/n*n;
if(L<l)L+=n;
//cout<<L<<" "<<R<<"\n";
long long ans=;
ans=(R-L)/n*1LL*pre[n][c-'a'];
ans+=lst[l%n==?n:l%n][c-'a'];
ans+=pre[r%n][c-'a'];
cout<<ans<<"\n";
}
}
return ;
}

E折半搜索,写的很爽,这个主要是这个复杂度大大降低

#include <bits/stdc++.h>
using namespace std;
const int MD=1e9+;
unordered_map<int,int>M;
int po(int a,int x)
{
int ans=;
for(;x;a=a*1LL*a%MD,x>>=)if(x&)ans=ans*1LL*a%MD;
return ans;
}
int a[][];
int n,k;
long long ans;
void dfs(int now,int tot,int lst,int sta)
{
if(tot==lst)
{
if(sta)M[now]++;
else
{
int t=k*1LL*po(now,MD-)%MD;
if(M.count(t))ans+=M[t];
}
return;
}
for(int i=;i<;i++)dfs(now*1LL*a[tot][i]%MD,tot+,lst,sta);
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>k;
for(int i=;i<n;i++)for(int j=;j<;j++)cin>>a[i][j];
M.clear(),ans=;
dfs(,,n/,);
dfs(,n/,n,);
cout<<ans<<"\n";
}
return ;
}

F暴力判断下回文,然后ST表二分就好了。注意是两个字符串之间,所以l和r要swap

#include<bits/stdc++.h>
using namespace std; const int maxn=1e4+; int cnt[maxn],n,q;
string s[maxn]; const int level=; struct ST{
int Max[maxn][level];
int build(){
for(int i=;i<=n;i++)Max[i][]=cnt[i];
for(int j=;j<level;j++)for(int i=;i+(<<(j-))<=n;i++){
Max[i][j]=max(Max[i][j-],Max[i+(<<(j-))][j-]);
}
}
int query(int l,int r){
int k=log2(r-l+1.0);
return max(Max[l][k],Max[r-(<<k)+][k]);
}
}T; inline bool check(int x,int l,int r)
{
int len=s[x].size(),mid=(l+r)/;
for(int i=l;i<=mid;i++)
if(s[x][l++]!=s[x][r--])
return false;
return true;
}
int hw(int x)
{
int len=s[x].size(),cnt=;
for(int l=;l<len;l++)
for(int r=l;r<len;r++)
if(check(x,l,r))
cnt++;
return cnt;
} unordered_map<long long,int>ma;
long long HASH(int x)
{
int len=s[x].size();
long long sum=;
for(int i=;i<len;i++)
sum=sum*+(s[x][i]-'a'+);
return sum;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(),cout.tie();
int t;
cin>>t;
while(t--)
{
ma.clear();
cin>>n>>q;
for(int i=;i<=n;i++)
{
cin>>s[i];
cnt[i]=hw(i);
//printf("%d\n",cnt[i]);
ma[HASH(i)]=i;
}
T.build();
for(int i=;i<q;i++)
{
cin>>s[n+]>>s[n+];
int l=ma[HASH(n+)],r=ma[HASH(n+)];
if(l>r)swap(l,r);
int z=l,ans=l;
int MAX=T.query(l,r);
while(l<=r)
{
int mid=(l+r)>>;
if(T.query(z,mid)==MAX)
{
ans=mid;
r=mid-;
}
else
l=mid+;
}
cout<<ans<<'\n';
}
}
return ;
}

G前缀和后缀找下最大最小值就好

#include<bits/stdc++.h>
using namespace std; const int maxn=1e6+;
int MAX[maxn],MIN[maxn],a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
MAX[]=a[];
for(int i=;i<=n;i++)
MAX[i]=max(a[i],MAX[i-]);
MIN[n]=a[n];
for(int i=n-;i>=;i--)
MIN[i]=min(a[i],MIN[i+]);
int cnt=;
for(int i=;i<n;i++)
if(a[i]>=MAX[i]&&a[i]<=MIN[i])
cnt++;
printf("%d\n",cnt);
}
return ;
}

H队友暴力了下就ok了

#include<bits/stdc++.h>
using namespace std; vector< pair<int,int> >cl;
char G[][];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%s",G[i]);
int yi=;
for(int i=;i<n-;i++)
for(int j=;j<m-;j++)
if(G[i][j]=='')
yi++;
cl.clear();
for(int i=;i<=m-;i++)
cl.push_back(make_pair(,i));
for(int i=;i<=m-;i++)
cl.push_back(make_pair(n-,i));
for(int i=;i<=n-;i++)
cl.push_back(make_pair(i,));
for(int i=;i<=n-;i++)
cl.push_back(make_pair(i,m-));
int cnt=;
for(auto x:cl)
if(G[x.first][x.second]=='')
cnt++;
if(cnt<=yi)printf("%d\n",cnt);
else printf("-1\n");
}
return ;
}

I dp队友一次过

#include <bits/stdc++.h>
using namespace std;
int a[],jump[];
int dp[];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
map<int,int> ma;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
jump[i]=-;
if(ma[a[i]]) jump[i]=ma[a[i]];
ma[a[i]]=i;
}
dp[]=-;
for(int i=;i<=n;i++)
{
dp[i]=dp[i-]+;
if(jump[i]!=-) dp[i]=min(dp[i],dp[jump[i]]+);
}
printf("%d\n",dp[n]);
}
return ;
}

J就是个dp的思想,选择这个数,不选择,构成一个新的集合

#include <bits/stdc++.h>
using namespace std;
const int MD=1e9+;
int main()
{
ios::sync_with_stdio();
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
long long t=;
for(int i=,x; i<n; i++)cin>>x,t=(t+t*x+x)%MD;
cout<<t<<"\n";
}
return ;
}

K求这个序列全排列的回文串个数,其实就是和其个数有关,只能有1个奇数,然后就是组合数,重复的除一下就好

#include <bits/stdc++.h>
using namespace std;
char s[];
int a[],fac[];
int main()
{
int T,n;
scanf("%d",&T);
fac[]=;
for(int i=;i<=;i++) fac[i]=fac[i-]*i;
while(T--)
{
memset(a,,sizeof a);
scanf("%d%s",&n,s);
for(int i=;i<n;i++)a[s[i]-'a']++;
int f=;
for(int i=;i<;i++)f+=(a[i]&),a[i]>>=;
if(f>) printf("0\n");
else
{
n/=;
int ans=fac[n];
for(int i=;i<;i++)ans/=fac[a[i]];
printf("%d\n",ans);
}
}
return ;
}

gym101532 2017 JUST Programming Contest 4.0的更多相关文章

  1. 2017 JUST Programming Contest 2.0 题解

    [题目链接] A - On The Way to Lucky Plaza 首先,$n>m$或$k>m$或$k>n$就无解. 设$p = \frac{A}{B}$,$ans = C_{ ...

  2. 2017 JUST Programming Contest 3.0 B. Linear Algebra Test

    B. Linear Algebra Test time limit per test 3.0 s memory limit per test 256 MB input standard input o ...

  3. 2017 JUST Programming Contest 3.0 I. Move Between Numbers

    I. Move Between Numbers time limit per test 2.0 s memory limit per test 256 MB input standard input ...

  4. 2017 JUST Programming Contest 3.0 D. Dice Game

    D. Dice Game time limit per test 1.0 s memory limit per test 256 MB input standard input output stan ...

  5. 2017 JUST Programming Contest 3.0 H. Eyad and Math

    H. Eyad and Math time limit per test 2.0 s memory limit per test 256 MB input standard input output ...

  6. 2017 JUST Programming Contest 3.0 K. Malek and Summer Semester

    K. Malek and Summer Semester time limit per test 1.0 s memory limit per test 256 MB input standard i ...

  7. 2017 JUST Programming Contest 3.0 E. The Architect Omar

    E. The Architect Omar time limit per test 1.0 s memory limit per test 256 MB input standard input ou ...

  8. gym101343 2017 JUST Programming Contest 2.0

    A.On The Way to Lucky Plaza  (数论)题意:m个店 每个店可以买一个小球的概率为p       求恰好在第m个店买到k个小球的概率 题解:求在前m-1个店买k-1个球再*p ...

  9. 2017 JUST Programming Contest 2.0

    B. So You Think You Can Count? 设dp[i]表示以i为结尾的方案数,每个位置最多往前扫10位 #include<bits/stdc++.h> using na ...

随机推荐

  1. cms-帖子管理

    mapper: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC & ...

  2. VMware安装win7系统

    1.创建一个虚拟机 2.配置iso映射文件   3.设置boot设置第一启动为cd   4.快速分区后重启电脑,然后选择[A]安装win7.  重启电脑后安装win7系统   搞定...  

  3. DOM编程艺术-setTimeout,"moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")"

    DOM编程艺术一个小demo,看到这里的时候不理解 "moveElement('"+elementID+"',"+final_x+","+f ...

  4. MFC-[转]基于MFC的ActiveX控件开发

    作者:lidan | 出处:博客园 | 2012/3/13 16:10:34 | 阅读22次 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC ...

  5. ASP.NET补充

    字典类的子集 using System.Collections.Generic; Dictionary<string, string> dicB = new Dictionary<s ...

  6. 基于 muse-ui 封装一个微信公众号上传插件 实现多图上传

    Vue.component('my-wx-upload', { template: ` <mu-grid-list :cols="3" :cellHeight="9 ...

  7. 牛客小白月赛5 A 无关(relationship) 【容斥原理】【数据范围处理】

    题目链接:https://www.nowcoder.com/acm/contest/135/A 题目描述 若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关.   给出一个含有k个元素的 ...

  8. 精致的系统监控工具-netdata

    今天在网上瞎逛,偶然发现一款监控工具:netdata,感到一惊,监控工具竟然可以这么漂亮! 简单了解一下,这款工具还算比较新,监控系统运行状态的功能非常强大,除了监控cpu,网卡,磁盘,内存,进程等等 ...

  9. php微信红包算法

    微信红包算法.php /**生成红包的函数*/ function getRandMoney($totalMoney, $totalPeople=2, $miniMoney=1){ $randRemai ...

  10. Codeforces Round #464 (Div. 2) A Determined Cleanup

    A. Love Triangle time limit per test1 second memory limit per test256 megabytes Problem Description ...