台州学院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++,C++编程,Windows编程,MFC

    编程 我们日常生活中接触到的电子类产品中的应用都是由编程而来 为什么编程,偷懒 我们通过编程驱使(指挥,命令)的是电信号 为什么上面说编程是偷懒,电的发现,给人们带来了便利,人们在各个方面驱使(换成“ ...

  2. IOS UIActivityIndicatorView动画

    ● 是一个旋转进度轮,可以用来告知用户有一个操作正在进行中,一般 用initWithActivityIndicatorStyle初始化 ● 方法解析: ● - (void)startAnimating ...

  3. IOS NSKeyedArchiver(归档存取数据)

    如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...

  4. 【51nod1815】调查任务(Tarjan+拓扑)

    点此看题面 大致题意:有\(N\)个城市由\(M\)条单向道路(图不一定联通),每个城市有一个发达程度\(a[i]\),要求你求出首都\(S\)到城市\(i\)的一条路径上的两个不同城市\(x,y\) ...

  5. 在docker镜像中加入环境变量

    原文链接 前言 reference:https://vsupalov.com/docker-build-time-env-values/ 很多时候,我们需要在docker镜像中加入环境变量,本人了解的 ...

  6. angular4 学习日志(一 依赖注入)

    1.创建一个服务,为了好管理建一个名叫services的文件夹管理所有服务: ng g service services\person 2.在服务中定义一个person 类 : 3.在app.mdul ...

  7. PAT (Basic Level) Practise (中文)- 1004. 成绩排名 (20)

    http://www.patest.cn/contests/pat-b-practise/1004 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入 ...

  8. 博学谷-数据分析pandas

    import pandas as pd df=pd.read_csv() df=pd.read_sql()

  9. Windows 下编辑 hosts 文件

    hosts 文件目录: C:\WINDOWS\system32\drivers\etc\hosts hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应 ...

  10. jstl(c)标签

    一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码 ...