台州学院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. c++输入

    1. char c = getchar(); 输入单个字符,可输入空格.换行符. 2. cin >> s; 不读取空格或换行符. 3. getline(cin, s); 输入一行到字符串s ...

  2. linux 命令——9 touch (转)

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a    ...

  3. IOS 线程描述

    ●什么是线程 ● 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) ● 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 ● 比如使用酷狗播放音乐.使用迅雷下载电影, ...

  4. Oracle开发›如何取出每个分组的第一条记

    <ignore_js_op> 截屏图片 (2).jpg (43.34 KB, 下载次数: 21) 下载附件 2012-11-7 12:36 上传   如何取出每个分组的第一条记录(黄色背景 ...

  5. 【BZOJ2002】[HNOI2010] 弹飞绵羊(大力分块)

    点此看题面 大致题意: 有\(n\)个弹力装置,当到达第\(i\)个装置时,会被弹到第\(i+k_i\)个装置,若不存在第\(i+k_i\)个装置,就会被弹飞.有两种操作,一种操作是将\(k_x\)改 ...

  6. 管理员必备的几个Linux系统监控工具

    需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧.大多数Linux发行版本都装备了大量的监控工具.这些工具提供了能用作取得相关信息和系统活动的量度指标.你能使用这些工具发现造成性 ...

  7. SOA架构,dubbo,Zookeeper

    1. 分析 由于项目是基于soa的架构,表现层和服务层是不同的工程.所以要实现查询需要两个系统之间进行通信. 如何实现远程通信? 1.Webservice:效率不高基于soap协议.项目中不推荐使用. ...

  8. java常用 开源

    http://sourceforge.nethttp://code.google.com/hosting/http://www.open-open.com/code/tags/Javahttp://w ...

  9. Nginx 配置支持 WAF

    WAF(Web Application Firewall),中文名叫做“Web应用防火墙” WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...

  10. spring MVC体系结构和请求控制器

    MVC处理过程 spring MVC架构模式都进行了分层设计如下 数据访问接口:DAO层 处理业务逻辑层:service层 数据实体:POJO 负责前端请求的接受并处理:servlet 负责前端页面展 ...