gym101532 2017 JUST Programming Contest 4.0
台州学院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的更多相关文章
- 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_{ ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- gym101343 2017 JUST Programming Contest 2.0
A.On The Way to Lucky Plaza (数论)题意:m个店 每个店可以买一个小球的概率为p 求恰好在第m个店买到k个小球的概率 题解:求在前m-1个店买k-1个球再*p ...
- 2017 JUST Programming Contest 2.0
B. So You Think You Can Count? 设dp[i]表示以i为结尾的方案数,每个位置最多往前扫10位 #include<bits/stdc++.h> using na ...
随机推荐
- 关于前端的交互 ajax
对于交互来说,可以利用原生的javascript和jquery 这篇说的就是jquery 1 不是跨域的 利用$ajax({})这个函数实现的 $.ajax({ url: "", ...
- Extjs4.1+desktop+SSH2 搭建环境 项目能跑起来
linux开发感觉可能就是日常办公的时候,用别的软件会有问题,java开发还是没什么区别的,换回window开发: push 它: 每次看到右上那红红的叉,我还以为又出错了: 这个项目用resin,下 ...
- JavaScript模块化开发的那些事
模块化开发在编程开发中是一个非常重要的概念,一个优秀的模块化项目的后期维护成本可以大大降低.本文主要介绍了JavaScript模块化开发的那些事,文中通过一个小故事比较直观地阐述了模块化开发的过程. ...
- Oracle开发›如何取出每个分组的第一条记
<ignore_js_op> 截屏图片 (2).jpg (43.34 KB, 下载次数: 21) 下载附件 2012-11-7 12:36 上传 如何取出每个分组的第一条记录(黄色背景 ...
- hdu-3790 最短路径问题---dijkstra两重权值
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到 ...
- 关于mongodb的日志
mongodb的日志与profile相似,在启动mongod时 可以用verbose这个参数配置他的日志详细程度,分为一个v到5个v,其中v越多,详细度越高 mogod.conf port = d ...
- Java环境变量搭建(Linux环境)
1. 下载解压JDK压缩包 例如:解压到 /opt/jdk1.7.0_80 下 2. 添加环境变量到 /etc/profile 文件中 vi /etc/profile 在文件末尾追加如下内容: exp ...
- 操作DOM -------JavaScrip
本文摘要:http://www.liaoxuefeng.com/ 经常用到. 由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记 ...
- EasyUI获取正在编辑状态行的索引
function getRowIndex(target){ var tr = $(target).closest("tr.datagrid-row"); return paseIn ...
- Windows10系统下查看mysql的端口号并修改
mysql的端口号默认是3306,初学者可能有时会忘记或者之前修改了默认的端口号,忘记了,或者很多时候我们一台电脑需要安装两个mysql或者想设置一个自己的喜欢的数字,那么接下来我们来看看如何查看或者 ...