学长日常出丧题虐人 100+90+64=254/300

T1.数据结构

题目大意:给定n个数,每次给出x和y,询问一个区间内多少数模x等y。(n,询问次数,数字大小<=40000)

思路:用差分或者说是前缀和的思想,离线处理每个询问,我们从左到右把数字加入某种能查询模x等y的数据结构中,碰到询问区间左端点时让该询问的答案减去当前数据结构中模x等y的个数,碰到右端点时再加上这个个数。那么如何维护这个数据结构呢?可以分类讨论,对于x<=200,我们用数组f1[i][j]存下模i等j的值的个数,每次O(200)暴力修改,O(1)查询,对于x>200,我们用f2[i]存下值为i的个数,每次O(1)修改,查询的时候我们枚举y,x+y,2x+y……复杂度最大为O(40000/200=200)。总复杂度O(200(n+q))。

#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{int x;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=(x<<3)+(x<<1)+c-'0';return x;
}
#define MN 40000
#define K 200
struct query{int p,x,y,i,f;}p[MN*2+5];
bool cmp(query a,query b){return a.p==b.p?a.f<b.f:a.p<b.p;}
int a[MN+5],ans[MN+5],f[K+5][K+5],ff[MN+5];
int cal(int x,int y)
{if(x<=K)return f[x][y];int i,r=0;for(i=y;i<=MN;i+=x)r+=ff[i];return r;
}
int main()
{freopen("datastructure.in","r",stdin);freopen("datastructure.out","w",stdout);int n,q,i,j,k,l,r,x,y;n=read();q=read();for(i=1;i<=n;++i)a[i]=read();for(i=0;i<q;++i){l=read();r=read();x=read();y=read();p[i<<1]=(query){l,x,y,i,-1};p[i<<1|1]=(query){r,x,y,i,1};}sort(p,p+(q<<1),cmp);for(i=1,j=0;i<=n;++i){for(;p[j].p==i&&p[j].f<0;++j)ans[p[j].i]-=cal(p[j].x,p[j].y);for(k=1;k<=K;++k)++f[k][a[i]%k];++ff[a[i]];for(;p[j].p==i;++j)ans[p[j].i]+=cal(p[j].x,p[j].y);}for(i=0;i<q;++i)printf("%d\n",ans[i]);fclose(stdin);fclose(stdout);return 0;
}

T2.刷水

题目大意:n道题,第i道在xi时出现,每道题开始难度为0,之后每秒增加wi,总共可以做k次题,问做完所有题的最小难度和。(n,k<=5000)

思路:容易想到用f[i][j]表示做i次做完前j道的最小难度和,则f[i][j]=min(f[i-1][p]+Σwl*(xj-xl)) (p<l<j),随便斜率优化就可以了,复杂度O(nk),我突然脑抽没想出来,打了决策单调性,多个log,本机测极限数据2.3s,时限3s,就放心交了,结果因为迷之原因被卡常了两个点(评测机配置与本机相同),拿到包自己测了下A了,玄学。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
inline int read()
{int x;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=(x<<3)+(x<<1)+c-'0';return x;
}
#define MN 5000
#define INF (1LL<<60)
ll f[MN+5][MN+5];
int x[MN+5],w[MN+5],q[MN+5],ql,qr,t[MN+5];
int cal(int k,int n,int x,int y)
{int l=x+1,r=n,mid,res=n+1;while(l<=r){mid=l+r>>1;if(f[k][x]+f[mid][x]>f[k][y]+f[mid][y])l=mid+1;else res=mid,r=mid-1;}return res;
}
int main()
{freopen("easyproblem.in","r",stdin);freopen("easyproblem.out","w",stdout);int n,k,i,j,l;n=read();k=read();if(k>=n)return 0*puts("0");for(i=1;i<=n;++i)x[i]=read(),w[i]=read();for(i=1;i<=n;++i)for(j=i;j--;)f[i][j]=f[i][j+1]+1LL*w[j+1]*(x[i]-x[j+1]);for(i=1;i<=n;++i)f[0][i]=INF;if(n<=300)for(l=1;l<=k;++l)for(i=l;i<=n;++i)for(f[l][i]=INF,j=l-1;j<i;++j)f[l][i]=min(f[l][i],f[l-1][j]+f[i][j]);elsefor(l=1;l<=k;++l)for(ql=0,qr=-1,i=l;i<=n;++i){while(ql<qr&&(t[qr]=cal(l-1,n,i-1,q[qr]))<=t[qr-1])--qr;if(ql==qr)t[qr]=cal(l-1,n,i-1,q[qr]);q[++qr]=i-1;while(ql<qr&&t[ql]<=i)++ql;f[l][i]=f[l-1][q[ql]]+f[i][q[ql]];}cout<<f[k][n];fclose(stdin);fclose(stdout);return 0;
}

