Gym .101879 USP Try-outs (寒假自训第七场)
B .Aesthetics in poetry
题意:给定N个数,(N<2000 ,a[i] <=1e9),让你找一个最大的K,使得N个数膜K的余数个数全都等于N/K个。
思路:我们找到N的因子,然后验证即可,复杂度O(N^2)
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int a[maxn],N,ans=-,num[maxn];
void get(int k)
{
rep(i,,k-) num[i]=;
rep(i,,N) num[a[i]%k]++;
bool F=true;
rep(i,,k-) if(num[i]!=N/k) F=false;
if(!F) return ;
if(ans==-) ans=k;
else ans=min(ans,k);
}
int main()
{
scanf("%d",&N);
rep(i,,N) scanf("%d",&a[i]);
for(int i=;i*i<=N;i++){
if(N%i==) {
get(i);
if(i*i!=N) get(N/i);
}
}
get(N);
printf("%d\n",ans);
return ;
}
D .Maximizing Advertising
题意:给定二维平面上N个点,其中一些是w,一些是b,让你用两个不相交的矩阵把他们圈起来,一个统计w的个数,一个统计b的个数,使得和最大。
思路:其实就是用一根线把平面分成两个。 枚举分割线即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
struct node
{
int x,y,tp;
}a[maxn];
int n,X[maxn],Y[maxn],vis1[maxn],vis2[maxn],sum1,sum2;
int gao(int tp,int m)
{
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if(tp==)
{
for(int i=;i<=n;i++)
if(a[i].tp==)vis1[a[i].x]++;
else vis2[a[i].x]++;
}
else
{
for(int i=;i<=n;i++)
if(a[i].tp==)vis1[a[i].y]++;
else vis2[a[i].y]++;
}
int ans=,res1=,res2=;
for(int i=;i<=m;i++)
{
res1+=vis1[i],res2+=vis2[i];
ans=max(ans,res1+sum2-res2);
ans=max(ans,res2+sum1-res1);
}
return ans;
}
int main()
{
char c[];
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%s",&X[i],&Y[i],c);
if(c[]=='b')a[i].tp=,sum1++;
else a[i].tp=,sum2++;
a[i].x=X[i],a[i].y=Y[i];
}
sort(X+,X++n);
int sz1=unique(X+,X++n)-X-;
sort(Y+,Y++n);
int sz2=unique(Y+,Y++n)-Y-;
for(int i=;i<=n;i++)
{
a[i].x=lower_bound(X+,X++sz1,a[i].x)-X;
a[i].y=lower_bound(Y+,Y++sz2,a[i].y)-Y;
}
int ans=gao(,sz1);
ans=max(ans,gao(,sz2));
printf("%d\n",ans);
}
E .Group work
题意:给定N个人,问有多少种分组情况,满足这个组至少有两人。
思路:即C(N,2)+C(N,3)+..C(N,N); 直接暴力即可, 也可以用2^N-C(N,1)-C(N,0);
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
ll C[maxn][maxn],ans;
int main()
{
rep(i,,) C[i][i]=C[i][]=;
rep(i,,)
rep(j,,i)
C[i][j]=C[i-][j]+C[i-][j-];
int N; scanf("%d",&N);
rep(i,,N) ans+=C[N][i];
printf("%lld\n",ans);
return ;
}
G .Running a penitentiary
题意:给定N个区间[Li,Ri],然后Q次询问,每次给出a,b,问a到b这几个区间的公共长度是多少。
思路:开始还以为要主席树找区间的公共部分,但是发现既然是a到b的区间都有,那么公共部分因为的[b的最大值,a的最小值]。所以离散一下,线段树即可。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=;
int Mx[maxn],Mn[maxn];
void update1(int Now,int L,int R,int pos,int val)
{
if(L==R) { Mn[Now]=val; return ;}
int Mid=(L+R)>>;
if(pos<=Mid) update1(Now<<,L,Mid,pos,val);
else update1(Now<<|,Mid+,R,pos,val);
Mn[Now]=min(Mn[Now<<],Mn[Now<<|]);
}
int query1(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R) return Mn[Now];
int Mid=(L+R)>>,res=inf;
if(l<=Mid) res=min(res,query1(Now<<,L,Mid,l,r));
if(r>Mid) res=min(res,query1(Now<<|,Mid+,R,l,r));
return res;
}
void update2(int Now,int L,int R,int pos,int val)
{
if(L==R){ Mx[Now]=val;return ;}
int Mid=(L+R)>>;
if(pos<=Mid) update2(Now<<,L,Mid,pos,val);
else update2(Now<<|,Mid+,R,pos,val);
Mx[Now]=max(Mx[Now<<],Mx[Now<<|]);
}
int query2(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R) return Mx[Now];
int Mid=(L+R)>>,res=-inf;
if(l<=Mid) res=max(res,query2(Now<<,L,Mid,l,r));
if(r>Mid) res=max(res,query2(Now<<|,Mid+,R,l,r));
return res;
}
int main()
{
int N,M,P,L,R; char opt[];
scanf("%d%d",&N,&M);
rep(i,,N<<) Mn[i]=inf,Mx[i]=-inf;
rep(i,,N){
scanf("%d%d",&L,&R);
update1(,,N,i,R);
update2(,,N,i,L);
}
rep(i,,M){
scanf("%s",opt);
if(opt[]=='?'){
scanf("%d%d",&L,&R);
int mn=query1(,,N,L,R);
int mx=query2(,,N,L,R);
printf("%d\n",max(mn-mx+,));
}
else {
scanf("%d%d%d",&P,&L,&R);
update1(,,N,P,R);
update2(,,N,P,L);
}
}
return ;
}
J .Meme Wars
题意:字符串操作,每次F(x)=F(x-1)+'x'+F(x-1);问26次操作后,第N位是什么。(N<1000)
思路:因为N不大,所以我们保留前面N位,模拟即可。复杂度(N^2)
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
char c[maxn][maxn]; int L[maxn],N;
int main()
{
scanf("%d",&N);
c[][]='a'; L[]=;
rep(i,,) {
L[i]=L[i-];
rep(j,,L[i]) c[i][j]=c[i-][j];
if(L[i]+<=N) L[i]++,c[i][L[i]]='a'+i-;
rep(j,,L[i-]) {
if(L[i]+>N) break;
c[i][++L[i]]=c[i][j];
}
}
printf("%c\n",c[][N]);
return ;
}
H .Wine Production
题意:给定N个数,Q次询问,每次询问一个区间最大的x,满足至少x个不同的数出现了x次。(N,Q<3e4)
思路:跑莫队,然后记录每个数的个数。 问题是是莫队之后怎么维护这个答案。 我们用num[i]表示i出现的次数,cnt[i]表示出现次数为i的个数。 这样很难维护到有效信息,因为每次求答案的时候还是得x=1,=2..一个一个验证。 转化一下,cnt[i]表示出现次数大于等于i的个数,就可以莫队的时候直接转移答案了。 比如我加入一个数fcy, 那么num[fcy]++; cnt[num[fcy]]++;(而不用去cnt[num[fcy]-1]--;)因为出现次数大于等于num[fcy]-1的个数没变。 而加入fcy时,答案ans可能不变,可能变成了ans++变为了, cnt[num[fcy]]; 减去一个数fcy时也一样,ans可能不变,可能--; 想象成一个栈,如果操作中间,那么每次得重新维护这个栈。 而只操作栈顶,那么有效信息最多改变1,方便我们去维护。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=;
int a[maxn],b[maxn],cnt[maxn],num[maxn];
int ans[maxn],tot,B,res;
struct qust{
int l,r,id;
bool friend operator<(qust w,qust v){
if(w.r/B==v.r/B) return w.l<v.l;
return w.r<v.r;
}
}q[maxn];
void add(int x,int tp)
{
if(tp==-){ cnt[num[x]]--; num[x]+=tp; if(cnt[res]<res) res--;}
else { num[x]+=tp;cnt[num[x]]++;if(cnt[num[x]]>=num[x]) res=max(res,num[x]);}
}
int main()
{
int N,M;
scanf("%d%d",&N,&M); B=;
rep(i,,N) scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+N+); tot=unique(b+,b+N+)-(b+);
rep(i,,N) a[i]=lower_bound(b+,b+tot+,a[i])-b;
rep(i,,M) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+,q+M+);
int L=,R=;
rep(i,,M){
while(L<q[i].l) add(a[L++],-);
while(L>q[i].l) add(a[--L],);
while(R>q[i].r) add(a[R--],-);
while(R<q[i].r) add(a[++R],);
ans[q[i].id]=res;
}
rep(i,,M) printf("%d\n",ans[i]);
return ;
}
I .A story about tea
题意:三个港口ABC,开始N条船在A港口一次排列,要全部到B去,而且满足船后入后出,现在让你走K步,把船全部弄到C港口,而且排列顺序和开始一样,输出方案。
思路:就是一个汉诺塔,汉诺塔的步数是2^N-1;多余的我们可以瞎走。
by许
#include<bits/stdc++.h>
using namespace std;
int cnt=,all,res;
void move2(int a,int b,int c)
{
if(!res)printf("%c %c\n",a,c);
else
{
printf("%c %c\n",a,b);
res--;
move2(b,a,c);
}
}
void move(int k,char a,char b,char c)
{
if(!k)return;
move(k-,a,c,b);
cnt++;
if(cnt==all)
{
move2(a,b,c);
return;
}
printf("%c %c\n",a,c);
move(k-,b,a,c);
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
if(k<(<<n)-)puts("N");
else
{
puts("Y");
all=(<<n)-;
res=k-all;
move(n,'A','B','C');
}
return ;
}
Gym .101879 USP Try-outs (寒假自训第七场)的更多相关文章
- Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)
昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发. 题目还是满漂亮的. 尚有几题待补. C .Complete Naebbirac's sequence 题意:给定N个数,他们在1到K ...
- Gym 101655:2013Pacific Northwest Regional Contest(寒假自训第13场)
A .Assignments 题意:给定距离D,以及N个飞机的速度Vi,单位时间耗油量Fi,总油量Ci.问有多少飞机可以到达目的地. 思路:即问多少飞机满足(Ci/Fi)*Vi>=D ---- ...
- Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)
学习了“叙利亚”这个单词:比较温和的一场:几何的板子eps太小了,坑了几发. A .Hello SCPC 2018! 题意:给定一个排列,问它是否满足,前面4个是有序的,而且前面4个比后面的都小. 思 ...
- Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)
C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...
- Gym -102007 :Benelux Algorithm Programming Contest (BAPC 18) (寒假自训第5场)
A .A Prize No One Can Win 题意:给定N,S,你要从N个数中选最多是数,使得任意两个之和不大于S. 思路:排序,然后贪心的选即可. #include<bits/stdc+ ...
- Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)
这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...
- Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)
A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...
- Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)
B .Counting Inversion 题意:给定L,R,求这个区间的逆序对数之和.(L,R<1e15) 思路:一看这个范围就知道是数位DP. 只是维护的东西稍微多一点,需要记录后面的各种数 ...
- Gym-101673 :East Central North America Regional Contest (ECNA 2017)(寒假自训第8场)
A .Abstract Art 题意:求多个多边形的面积并. 思路:模板题. #include<bits/stdc++.h> using namespace std; typedef lo ...
随机推荐
- Intellij下Jquery中文乱码
今天在用Jquery+Ajax实现检查用户名是否可用的功能时,意外的发生了乱码,谷歌了很久后终于找到了解决办法: 把js文件复制一份在桌面 用记事本打开,另存为UTF-8格式 复制粘贴回去,覆盖之前的 ...
- Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY
用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. 第一步:检查extens ...
- 关于scratch导出的flash画质很差的问题解决方案
Scratch的分辨率是480*360,因此把scratch文件转变为flash时,因影像和画质很差,把flash插入到ppt幻灯片后,影像和画质仍然得不到保证.经过不断摸索,这个问题终于得到解决,关 ...
- 分布式锁与实现(一)基于Redis实现
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可用性( ...
- Date和Timestamp区别
主要是精度问题,date没有ms,而timestamp是有ms的,所以date的精度要低于timestamp. 而且二者可以互相转换. 除此之外,没有什么不同,
- hustoj 管理员和后台设置
之前用过hustoj 的livecd版本,觉得有一些小问题,所以从头到尾搭建.主要包含的过程包括: 安装ubuntu系统 搭建hustoj 管理员和后台资源建设 本文介绍如何在搭建好hustoj的基础 ...
- xshell无法在小键盘输入数字
自从很久之前用小键盘输入数字后出现奇怪的字母并换行后就不用小键盘,今天脑抽又用小键盘写数字,并决定解决问题. 原因分析: 当xshell终端类型不是"VT220"或者"A ...
- 升级pip10.0.0后出现ModuleNotFoundError: No module named 'pip'的问题
pip10升级后各种pip install出错----- Traceback (most recent call last): File "/usr/local/bin/pip", ...
- Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制?
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- system v ipc的标识符ID
system v ipc对象是靠标识符ID来识别和操作的,具有系统唯一性.意思就是说,该ID是操作系统内的全局变量,只要具有权限,任何进程都可以通过标识符进行进程间的通信.获取标识符ID的函数为int ...