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 (寒假自训第七场)的更多相关文章

  1. Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)

    昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发. 题目还是满漂亮的. 尚有几题待补. C .Complete Naebbirac's sequence 题意:给定N个数,他们在1到K ...

  2. Gym 101655:2013Pacific Northwest Regional Contest(寒假自训第13场)

    A .Assignments 题意:给定距离D,以及N个飞机的速度Vi,单位时间耗油量Fi,总油量Ci.问有多少飞机可以到达目的地. 思路:即问多少飞机满足(Ci/Fi)*Vi>=D  ---- ...

  3. Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)

    学习了“叙利亚”这个单词:比较温和的一场:几何的板子eps太小了,坑了几发. A .Hello SCPC 2018! 题意:给定一个排列,问它是否满足,前面4个是有序的,而且前面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 ...

  5. Gym -102007 :Benelux Algorithm Programming Contest (BAPC 18) (寒假自训第5场)

    A .A Prize No One Can Win 题意:给定N,S,你要从N个数中选最多是数,使得任意两个之和不大于S. 思路:排序,然后贪心的选即可. #include<bits/stdc+ ...

  6. Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)

    这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...

  7. Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)

    A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...

  8. Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)

    B .Counting Inversion 题意:给定L,R,求这个区间的逆序对数之和.(L,R<1e15) 思路:一看这个范围就知道是数位DP. 只是维护的东西稍微多一点,需要记录后面的各种数 ...

  9. Gym-101673 :East Central North America Regional Contest (ECNA 2017)(寒假自训第8场)

    A .Abstract Art 题意:求多个多边形的面积并. 思路:模板题. #include<bits/stdc++.h> using namespace std; typedef lo ...

随机推荐

  1. [转]perftools查看堆外内存并解决hbase内存溢出

    最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g.感觉非常诡异.堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪: http://cod ...

  2. zabbix3.4.7触发器表达式详解

    zabbix触发器表达式详解 概述:触发器中的表达式使用很灵活,我们可以创建一个复杂的逻辑测试监控,触发器表达式形式如下: {<server>:<key>.<functi ...

  3. Android 音视频深入 五 完美的录视频(附源码下载)

    本篇项目地址,名字是录视频,求star https://github.com/979451341/Audio-and-video-learning-materials 这一次的代码录视频在各个播放器都 ...

  4. unity中自制模拟第一人称视角

    public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...

  5. HashMap与TreeMap按照key和value排序

    package com.sort; import java.util.ArrayList; import java.util.Collections; import java.util.Compara ...

  6. IO多路复用,select、poll、epoll 编程主要步骤

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. node连接myslq

    var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : ' ...

  8. gc图波峰波谷一直上升问题

    垃圾回收曲线,波峰和波谷一直上升.正常是波峰波谷在同一水平线上,可以想象如果程序继续运行下去,老年代内存回收后也不断上升,当达到老年代满了的时候,就会报内存溢出错误. 用jmap -histo pid ...

  9. softmax与多分类

    sotfmax 函数在机器学习和深度学习中有着广泛的应用, 主要用于多分类问题. softmax 函数 1. 定义 假定数组V,那么第i个元素的softmax值为 也就是该元素的指数 除以 所有元素的 ...

  10. 编程实现Linux系统的od功能

    选做题目以及分析 题目:编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 分析:我觉得这道题目中的参数应当是-tx1而不是-tx,使用了-tx后结 ...