T3.你的三角形已如风中残烛

题目大意:题名很劲爆,题意是这样的:给定一张n个点的无向图,选出若干个点,使得由这些点组成的三角形个数与选的点个数比值最大,输出方案。(n<=50)

思路:我写的小数据暴搜,大数据自己构造几个比较优而且好找的解取最优输出,得分64。

#include<cstdio>
#include<cstdlib>
inline int read()
{int x;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=(x<<3)+(x<<1)+c-'0';return x;
}
#define MN 50
int n,g[MN+5][MN+5],a[MN+5],an,u[MN+5];
int px[MN*MN+5],py[MN*MN+5],cnt;
double ans;
void dfs(int x,int k,int s)
{int i;if(x>n){if((k?(double)s/k:0)>=ans){ans=k?(double)s/k:0;for(an=0,i=1;i<=n;++i)if(u[i])a[++an]=i;}return;}u[x]=0;dfs(x+1,k,s);for(i=1;i<=cnt;++i)if(g[x][px[i]]&&g[x][py[i]])++s;for(i=1;i<x;++i)if(u[i]&&g[x][i])px[++cnt]=i,py[cnt]=x;u[x]=1;dfs(x+1,k+1,s);for(i=1;i<x;++i)if(u[i]&&g[x][i])--cnt;
}
void cal()
{int i,j,s=0,k=0;for(cnt=0,i=1;i<=n;++i)if(u[i]){++k;for(j=1;j<=cnt;++j)if(g[i][px[j]]&&g[i][py[j]])++s;for(j=1;j<i;++j)if(u[j]&&g[i][j])px[++cnt]=i,py[cnt]=j;}if((k?(double)s/k:0)>ans){ans=k?(double)s/k:0;an=0;for(i=1;i<=n;++i)if(u[i])a[++an]=i;}
}
void sb()
{int i,j,k,l;for(i=1;i<=n;++i)u[i]=1;cal();for(i=1;i<=n;++i)u[i]=0,cal(),u[i]=1;for(i=1;i<=1000;++i,cal())for(j=1;j<=n;++j)u[j]=rand()&1;for(i=1;i<=n;++i)for(j=i+1;j<=n;++j)for(k=j+1;k<=n;++k)if(g[i][j]&&g[j][k]&&g[k][i]){for(l=1;l<=n;++l)u[l]=0;u[i]=u[j]=u[k]=1;cal();}for(i=1;i<=n;++i)for(j=i+1;j<=n;++j)for(k=j+1;k<=n;++k)for(l=k+1;l<=n;++l)if(g[i][j]&&g[i][k]&&g[i][l]&&g[j][k]&&g[j][l]&&g[k][l]){for(int p=1;p<=n;++p)u[p]=0;u[i]=u[j]=u[k]=u[l]=1;cal();}
}
int main()
{srand(23333);freopen("triangle.in","r",stdin);freopen("triangle.out","w",stdout);int i,j;n=read();for(i=1;i<=n;++i)for(j=1;j<=n;++j)g[i][j]=read();if(n<=20)dfs(1,0,0);else sb();printf("%d\n",an);for(i=1;i<=an;++i)printf("%d ",a[i]);fclose(stdin);fclose(stdout);return 0;
}

View Code

