集训队日常训练20180525-DIV1
A.2805
N*M的图,每次浇水(X1,Y1)-(X2,Y2)围成的矩形,问最后有多少点被浇水了。
暴力。
#include<bits/stdc++.h>
using namespace std; bool g[][];
int main()
{
int X,Y,I;
cin>>X>>Y>>I;
while(I--)
{
int X1,Y1,X2,Y2;
cin>>X1>>Y1>>X2>>Y2;
for(int i=X1;i<=X2;i++)
for(int j=Y1;j<=Y2;j++)
g[i][j]=;
}
int ans=;
for(int i=;i<=X;i++)
for(int j=;j<=Y;j++)
ans+=g[i][j];
printf("%d",ans);
return ;
}
A.cpp
这个题数据可以出到N,M<=5000,复杂度O(n^2)。做法二维差分约束。
B.2366
公司每月盈利s,亏损d,连续5个月一次报表都为亏损,问一年最多可以盈利多少。
构造题。
如果d>4*s,那么ssssdssssdss,每连续5个月都为亏
如果d>3/2*s,那么sssddsssddss。
如果d>2/3*s,那么ssdddssdddss。
如果d>1/4*s,那么sddddsddddsd。
否则dddddddddddd。
#include<bits/stdc++.h>
using namespace std; #define ll __int64
int main()
{
ll s,d,val;
while(cin>>s>>d)
{
///+s -d
if(d>*s)val=*s-*d;
else if(d>1.5*s)val=*s-*d;
else if(d>./*s)val=*s-*d;
else if(d>0.25*s)val=*s-*d;
else val=;
if(val>)cout<<val<<endl;
else cout<<"Deficit"<<endl;
}
return ;
}
B.cpp
C.2282
给若干个关系,a比b重,问那些珠子不可能是中值。
弗洛伊德Floyd,g[i][j]=1代表i比j重,f[i][j]=1代表i比j轻。
由于数据的问题,会出现环路比如1比2重,2比3重,3比1重。
#include<bits/stdc++.h>
using namespace std; int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int g[][]={},f[][]={};
for(int i=;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u][v]=;
f[v][u]=;
}
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
g[i][j]|=g[i][k]&g[k][j],
f[i][j]|=f[i][k]&f[k][j];
int ans=;
for(int i=;i<=n;i++)
{
int suml=,sumr=;
for(int j=;j<=n;j++)
{
if(i==j)continue;
if(g[i][j])suml++;
if(f[i][j])sumr++;
}
if(suml>=(n+)/||sumr>=(n+)/)ans++;
}
cout<<ans<<endl;
}
return ;
}
C.cpp
D.4427
N个孩子,M种颜色,a[i]代表i颜色的大理石数目,小孩只喜欢相同颜色的大理石。小孩的嫉妒值为给一个孩子的最大大理石数量。如何分,嫉妒值最小,输出最小的嫉妒值。
二分嫉妒值,看人数是否能达到n。
#include <bits/stdc++.h>
using namespace std;
int a[],n,m;
bool check(int x)
{
int ans=;
for(int i=;i<m;i++)
ans+=(a[i]+x-)/x;
return ans>n;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
scanf("%d",&a[i]);
int l=,r=1e9,ans=-;
while(l<=r)
{
int mid=(l+r)>>;
if(!check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
return ;
}
D.cpp
E.3573
N个项目D[i]代表D[i]分钟完成,V[i]代表价值,每分钟只能做一个项目,问M分钟内做出的最大价值。
贪心+优先队列。
首先按D排序从小到大,D相同按V从大到小排序。
如果a[i].d>qu.size()&&qu.size()<m说明有空可以放,直接放入。
否则如果a[i].v>优先队列最小的v,就换掉。
最后统计优先队列里所有v的和。
#include<bits/stdc++.h>
using namespace std;
struct T
{
int d,v;
bool operator<(const T &t)const{
return d<t.d||(d==t.d&&v>t.v);
}
}a[];
priority_queue<int,vector<int>,greater<int> >qu;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=;i<n;i++)
scanf("%d%d",&a[i].d,&a[i].v);
sort(a,a+n);
for(int i=;i<n;i++)
{
if(a[i].d>qu.size()&&qu.size()<m) qu.push(a[i].v);
else
{
if(!qu.empty()&&a[i].v>qu.top())
qu.pop(),qu.push(a[i].v);
}
}
int ans=;
while(!qu.empty())
ans+=qu.top(),qu.pop();
printf("%d\n",ans);
}
return ;
}
E.cpp
F.2283
N个数,每次取连续K个,取不相交的三段,问最大和。
dp[i][j]代表当前点i取了j次的最大和。
需要用前缀和优化dp(快速算出[i,j]的和)。
dp[i][j]=max(max(dp[i][j],dp[i-1][j]),dp[i-k][j-1]+pre[i]-pre[i-k]);
#include <bits/stdc++.h>
using namespace std;
const int N=;
int dp[N][],pre[N];
int main()
{
int T,n,k;
scanf("%d",&T);
while(T--)
{
memset(dp,,sizeof dp);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&pre[i]),pre[i]+=pre[i-];
scanf("%d",&k);
for(int i=k;i<=n;i++)
for(int j=;j<=;j++)
{
if(j) dp[i][j]=max(dp[i][j],dp[i-k][j-]+pre[i]-pre[i-k]);
dp[i][j]=max(dp[i][j],dp[i-][j]);
}
printf("%d\n",dp[n][]);
}
return ;
}
F.cpp
G.2586
N盏灯,初始都为灭。对于0操作,[L,R]取反。对于1操作,输出[L,R]亮灯的数量。
线段树区间取反+区间求和。
#include<bits/stdc++.h>
using namespace std; const int N=1e5+;
int cnt[N<<];
int lazy[N<<];
void pushdown(int l,int r,int rt)
{
if(!lazy[rt])return;
lazy[rt<<]^=;
lazy[rt<<|]^=;
int mid=(l+r)>>;
cnt[rt<<]=mid-l+-cnt[rt<<];
cnt[rt<<|]=r-mid-cnt[rt<<|];
lazy[rt]=;
}
void update(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lazy[rt]^=;
cnt[rt]=r-l+-cnt[rt];
return;
}
int mid=(l+r)>>;
pushdown(l,r,rt);
if(L<=mid)update(L,R,l,mid,rt<<);
if(R>mid)update(L,R,mid+,r,rt<<|);
cnt[rt]=cnt[rt<<]+cnt[rt<<|];
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return cnt[rt];
int mid=(l+r)>>,ans=;
pushdown(l,r,rt);
if(L<=mid)ans+=query(L,R,l,mid,rt<<);
if(R>mid)ans+=query(L,R,mid+,r,rt<<|);
cnt[rt]=cnt[rt<<]+cnt[rt<<|];
return ans;
}
int main()
{
int n,m,op,l,r;
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d",&op,&l,&r);
if(op==)update(l,r,,n,);
else printf("%d\n",query(l,r,,n,));
}
return ;
}
G.cpp
H.2593
N个二进制数,Q个查询。对于每个查询s,输出满足条件前min(len[i],s)个数都相同的数的个数(i是q的前缀或者q是i的前缀)。
由于读入过大,建议使用快读。
字典树,sum[rt]表示字典树节点编号rt是多少个串的结尾,ss[rt]表示字典树节点编号rt是多少个串的非结尾。
每次查询,如果查询串未到结尾就是ans+=ss[rt],如果结尾就是ans+=ss[rt]+sum[rt]。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 500005
int Scan()
{
int res = , ch, flag = ;
if((ch = getchar()) == '-') flag = ;
else if(ch >= '' && ch <= '')
res = ch - '';
while((ch = getchar()) >= '' && ch <= '' )
res = res * + ch - '';
return flag ? -res : res;
}
int tot=;
int trie[maxn][],sum[maxn],ss[maxn];
bool isw[maxn]; //查询整个单词用
int num;
void insert()
{
int k;
scanf("%d",&k);
int rt=;
for(int i=;i<=k;i++)
{
int x=Scan();
if(trie[rt][x]==) trie[rt][x]=++tot;
int g=trie[rt][x];
if(i!=k) sum[g]++;
else ss[g]++;
rt=trie[rt][x];//为下个字母的插入做准备
}
}
void find()
{
int k;
scanf("%d",&k);
int rt=;
int g=;
for(int i=;i<=k;i++)
{
int x=Scan();
if(trie[rt][x]==||g==)
{
g=;
continue;
}
int tot=trie[rt][x];
if(i!=k)
num+=ss[tot];
else num+=sum[tot]+ss[tot];
rt=trie[rt][x];//为查询下个字母做准备
}
//查询整个单词时,应该return isw[rt]
}//查找
int main()
{
int n,m,k;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) insert();
for(int i=;i<=m;i++)
{
num=;
find();
printf("%d\n",num);
}
}
H.cpp
I.2616
N个数取任意个满足和是F的倍数。
背包dp,dp[i][j]表示选到前i件物品,%m的余数为j的方案数。
初始条件dp[i][x]=1。
转移:dp[i][j]+=dp[i-1][j]+dp[i-1][((j-x)%m+m)%m];
#include <bits/stdc++.h>
using namespace std;
const int MD=;
int dp[][];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
dp[][]=;
for(int i=,x;i<=n;i++)
{
scanf("%d",&x);
for(int j=;j<m;j++)
dp[i][j]=dp[i-][j];
for(int j=;j<m;j++)
dp[i][j]=(dp[i][j]+dp[i-][((j-x)%m+m)%m])%MD;
}
printf("%d\n",(dp[n][]-+MD)%MD);
return ;
}
I.cpp
J.3521
输出所有N位数且每次移除最后一个数也都是质数的数。例如7331:7331,733,73,7都是质数。
深搜。
#include<stdio.h>
int n;
int p(int a)
{
if(a==)return ;
for(int i=;i*i<=a;i++)
if(a%i==)
return ;
return ;
}
void dfs(int s,int m)
{
for(int i=;i<=;i++)
{
if(p(m*+i))
{
if(n==s)printf("%d\n",m*+i);
dfs(s+,m*+i);
}
}
}
int main()
{
scanf("%d",&n);
dfs(,);
return ;
}
J.cpp
K.2906
N*M的01矩阵,求最大全1子矩阵。
这里读入数据较大,建议使用快读。
王知昆《浅谈用极大化思想解决最大子矩阵问题》
https://www.cnblogs.com/Konjakmoyu/p/5787633.html
#include<cstdio>
#define N 2005
int n,m,i,j,ans,l[N],r[N],h[N],lmax,rmax,a[N][N];
int main(){
while(~scanf("%d%d",&n,&m)){
for(ans=,i=;i<=n;i++)for(j=;j<=m;j++)scanf("%d",&a[i][j]);
for(i=;i<=m;i++)h[i]=,l[i]=,r[i]=m;
for(i=;i<=n;i++){
for(lmax=j=;j<=m;j++)if(a[i][j]){
h[j]++;
if(lmax>l[j])l[j]=lmax;
}else h[j]=,l[j]=,r[j]=m,lmax=j+;
for(rmax=j=m;j;j--)if(a[i][j]){
if(rmax<r[j])r[j]=rmax;
if((r[j]-l[j]+)*h[j]>ans)ans=(r[j]-l[j]+)*h[j];
}else rmax=j-;
}
printf("%d\n",ans);
} }
K.cpp
集训队日常训练20180525-DIV1的更多相关文章
- 集训队日常训练20181117 DIV2
大佬们一顿操作猛如虎,拼命AC强啊 4262: 区间异或 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal ...
- 集训队日常训练20181201 C 1003 : 种类数
时间限制(普通/Java):2000MS/6000MS 内存限制:65536KByte总提交: 8 测试通过:5 描述 一共有 n个数,第 i 个数是 xi ,其中xi ...
- 集训队日常训练20181201 E 1005 : 小蝌蚪
时间限制(普通/Java):500MS/1500MS 内存限制:65536KByte总提交: 25 测试通过:5 描述 有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限 ...
- 集训队日常训练20181124 DIV2
急急忙忙要出去比赛就拉了一场有点sb的题目 5202: 网络寻路 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte总提交: 15 ...
- 集训队日常训练20181110 DIV2 题解及AC代码
4375: 孪生素数 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 324 ...
- 集训队日常训练20180525-DIV2
A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { ,a=sqrt( ...
- 集训队日常训练20180518-DIV2
A.3232 n个物品,换取要花积分,问刚好花完积分能换最大多少价值的物品. 多重背包. #include <bits/stdc++.h> using namespace std; ]; ...
- 集训队日常训练20180518-DIV1
A.3583 n根木棍是否能分成相等两堆. 背包dp,首先求和sum,如果为偶数就说明不行,否则考虑做一个sum/2大小的背包. #include<bits/stdc++.h> using ...
- 集训队日常训练20180513-DIV1
A.3132 给一个有向图,问能否从任意点出发都能进入一个环中. 深搜. #include<bits/stdc++.h> using namespace std; ; vector< ...
随机推荐
- React中的表单应用
React中的表单应用 用户在表单填入的内容,属于用户跟组件的互动,所以不能用this.props读取. var Input = React.createClass({ //初始化组件数据 getIn ...
- Javascript简单算法
1.多维数组取其所有第几个值组成新数组 例如 [[, , ], [, , ], [, , ]],我要标红的值 [[1, 3, 5], [2, 2, 2], [3, 3, 3]] let t = [[1 ...
- 19-10-29-Z
%%%ZZYY 只是因为是Z才模一下的. ZJ一下: 考试T1写了三张纸但是它死了. T2T3暴力叕写跪了. 考试一定一定不能不严密,少推两个交点是要命的啊. 就因为叕叕少开龙龙见祖宗了. 如果考试能 ...
- 服务器重启,自动重启httpd
1. 手动重启 cd http ll cd /etc/httpd/ ll service httpd restart 2. 查看服务器内存使用情况 df -h 3. 自动重启 cat /etc/i ...
- CentOS6安装docker、docker-compose、docker-enter
一.安装docker 1.查看CentOS内核版本 uname -r 2.安装Fedora的EPEL源 yum install http://ftp.riken.jp/Linux/fedora/epe ...
- jquery旋转插件rotate参数说明
具体可见:http://www.jianshu.com/p/b632a1ed6a57
- layui 表格点击图片放大
表格 ,cols: [[ //表头 {checkbox: true,fixed: true} ,{type: 'numbers', title: 'ID', sort: true,width:80} ...
- scope标签笔记
scope的几个属性详解: 1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖.打包的时候通常需要包含进去. 2.test: ...
- Lucene 评分机制二 Payload
这里使用的Lucene4.7.0和Lucene3.X稍有不同 有下面三段内容,我想对船一系列的搜索进行加分 bike car jeep truck bus boat train car ship bo ...
- watch、tail联合使用
因为用了tmux,不想调整窗格大小,只想输出命令结果的最后几行,所以就想出了这个方法. watch.tail联合用法 watch 'echo "`nvidia-smi`" | ta ...