台州学院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. LeetCode Remove Nth Node From End of List 删除链表的倒数第n个结点

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  2. windows环境下Nginx部署及Https设置

    一.Nginx安装部署及常用命令. 1.1.其实Nginx是免安装的.直接在官网下载zip包,解压即可,下载地址:http://nginx.org/en/download.html,因为我这边的开发服 ...

  3. 为Visual Studio 2012添加MSDN离线帮助

    之前有网络的情况下,一直使用的都是在线的,最近又有笔记本上面有时使用时没有网络,所以就想使用下离线的MSDN包.可是找了半天,发现都是需要再次进行下载的.VS2012使用的帮助程序是HelpViewe ...

  4. mac上Apache修改目录浏览权限

    sudo vim /etc/apache2/httpd.conf <Directory "/Library/WebServer/Documents"> # # Poss ...

  5. C#中?和??用法

       在C#中“?”有三种用法.       1.可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空,例如:string str=null;是正确的.int i= ...

  6. UVA 12169 Disgruntled Judge(Extended_Euclid)

    用扩展欧几里德Extended_Euclid解线性模方程,思路在注释里面了. 注意数据范围不要爆int了. /********************************************* ...

  7. expect脚本中,变量的写法

    一.expect脚本中,变量的不同写法 shell脚本中定义时间变量的写法:time=`date "+%Y%m%d"` ==>>直接照搬到expect中,设置的变量是不 ...

  8. javascrit中“字符串为什么可以调用成员”

    <script> var title = "this is title"; console.log(title.substr(0,5));   //字符串为什么可以调用 ...

  9. CURLOPT_PROGRESSFUNCTION

    Author:李强(李祥祥) Date   :2012-12-15 17:26 LIBCURL官方网站都没有说清楚道明白进度函数的参数的作用,这点我感觉文档很片面,经总结如下: size_t CUpl ...

  10. C++ 限定名称查找

    限定名称查找规则实际归纳下来很简单,先对::左边的名称进行查找(遵循,限定,无限定),然后在左边查找到的(此时只查找类型名称)名字的作用域内(含内联名称空间件)查找右边出现的名字,查找到即存在(故可以 ...