正解:二分答案后最大流,每个三角形建一个点,向T连1,组成该三角形的三个点向它连INF,每次S向点连二分出的答案,则若三角形连向T的边均满流则当前二分答案偏大,否则偏小。二分出答案后删掉所有从S开始只走还有流量的边能到的点,剩下的点即为方案。复杂度O(MaxFlow(n^3,n^3))。

#include<cstdio>
#include<cmath>
#include<cstring>
inline int read()
{int x;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=(x<<3)+(x<<1)+c-'0';return x;
}
#define MN 50
#define MV 19650
#define ME 78450
#define S MV+1
#define T MV+2
#define eps 1e-6
#define INF 1e6
struct edge{int nx,t;double w;}e[ME*2+5];
int g[MN+5][MN+5],h[MV+5],en=1,q[MV+5],qn,d[MV+5],c[MV+5];
inline void ins(int x,int y,double w)
{e[++en]=(edge){h[x],y,w};h[x]=en;e[++en]=(edge){h[y],x,0};h[y]=en;
}
bool bfs()
{int i,j;memset(d,0,sizeof(d));for(d[q[i=qn=0]=S]=1;i<=qn;++i)for(j=c[q[i]]=h[q[i]];j;j=e[j].nx)if(e[j].w>eps&&!d[e[j].t])d[q[++qn]=e[j].t]=d[q[i]]+1;return d[T];
}
double dfs(int x,double r)
{if(x==T)return r;double k,u=0;for(int&i=c[x];i;i=e[i].nx)if(e[i].w>eps&&d[e[i].t]==d[x]+1){k=dfs(e[i].t,r-u<e[i].w?r-u:e[i].w);u+=k;e[i].w-=k;e[i^1].w+=k;if(fabs(u-r)<eps)return u;}return d[x]=0,u;
}
void dfs(int x)
{d[x]=1;for(int i=h[x];i;i=e[i].nx)if(!d[e[i].t]&&e[i].w>eps)dfs(e[i].t);
}
int main()
{int n=read(),i,j,k,cnt=n;double l,r,mid,ans;for(i=1;i<=n;++i)ins(S,i,0);for(i=1;i<=n;++i)for(j=1;j<=n;++j)g[i][j]=read();for(i=1;i<=n;++i)for(j=1;j<i;++j)for(k=1;k<j;++k)if(g[i][j]&&g[j][k]&&g[k][i])ins(++cnt,T,1),ins(i,cnt,1),ins(j,cnt,1),ins(k,cnt,1);for(l=0,r=400,k=0;k<=50;++k){mid=(l+r)/2;for(i=h[S];i;i=e[i].nx)e[i].w=mid,e[i^1].w=0;memset(d,0,sizeof(d));for(d[q[i=qn=0]=S]=1;i<=qn;++i)for(j=h[q[i]];j;j=e[j].nx){if(!d[e[j].t])d[q[++qn]=e[j].t]=d[q[i]]+1;if(d[e[j].t]>d[q[i]])e[j].w+=e[j^1].w,e[j^1].w=0;}for(ans=0;bfs();)ans+=dfs(S,INF);for(i=h[T];i;i=e[i].nx)if(e[i].w>eps&&e[i].w<1-eps)break;(i?l:r)=mid;}memset(d,cnt=0,sizeof(d));dfs(S);for(i=1;i<=n;++i)if(!d[i])++cnt;printf("%d\n",cnt);for(i=1;i<=n;++i)if(!d[i])printf("%d ",i);
}

转载于:https://www.cnblogs.com/ditoly/p/20170323C.html

2017-3-23校内训练相关推荐

  1. 校内训练赛题解第三篇

    校内训练赛题解 人气估值 解题思路 脑力训练计划 (模拟 + 字符串) 解题思路 大暑赛期(贪心 + 思维) 人气估值 题目描述 你是某动画制作公司的企划部长.如今动画制作公司制作的东西,已经不仅仅局 ...

  2. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  3. MxCAD5.2 2017.2.23更新

    MxCAD5.2 2017.2.23更新 [2017-03-07 22:24:55] 下载地址: MxCAD软件安装包(64位): http://www.mxcad.net/MxCADx64Setup ...

  4. 成都市等市、州2009年《工程量清单计价定额》人工费调整批复〔2017〕23

    四川省建设工程造价管理总站 川建价发[2017]23号 四川省建设工程造价管理总站 关于对成都市等12个市.州 2009年<四川省建设工程工程量清单计价定额> 人工费调整的批复 各有关市. ...

  5. 2017第23届河北(石家庄)国际医疗器械展览会会刊(参展商名录)

    2017第23届河北(石家庄)国际医疗器械展览会会刊(参展商名录) 展会名称: 2017第23届河北(石家庄)国际医疗器械展览会 所属展馆: 石家庄国际博览中心 开展时间: 2017-03-02 至 ...

  6. [2017.3.23]Miller-Rabin

    水了一下Miller-Rabin 代码巨水无比--虽然有一定概率出错,但小于0.01(测5组) logn测试素数,很优秀 codevs素数判定2 http://codevs.cn/problem/17 ...

  7. 读书·2017(23本)

    书名                                作者                   出版社                            完成时间 1.<人类简 ...

  8. 2017第23届 中国(北京)国际墙纸墙布窗帘暨家居软装饰博览会会刊(参展商名录)

    2017第二十三届 中国(北京)国际墙纸墙布窗帘暨家居软装饰博览会会刊(参展商名录) 展会名称: 2017年第23届中国(北京)国际墙纸布艺地毯软装饰展览会 所属展馆: 中国国际展览中心(新馆) 开展 ...

  9. 19_05_01校内训练[划分]

    题意 给出长度为n的序列,只有1,0,-1.要求将其划分为若干长度在[L,R]之间的连续序列,一个序列若和大于0,造成1的贡献:若小于0,造成-1的贡献:否则没有贡献.求最大的贡献. 时间复杂度要求n ...

  10. 20170910校内训练

    CCT 最近学校又发了n本五三题霸,BBS看到后十分高兴.但是,当他把五三拿到手后才发现,他已经刷过这些书了!他又认真地看了一会儿,发现新发的这些五三是2017版的,而他刷的是2016版的.现在他想找 ...

最新文章

  1. linux服务器加固的命令,Linux 服务器安全加固
  2. ETL工具Kettle使用
  3. Python 函数缓存 (Function caching)
  4. 获取固件加载基地址的几种方法
  5. B端产品如何寻找竞品?
  6. 课程目标 线程 java 1615387415
  7. mac下配置进行c和matlab混编
  8. DB2 exception: Cannot create PoolableConnectionFactory SQLCODE=-142
  9. Oracle中使用批处理文件批量建表
  10. 学校家教服务管理系统mysql_数据库课程设计报告-学校家教服务管理系统.doc
  11. 桌面美化 Python tkinter倒计时工具
  12. 基于yolov3 v4 v5的电梯轿厢下的电动车目标检测
  13. automation服务器不能创建对象问题解决
  14. 2022机器学习好网站大收藏
  15. CDN加速的四大解决方案
  16. 北大青鸟ACCP一期云题库难题总结
  17. 【转】2014 IT公司校招应届生待遇大揭秘
  18. 解决bug 起止时间相同 搜索不到相关数据
  19. 奥利给!有了这么豪横的指南,还愁不会逛 GitHub?!
  20. (附源码)计算机毕业设计ssm爱音乐网站

热门文章

  1. java 将base64字符串转换成图片
  2. 解决Error: ENOENT: no such file or directory, scandir ‘xxx\node-sass\vendor‘
  3. MyBatis中resultType返回值类型介绍
  4. [译] Vue: scoped 样式与 CSS Module 对比
  5. 【SSH框架】之Spring系列(一)
  6. linux命令逻辑运算:与、或、非、异或
  7. java设计模式学习 ----- 单例模式(Singleton)
  8. 五款热门Android手机性能测试 Nexus S大胜
  9. insert时调用本身字段_多线程编程时,7件你必须知道的事情
  10. Spring-beans-BeanDefinitionReader